Go언어를 사용하여 JWT구현을 해보자!
이 글은 2021년 3월에 작성된 글이며 블로그를 이전하며 옮기게 되었습니다.
이 글은 Go언어, JWT에 어느 정도 지식이 있는 분들을 대상으로 작성한 글입니다!
저의 글에 대한 피드백이나 지적은 언제나 환영입니다 😊
🔧 사용 스택
- Go (framework : gin-gonic)
- 사용한 JWT패키지 : [Github 바로가기]
- DataBase : PostgreSQL
- Develop Tool : Visual Studio Code
1. 배경
저의 개인 프로젝트로 Go언어 프레임워크 gin-gonic
을 이용한 api-server개발을 계기로 인증방식을 JWT로 결정하게 되어 공부하며 작성하게 된 글입니다.
2. Create accessToken
acessToken을 만들어보자
AccessToken이 만들어지는 과정은 이러합니다. 사용자가 로그인할 때 입력한 정보와 회원 가입할 때 입력한 정보를 DB에서 조회하고 비교하여 일치하다면 토큰이 생성된다.
코드는 이렇습니다.
(코드는 안 나와있지만 토큰이 만들어질 때 에러가 발생할 수 있으니
상황에 맞는 에러 처리도 해주자 [필자 Github참고])
페이로드(Payload) 클레임(Claim)에는 이름, 권한 여부, 만료시간을 지정해줬다.
[Name] 이름은 DB에서 읽어온 이름을 사용했다.
[IsManager] DB에 bool타입으로 저장되어있는 권한 여부 컬럼이다.
[exp] 만료시간은 1시간으로 지정했다.
library/jwt.go의 CreateAccessToken부분이다.
3. SetCookie
필자는 포스트맨으로 클라이언트와 협업하지 않고 혼자 프로젝트를 하는 상황이다.
그러므로 토큰을 HTTP Header에 저장하지 않고 결과를 더 확인하기 좋은 쿠키에 저장해놓겠다.
코드는 이러하다.
(refreshToken은 검증 부분, 토큰을 다시 생성하는 부분에서 아직 구현 중에 있습니다. 다음 편에서 다뤄보도록 하겠습니다. 😊)
쿠키의 이름 = "access-token"
값 = accessToken,
MaxAge = 1일 (초단위),
Path = "/" (Root),
도메인은 = "localhost3000"으로 지정해주고
Secure = false (https에서만 쿠키 사용 가능),
httpOnly = true (JavaScript가 접근하지 못하게 하는 설정)로 지정해주었다.
4. 쿠키에 값이 잘 들어갔는지 토큰이 잘 생성됐는지 확인해보자!
토큰은 정상적으로 잘 생성이 되었다.
쿠키도 정상적으로 잘 생성이 되었다.
5. AcessToken Verify
사용자의 토큰이 유효한지, 정보가 변질되지는 않았는지 검증해보자
(c.Get
메서드는 나중에 협업을 하게 되었을 때 HTTP Header에서 토큰 값을 가져올 때를 대비하여 추가하고 주석처리를 해 놓았다.)
먼저 c.Request.Cookie
로 쿠키에 저장되어있는 토큰을 가져온다.
그리고 쿠키의 값을 tokenstring(tknstr)
으로 지정. 클레임 지정.
패키지에 있는 메서드 ParseWithClaims
로 토큰 인증을 해준다.Parse, ParseWithClaims
의 함수 내부에서 알아서 호출하여 검증을 해준다.
(독자는 내부 함수를 자세히 들여다보지않아 이 부분에서 조금 헤맸습니다 😅😂🤣 내부 함수를 자세히 보는 습관을 기릅시다😭 😎)
6. 글을 마치며.
서버를 개발하며 가장 큰 벽 중 하나가 인증입니다. 그만큼 어렵기도, 중요하기도 한 부분입니다.
제가 많이 헤매고 어려워한 부분이기도 합니다.
블로그를 써보며 다시 공부하게 되고 개념을 한 번이라도 더 되짚어보고 공부하게 되는 좋은 경험인 것 같습니다.
저는 2편으로 돌아오겠습니다.
궁금하시거나 물어보실 점이 있으면 댓글 달아주세요.
제가 아는 것을 총동원하여 도움드리겠습니다.😊
이상으로 글을 마치도록 하겠습니다.
긴 글 읽어주셔서 감사합니다.
'Go' 카테고리의 다른 글
Go언어를 사용하여 JWT구현을 해보자! (refresh) (0) | 2022.03.25 |
---|
댓글