본문 바로가기
Go

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

by 배털 2022. 3. 25.

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

이 글은 2021년 3월에 작성된 글이며 블로그를 이전하며 옮기게 되었습니다.

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

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

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

🔧 사용 스택

  • 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

댓글