더북(TheBook)

다음은 AuthHandler 미들웨어를 사용한 main 함수이다. login 경로로 GET 요청이 들어오면 로그인 페이지를 렌더링한다. login 경로로 POST 요청이 들어오면 아이디와 패스워드를 확인한다. 아이디와 패스워드가 일치하면 쿠키에 인증 토큰 값을 기록하고, 아이디와 패스워드가 일치하지 않으면 다시 로그인 페이지를 렌더링한다. 이때 로그인 실패 메시지를 전달하여 로그인 페이지에 로그인 실패 메시지를 보여준다.

▼ main.go

func main() {
    s := NewServer()
 
    /* … */
 
s.HandleFunc(“GET”, ”/login”, func(c *Context) { // “login.html” 렌더링 c.RenderTemplate(”/public/login.html”, map[string]interface{}{“message”: “로그인이 필요합니다”}) }) s.HandleFunc(“POST”, ”/login”, func(c *Context) { // 로그인 정보를 확인하여 쿠키에 인증 토큰 값 기록 if CheckLogin(c.Params[“username”].(string), c.Params[“password”].(string)) { http.SetCookie(c.ResponseWriter, &http.Cookie{ Name: “X_AUTH”, Value: Sign(VerifyMessage), Path: ”/”, }) c.Redirect(”/”) } // id와 password가 맞지 않으면 다시 “/login” 페이지 렌더링 c.RenderTemplate(”/public/login.html”, map[string]interface{}{“message”: “id 또는 password가 일치하지 않습니다”})
})
s.Use(AuthHandler)
s.Run(“:8080”) } func CheckLogin(username, password string) bool { // 로그인 처리 const ( USERNAME = “tester” PASSWORD = “12345” )
return username == USERNAME && password == PASSWORD } // 인증 토큰 생성 func Sign(message string) string { secretKey := []byte(“golang-book-secret-key2”) if len(secretKey) == 0 { return ”” } mac := hmac.New(sha1.New, secretKey) io.WriteString(mac, message) return hex.EncodeToString(mac.Sum(nil)) }

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.