검증 코드(CAPTCHA)는 "Completely Automated Public Turing test to Tell Computers and Humans Apart"(컴퓨터와 인간을 구별하는 완전 자동화된 Turing 테스트)의 약자로 일종의 구별 사용자가 컴퓨터이거나 인간인 완전 자동화된 공개 프로그램입니다. 이는 다음을 방지할 수 있습니다: 악의적인 비밀번호 크래킹, 티켓 사기, 포럼 범람을 방지하고 해커가 특정 프로그램을 사용하여 특정 등록 사용자가 계속 로그인하도록 무차별 대입하는 것을 효과적으로 방지합니다. 실제로 확인 코드를 사용하는 것은 많은 웹사이트에서 일반적인 방법입니다. 이제 우리는 이 함수를 비교적 간단한 방법으로 구현했습니다. 이 질문은 컴퓨터에 의해 생성되고 판단될 수 있지만 이에 답할 수 있는 사람은 오직 인간뿐입니다. 컴퓨터는 CAPTCHA 질문에 답할 수 없으므로 질문에 답하는 사용자는 인간으로 간주될 수 있습니다.
전통적인 웹사이트 인증 코드 작동 메커니즘
- 클라이언트는 서버에 인증 코드 사진을 요청합니다.
- 서버는 임의의 문자열(인증 코드 값)을 생성하여 이를 세션에 쓰고, 인증 코드 값을 씁니다.
- 클라이언트가 입력한 사진의 문자열은 검증을 위해 서버에 제출됩니다
- 서버는 클라이언트가 제출한 문자열 값과 세션을 비교하여 일치하면 통과합니다. verify
서버에서 생성된 인증코드 값은 처음부터 끝까지 클라이언트에게 인증코드가 반환되지 않기 때문에 클라이언트는 사진에서만 인증코드 문자열을 식별할 수 있어 사람의 인증을 보장할 수 있습니다. -머신 검증 로직.
Go의 HTTP 인증 코드
Thoughts
Go 언어 HTTP 서버는 기본적으로 Session을 지원하지 않으므로 인증 코드 값을 다른 방식으로 저장해야 합니다. Session을 사용하지 않는 로직은 다음과 같습니다
- .
- 클라이언트는 서버에 인증코드 ID를 요청합니다
- 서버는 인증코드 ID와 인증코드 값을 생성하고, ID와 값의 매핑 관계를 메모리나 캐시에 기록하고, 그 ID를 클라이언트에 반환합니다
- 클라이언트는 반환된 ID를 기반으로 서버에 인증코드 이미지를 요청합니다
- 서버는 인증코드 ID를 획득하고, 메모리나 캐시에서 인증코드 값을 검색하여 그 값을 이미지에 기록한 후 이미지를 클라이언트에 반환합니다.
- 클라이언트는 1단계에서 획득한 인증코드 ID와 인증코드 값을 서버 검증에 제출합니다.
- 서버는 인증코드 ID를 획득하고 메모리나 캐시에서 인증코드 값을 검색하여 인증코드와 비교합니다. 클라이언트가 제출한 값
Example
- 인증 코드 종속성 설치
github.com/dchest/captcha
- 코드 구현
package main import ( "fmt" "github.com/dchest/captcha" "log" "net/http" ) func main() { // 获取验证码 ID http.HandleFunc("/captcha/generate", func(w http.ResponseWriter, r *http.Request) { id := captcha.NewLen(6) if _, err := fmt.Fprint(w, id); err != nil { log.Println("generate captcha error", err) } }) // 获取验证码图片 http.HandleFunc("/captcha/image", func(w http.ResponseWriter, r *http.Request) { id := r.URL.Query().Get("id") if id == "" { http.Error(w, "Bad Request", http.StatusBadRequest) return } w.Header().Set("Content-Type", "image/png") if err := captcha.WriteImage(w, id, 120, 80); err != nil { log.Println("show captcha error", err) } }) // 业务处理 http.HandleFunc("/login", func(w http.ResponseWriter, r *http.Request) { if err := r.ParseForm(); err != nil { log.Println("parseForm error", err) http.Error(w, "Internal Error", http.StatusInternalServerError) return } // 获取验证码 ID 和验证码值 id := r.FormValue("id") value := r.FormValue("value") // 比对提交的验证码值和内存中的验证码值 if captcha.VerifyString(id, value) { fmt.Fprint(w, "ok") } else { fmt.Fprint(w, "mismatch") } }) log.Fatal(http.ListenAndServe(":8080", nil)) }
-
Run
- /captcha/generate를 방문하여 인증 코드 ID를 받으세요
- 방문 /보안 문자 /image?id=인증코드ID
- /login에 접속하셔서 1단계 인증코드ID, 2단계 인증코드 값을 입력하시면 인증결과를 보실 수 있습니다
프로젝트 주소
https:/ /github.com/xialeistudio/go-http-captcha-example