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

qoxogus·2021년 3월 12일
18

Golang

목록 보기
1/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. 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편으로 돌아오겠습니다👏. 이상으로 글을 마치도록 하겠습니다. 궁금하시거나 물어보실 점이 있으면 댓글 달아주세요. 제가 아는것을 총동원하여 도움드리겠습니다.😊
긴 글 읽어주셔서 감사합니다.

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

관심 있을 만한 포스트

7개의 댓글

comment-user-thumbnail
2021년 3월 12일

자세히 보는 습관을 잘 길러보도록 노력하겠습니다. 저도 Go에 관심이 많은데 공부하려면 어느 쪽으로 먼저 입문해야하나요??

1개의 답글
comment-user-thumbnail
2021년 3월 12일

👏👏

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

와 정말 유익해용

1개의 답글
comment-user-thumbnail
2021년 3월 14일

멋져요

1개의 답글