Go에서 JWT token 생성, 검증 등 을 사용할 때,
여러 라이브러리가 있는데 그 중 이것을 추천한다.
https://github.com/dgrijalva/jwt-go
사용하기도 편하고, 찾으면 자료도 많아서 편하기 때문이다.
그런데...
오래전부터 이 라이브러리를 사용했었는데 README 가 업데이트되었고,
THIS REPOSITORY IS NO LONGER MAINTANED
The new repository can be found at: https://github.com/golang-jwt/jwt
For more information, see issue #462.
이렇게 나와있네..
살펴보니 사용했던 함수들은 거의 똑같고 추가되는 것들이 있는 것 같다.
https://github.com/golang-jwt/jwt
이걸 사용하자!
Decode 하는 방법을 살펴보자.
JWT token을 decode 해서 안에 있는 정보(Payload) 들을 알 수 있다.
담는 정보의 한 파트를 클레임(claim)이라고 부르고, key , value의 한 쌍으로 이뤄져 있다.
token에는 여러 개의 claim을 넣을 수 있다.
claim은 registered, public, private 종류가 있는데
각 종류의 의미 및 claim의 종류는 다음 글에서 소개하고 이 글에서는 claim을 Go로 얻는 방법을 소개하려고 한다.
1) install & import
go get -u github.com/golang-jwt/jwt/v4
import "github.com/golang-jwt/jwt/v4"
2) header의 Authorization을 가져와야 한다.
(참고로 Gin framework를 사용했기 때문에 *gin.Context를 이용한다.
Gin을 사용하지 않으면 golang get header Authorization을 검색하면 나올 것이다.)
// c *gin.Context
jwtToken := c.GetHeader("Authorization") // type string
header의 Authorization 안에 있는 jwtToken을 받아 올 수 있다.
예를 들면 이런 식이다.
JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNjYzNjg5MTY1LCJqdGkiOiJkZjUyZTE1MGY0YmM0MWRiYTk0OTYyMjgyMzA0MjM0ZiIsInVzZXJuYW1lIjoiamlhbjE5OTBAcHVkZGxyLmNvbSJ9.vbaSMwr-wPn3hOQzcqDu12l3pN0uFcHwOKBfp8aB1mc
Bearer 가 될 수 도 있고, JWT 가 될 수 도 있는데 보통 Bearer를 많이 쓰긴 하지만 JWT 도 사용을 한다.
이건 프로젝트에서 팀원들끼리 정하면 된다. 서버 쪽에서 토큰을 생성할 때 넣어주기 때문..
func JwtDecode(jwtToken string) {
token := strings.Split(jwtToken, " ") // [JWT, eyJ0eXAiOuFcHwOKBfp8aB1mc]
if len(token) != 2 {
return
}
claims := jwt.MapClaims{} // type MapClaims map[string]interface{}
_, err := jwt.ParseWithClaims(
token[1], claims, func(token *jwt.Token) (interface{}, error) {
return []byte("YOUR_JWT_SECRET_KEY")), nil
})
// err 처리
for key, val := range claims {
fmt.Println(key, val)
}
}
Decode 함수는 이런 식으로 구현할 수 있는데
claims의 type 이 map [string] interface {}로
for loop로 key value를 찾을 수 있다.
이렇게 원하는 claim 찾을 수 있다.
'Language > Go' 카테고리의 다른 글
[Go] Convert byte slice to image (io.Reader) (0) | 2022.09.29 |
---|---|
[Go] Convert image.NRGBA to byte slice (0) | 2022.09.28 |
[Go] Contains method for a slice (go version 1.18) (0) | 2022.09.16 |
[Go] filetype (MIME type) (0) | 2022.09.16 |
[Go] get image width height (image: unknown format) (0) | 2022.09.15 |