🐾   [golang] jwt 토큰 생성 방법

golang에서 jwt 토큰 만들어 보자

생성 방법

  1. 토큰에 넣을 정보를 구조체로 만들어보자
type UserClaim struct {
Id    string `json:"id"`
Name  string `json:"name"`
Roles string `json:"roles"`
}
  1. 토큰을 넣을 구조체를 만들었다 => string으로 받아도 된다. 나는 나중에 RefreshToken도 만들 예정이어서 구조체로 만들었다.
type JwtToken struct {
AccessToken  string
}
  1. 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
}
  1. 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 해석하기

image image

토큰 해석 할 수 있는 사이트

https://jwt.io/


참조

https://github.com/dgrijalva/jwt-go

​ ​ ​