JWT에서 "클레임(Claim)"이라는 용어를 사용하는 이유는 토큰의 Payload에 포함된 정보가 특정한 주장(claim)을 나타내기 때문입니다. 이러한 클레임은 토큰을 발행하는 측이나 토큰을 사용하는 측에게 특정한 정보나 상태를 알려주는 역할을 합니다.
예를 들어, JWT의 클레임으로는 토큰의 발급자, 토큰의 주제, 토큰의 만료 시간 등이 있습니다. 이러한 정보들은 토큰을 검증하는 측에게 중요한 정보를 제공하며, 이를 통해 토큰의 유효성을 확인하고 필요한 권한을 부여할 수 있습니다.
따라서 클레임이라는 용어는 JWT가 담고 있는 정보가 단순히 데이터일 뿐만 아니라, 해당 정보가 특정한 정보나 상태를 나타낸다는 의미를 강조하기 위해 사용됩니다. 이는 JWT가 인증과 권한 관리 등의 목적으로 사용되는 보안 토큰이기 때문에 중요한 개념입니다.
package main
import (
"fmt"
"net/http"
"time"
"github.com/gin-gonic/gin"
"github.com/golang-jwt/jwt/v5"
)
func main() {
router := gin.Default()
router.GET("/", func(c *gin.Context) {
c.String(http.StatusOK, "Hello, World!")
})
router.POST("/log-in", LogInHandler)
router.GET("/verify", VerifyHandler)
router.Run(":8080")
}
type LogInRequest struct {
Username string `json:"username"`
Password string `json:"password"`
}
func LogInHandler(c *gin.Context) {
var req *LogInRequest
err := c.ShouldBindJSON(&req)
if err != nil {
c.String(http.StatusBadRequest, "Invalid request")
return
}
if req.Username != "semyeong" || req.Password != "1234" {
c.String(http.StatusUnauthorized, "Incorrect username or password")
return
}
token, err := CreateToken(req.Username)
if err != nil {
c.String(http.StatusInternalServerError, "CreateToken error")
return
}
c.String(http.StatusOK, token)
}
func VerifyHandler(c *gin.Context) {
tokenString := c.GetHeader("Authorization")
if tokenString == "" {
c.String(http.StatusUnauthorized, "Missing authorization header")
return
}
tokenString = tokenString[len("Bearer "):]
err := VerifyToken(tokenString)
if err != nil {
c.String(http.StatusUnauthorized, "Invalid Token")
return
}
c.String(http.StatusOK, "Valid Token!")
}
var secretKey = []byte("secret-key")
func CreateToken(username string) (string, error) {
token := jwt.NewWithClaims(jwt.SigningMethodHS256,
jwt.MapClaims{
"username": username,
"exp": time.Now().Add(time.Hour * 24).Unix(),
})
tokenString, err := token.SignedString(secretKey)
if err != nil {
return "", err
}
return tokenString, nil
}
func VerifyToken(tokenString string) error {
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
return secretKey, nil
})
if err != nil {
return err
}
if !token.Valid {
return fmt.Errorf("invalid token")
}
return nil
}
POST /log-in
GET /verify
header에 담긴 token이 유효한지 확인
reference
로그인 인증 방식
Implementing JWT Token Authentication in Golang