🐾 [golang] jwt 토큰 생성 방법
golang에서 jwt 토큰 만들어 보자
생성 방법
- 토큰에 넣을 정보를 구조체로 만들어보자
type UserClaim struct {
Id string `json:"id"`
Name string `json:"name"`
Roles string `json:"roles"`
}
- 토큰을 넣을 구조체를 만들었다 => string으로 받아도 된다. 나는 나중에 RefreshToken도 만들 예정이어서 구조체로 만들었다.
type JwtToken struct {
AccessToken string
}
- json값을 map으로 전환해주는 함수
func (c UserClaim) ConvertMap() (map[string]interface{}, error) {
bytes, err := json.Marshal(c)
if err != nil {
return nil, err
}
var resultMap map[string]interface{}
if err := json.Unmarshal(bytes, &resultMap); err != nil {
return nil, err
}
return resultMap, nil
}
- jwt 생성하는 함수를 만든다.
func (JwtAuthentication) GenerateJwtToken(claim UserClaim) (JwtToken, error)
JwtSecret= "test" //JWT에서 서명에 안전을 위해 적절하게 설정한다
//json값을 map으로 전환 해준다 ex) map[id:11@genie.com name:유지니 roles:MEMBER]
claimMap, err := claim.ConvertMap()
if err != nil {
return JwtToken{}, err
}
accessTokenClaims := jwt.MapClaims{} //JSON 디코딩에 map[string] 인터페이스 {} 사용
for key, value := range claimMap {
accessTokenClaims[key] = value
}
//토큰 만료시간 만들어서 accessTokenClaims에 넣어준다
accessTokenClaims["exp"] = time.Now().Add(time.Minute * 15).Unix() //만료시간 15분으로 설정
//토큰 만들기
accessToken, err := jwt.NewWithClaims(jwt.SigningMethodHS256, accessTokenClaims).SignedString([]byte(JwtSecret))
if err != nil {
return JwtToken{}, err
}
return JwtToken{
AccessToken: accessToken,
}, nil
}
- claim에는 정보가 들어있다 ex) {11@genie.com 유지니 MEMBER}
- accessTokenClaims에 내 정보를 넣어 준다.
- accessTokenClaims에 만료시간을 만들어서 넣어준다. 제한시간 15분이다
- JwtSecret 값을 나는 현재 바로 위에 그냥 적었지만 환경변수에서 설정을 해준다.
- 토큰을 생성하고 그걸 JwtToken구조체에 있는 AccessToken에 넣어서 반환하면 된다.
response 값
{
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NTcyODg1NjcsImlkIjoiMTFAZ2VuaWUuY29tIiwibmFtZSI6IuycoOyngOuLiCIsInJvbGVzIjoiTUVNQkVSIn0.qARDq11ri37TF9ci8KGNiuV68_NGxSDeoDvcKdM4Pxo"
}
JWT 해석하기


토큰 해석 할 수 있는 사이트
참조
https://github.com/dgrijalva/jwt-go