Go언어로 JWT api-server 구현하기 2

qoxogus·2021년 3월 13일
10

Golang

목록 보기
2/2
post-thumbnail

Go언어를 사용하여 JWT구현을 해보자!

이 글은 Go언어, JWT에 어느정도 지식이 있는 분들을 대상으로 작성한 글 입니다!

저의 글에대한 피드백이나 지적은 언제나 환영입니다 😊

[구현한 Github 레포지터리 바로가기]

🔧 사용스택

  • Go (framework : gin-gonic)
  • 사용한 JWT 패키지 : [Github 바로가기]
  • DataBase : PostgreSQL
  • Develop Tool : Visual Studio Code

1. 배경

저의 개인 프로젝트로 Go언어 프레임워크 gin-gonic을 이용한 api-server개발을 계기로 인증방식을 JWT로 결정하게되어 공부하며 작성하게 된 글입니다.

2. 내가 구현한 Refresh 방식

  1. accessToken이 만료되어 클라이언트에서 refreshToken(accessToken)을 보내며 토큰 재발급요청
  2. refreshToken을 받아서 검증
  3. 검증이 완료됬다면 accessToken을 재발급해서 넘겨준다.
  4. 만약 refreshToken이 만료됬다면 다시 로그인을 하게 만든다.

그렇다면 accessToken을 한번 재발급받고 다시 한번 로그인해야 자동적으로 한번 더 재발급 받을수있게 됩니다.

3. Create refreshToken

refreshToken을 만들어보자!
refreshToken이 만들어지는 방식은 이러합니다!
사용자가 로그인 할 때 입력한 정보와 회원가입 할 때 입력한 정보를 DB에서 불러와 조회하고 비교하여 일치하다면 토큰이 생성됩니다.
코드는 이렇습니다!

library/jwt.go의 CreateRefreshToken부분입니다.

(토큰생성 중 에러가 발생할 수 있으니 에러처리를 해주도록 합시다! [필자 Github 참고])

페이로드(Payload) 클레임(Claim)에는 이름, 만료시간을 지정해줬습니다.
[Name] 이름은 DB에서 읽어온 이름을 사용했습니다.
[exp] 만료시간은 한달로 지정했습니다.

4. SetCookie

필자는 포스트맨으로 클라이언트와 협업하지않고 혼자 프로젝트를 하는 상황입니다.
그러므로 토큰을 HTTP Header에 저장하지않고 결과를 눈으로 더 확인하기 좋은 쿠키에 저장해놓겠습니다!
코드는 이러합니다😙.

refreshToken을 DB에 넣는 방법도있습니다. (이 방법은 조금 더 안전합니다.)

accessToken을 보내며 재발급 요청
-> DB에서 refreshToken을 가져와 검증.
-> 검증완료시 accessToken재발급.

쿠키의 이름 = "refresh-token"
값 = accessToken,
MaxAge = 한달 (초단위),
Path = "/" Root,
도메인은 = "localhost3000" 으로 지정해주고
Secure = false, (https에서만 쿠키를 사용할 수 있는 설정)
httpOnly = true (JavaScript가 접근을 하지 못하게하는 설정) (은)/는 true로 지정해주었습니다.

5. 쿠키에 값이 정상적으로 들어갔는지 토큰이 정상적으로 잘 생성이 됐는지 확인해보자!

Postman으로 확인한 토큰값입니다.
Postman으로 확인한 refresh-token쿠키값입니다!

6. RefreshToken Verify

사용자가 가지고있는 사용자의 토큰이 유효한지, 정보가 변질되지는 않았는지 검증해봅니다!

먼저 c.Request.Cookie로 쿠키에 저장되어있는 토큰을 가져옵니다.

그리고 쿠키의 값을 tokenstring(tknstr)으로 지정. 클레임 지정.
패키지에 있는 메서드 ParseWithClaims로 토큰 인증을 해줍니다.
Parse, ParseWithClaims의 함수 내부에서 알아서 호출하여 검증을 해줍니다!
그렇게 검증을 완료하고,

7. AccessToken을 재발급하자!


저는 만료된 accessToken을 가져와 Payload claim에 있는 정보로 accessToken을 다시 만들었습니다!
ParseWithClaims메서드를 쓸 때 accessToken은 이미 유효기간이 만료된 상태이기 때문에 변수선언 2번째 인자를 "_" (underscore)로 하여 메서드에서 호출할 때 에러를 뱉지않게 했습니다.

8. AccessToken이 재발급이 잘 됬는지 확인해보자!


재발급이 정상적으로 잘 되었네요!

9. 글을 마치며

refresh를 어떻게 구현할지 refresh를 하며 refreshToken도 같이 재발급을 해서 넘겨줄지,
리프레시 토큰을 저장하는 방식은 뭐가 있는지 등 방법이 많습니다. 그리고 accessToken을 쓸때보다 refreshToken을 사용하면 보안이 조금더 좋아지기때문에 구현해봤지만 막상 처음 접했을때는 조금 어려웠던것같았습니다. (예전 필자는 JWT를 이해하기위해 공부를 엄청 많이 했습니다. 😭)
저는 3편 (로그아웃 시 토큰처리) (으)/로 돌아오겠습니다. 😎
(🤫 3편으로 돌아오려 했지만 너무 간단하여 수정하여 적겠습니다 로그아웃 시 토큰처리는 AccessToken(cookie)를 삭제 해주시면 됩니다!)
이상으로 글을 마치도록 하겠습니다. 궁금하시거나 물어보실 점이 있으면 댓글 달아주세요!
제가 아는것을 총동원하여 도움드리겠습니다.😊
긴 글 읽어주셔서 감사합니다.

profile
광주소프트웨어마이스터고등학교 [Server Developer]

관심 있을 만한 포스트

2개의 댓글

comment-user-thumbnail
2021년 3월 13일

잘보고 갑니다!

답글 달기
comment-user-thumbnail
2021년 3월 22일

좋은 정보 감사합니다.

답글 달기