article thumbnail image
Published 2022. 8. 21. 15:31

 

지지난 포스팅부터 이어진 로그인과정에서 사용되는 access token 과 refresh token이 어디에 어떻게 사용되고 저장되는지는 이제 파악했고 그럼 이 토큰이 어떤 형태를 갖고 있는지를 공부해 볼 차례이다. 토큰이란게 그냥 무슨 맛집 웨이팅 대기표처럼 1,2,3 이렇게 주어지는게 아니라 그 토큰안에도 어떠한 정보를 담겨있고 암호화되어있는데 이번엔 그 토큰이 암호화된 과정과 암호화된 토큰의 구조, 의미까지 찾아서 정리해보려한다.

 


JWT토큰이란?

 

 우리가 로그인한 회원에게 넘겨주는 accesstoken 과 refreshtoken은 "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"

와 같은 형태로 구성되어있다. 이게 뭔 외계어인가 싶지만 이는 JWT라는 토큰 방식으로 이 안에도 다양한 정보들이 담겨있고 실제로 이를 해석도 해볼 수 있다! Json Web Token의 약자인 JWT는 HMAC 라는 자체 알고리즘을 통해 사용자의 정보를 암호화해서 토큰화한다. 암호화라는 것은 기본적으로 해커가 알아볼 수 없게 만드는 것인데 이것을 어떻게 복호화해서 그 안의 정보를 알아볼 수 있다는 걸까? 우선 JWT의 과정을 살펴보자

 

http://www.opennaru.com/opennaru-blog/jwt-json-web-token/

 

 위 JWT Process를 보면 지지난시간에 access token을 헤더에 담아서 인가과정을 거친다고 했던 것이 4번에 해당하는 과정임을 확인할 수 있다. 여기서 access token을 JWT.io 사이트에서 복호화해서 담겨있는 데이터를 확인할 수 있는데 해당 사이트에 접속하면 아래와 같은 예시를 확인 할 수 있다.

 

https://jwt.io/

 

 인코딩할 토큰 정보를 자세히보면 . 을 기준으로 세가지의 부분으로 나뉘는 것을 볼 수 있는데 각각에서 오른쪽의 복호화된 데이터정보를 찾아낼 수 있다. 이처럼 JWT 토큰은 쉽게 복호화해서 누구나 사용자의 정보를 알아 낼 수 있으므로 중요한 데이터는 담아두면 안된다. 즉, 남들이 확인해도 딱히 사용할 수 없는 정보들 (닉네임이나 이메일정도) 만 담아서 토큰화한다. 보라색 payload에 담겨있는 정보들을 보면 Sub 와 name에 해당하는 정보들을 볼 수 있는데 이것이 서버에서 토큰에 어떤 정보들을 담을지 설정해준 값들이다. 

 

내 프로젝트에서 적용한 모습

 나는 JWT 토큰의 메인키를 id로 주고 sub를 email로 설정했기 때문에 payload에서 해당하는 값들을 담아오는 것을 확인할 수 있었다. 이를 통해서 해당 유저의 유효성을 검증 하고 이후에 인가과정도 진행할 수 있었다. 

 

왜 JWT 토큰을 사용할까?

 

 기존에 토큰을 사용하기 위해서는 해당 토큰이 유효한지 검증하기 위해서 DB에 접근해서 사용자 정보들을 검증하는 과정을 거쳐야 했다. 이는 DB에 접근해야하기 때문에 과정이 복잡해지고 저장된 정보를 찾기위한 과정을 거치기 때문에 시간이 오래걸리고 데이터낭비가 발생했다. 하지만 JWT 는 사용자 인증에 필요한 정보들을 토큰 자체에 이미 담고 있기 때문에 별도의 DB접근이 필요 없어지고 때문에 더 빠르고 효율적인 검증이 가능하게 된다. 이를 클레임기반토큰 이라고한다. 때문에 중앙 집중식 인증서버와 DB에 대한 의존성이 줄어들게 되고 빠른 르고 효율적인 인증이 가능하게 하는 JWT 방식을 선호하게 되었다.

'오늘의 공부 정리' 카테고리의 다른 글

27. CORS  (0) 2022.08.23
26. Social Login  (1) 2022.08.22
24. Cookie, Local Storage, Session Storage  (0) 2022.08.21
23. Login process  (0) 2022.08.20
22. Microservice Architecture  (0) 2022.08.17
복사했습니다!