괴발개발 성장기

Study/Go 언어

[golang] jwt 토큰 생성 방법

지니유 2022. 7. 8. 22:58
반응형

 

 

 

golang에서 jwt 토큰 만들어 보자

# 생성 방법

 

1) 토큰에 넣을 정보를 구조체로 만들어보자

type UserClaim struct {
    Id    string `json:"id"`
    Name  string `json:"name"`
    Roles string `json:"roles"`
}

2) 토큰을 넣을 구조체를 만들었다

=> string으로 받아도 된다. 나는 나중에 RefreshToken도 만들 예정이어서 구조체로 만들었다.

type JwtToken struct {
    AccessToken  string
}

3) 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
}

4) 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://jwt.io/

 

JWT.IO

JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.

jwt.io

 

 

# 참조

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

 

GitHub - dgrijalva/jwt-go: ARCHIVE - Golang implementation of JSON Web Tokens (JWT). This project is now maintained at:

ARCHIVE - Golang implementation of JSON Web Tokens (JWT). This project is now maintained at: - GitHub - dgrijalva/jwt-go: ARCHIVE - Golang implementation of JSON Web Tokens (JWT). This project is n...

github.com

 

 

 

 

반응형