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