[Spring Boot] JWT (Json Web Token)

2023. 1. 13. 20:22기술 창고/Spring

728x90
SMALL

이전에는 Spring Security에 대해 정리해보았었다.

Spring Security는 Spring 기반으로 인증, 인가와 같은 보안에 관련된 처리 작업을 자체적으로 지원해주는 보안 기능이다.

Spring Security 만을 사용하게되면 정해진 Form 형식에서 로그인 기능들을 구현할 수 밖에 없었기 때문에 제약사항이 존재했다.

따라서, 좀 더 확장성있게 개발하기 위해 Spring Security를 사용하되, 정해진 형식이 아닌 api 접근을 위해 인증 토큰을 발급하여 구현할 수 있는 JWT를 사용하여 구현해보고 싶었다.

또한, JWT 가 최근 현업에서도 가장 많이 사용되는 방식인 것도 가장 큰 사용 이유 중 하나이다.

 


JWT

인증, 인가에 필요한 정보들을 암호화시킨 JSON 토큰이다.

JWT 토큰(Access Token)을 HTTP 헤더에 실어 서버가 클라이언트를 식별하는 방식이다.

JWT는 JSON 데이터를 Base64 Encode로 인코딩하여 직렬화한 것이라고 한다.

토큰 내부에는 위변조 방지를 위한 전자서명도 들어있다.

사용자가 JWT를 서버로 전송하면 서버는 서명 검증 작업을 통해 검증이 완료가 되면 요청한 응답을 돌려준다.

(api 접근 시 동작)

 

 

 

JWT 인증 과정

(1) 클라이언트가 로그인을 통해 서버에 인증을 요청.

 

(2) 서버에서 해당 클라이언트의 인증 요청을 받고,  Header, Payload, Signature를 정의.

     Header, Payload, Signature 들을 각각 base64 로 한번 더 인코딩하여 JWT 생성, 이를 쿠키에 담아 클라이언트에 전달.

 

(3) 서버로부터 전달받은 JWT를 로컬 스토리지에 저장.

      api 요청 시, Authorization 헤더에 Access Token을 담아서 요청을 보냄.

 

(4) api 요청을 통해 전달받은 Access Token이 만료 기간이 지나지 않았는지, 유효한 토큰이 맞는지 확인한 후 유효하다면 요청 통과.

     통과되었으므로 Payload에 들어있는 유저의 정보들을 클라이언트에 돌려줌.

 

(5), (6) 만일 api 요청 시에 Access Token의 만료 시간이 지났다면, 초기에 발급받았었던 Refresh Token을 통해 Access Token 재발급

 

 

JWT 구조

JWT는 세 개의 영역으로 나뉜다.

앞서 말한 Header, 전달할 내용을 담은 Payload, 전자서명이 담긴 Signature 로 나뉜다.

각 영역은 . 기호로 구분된다.

  • Header : 서명 알고리즘, JWT 타입
  • Payload : 사용자 권한 정보, 전달 정보, 사용 정보
  • Signature : Header 와 Payload 를 Base64 로 인코딩하여 Header에 명시된 해시함수를 적용하고, 개인키로 서명한 전자서명

# Claim

- HashMap 처럼 key 와 value 형식으로 이루어진 한 쌍의 정보를 Claim이라고 한다.

 

 

JWT 장점 / 단점

[장점]

  1. Header와 Payload를 가지고 Signature를 생성하므로 데이터 위변조를 막을 수 있다.
  2. 인증 정보에 대한 별도의 저장소가 필요없다.
  3. JWT는 토큰에 대한 기본 정보와 전달할 정보 및 토큰이 검증됬음을 증명하는 서명 등 필요한 모든 정보를 자체적으로 지니고 있다.
  4. 클라이언트 인증 정보를 저장하는 세션과 다르게, 서버는 무상태(StateLess)가 되어 서버 확장성이 우수해질 수 있다.
  5. 토큰 기반으로 다른 로그인 시스템에 접근 및 권한 공유가 가능하다. (쿠키와 차이)
  6. OAuth의 경우 Facebook, Google 등 소셜 계정을 이용하여 다른 웹서비스에서도 로그인을 할 수 있다.
  7. 모바일 어플리케이션 환경에서도 잘 동작한다. (모바일은 세션 사용 불가능)

 

[단점]

  1. Self-contained : 토큰 자체에 정보를 담고 있으므로 양날의 검이 될 수 있다.
  2. 토큰 길이 : 토큰의 Payload에 3종류의 클레임을 저장하기 때문에, 정보가 많아질수록 토큰의 길이가 늘어나 네트워크에 부하를 줄 수 있다.
  3. Payload 인코딩 : payload 자체는 암호화 된 것이 아니라 BASE64로 인코딩 된 것이기 때문에, 중간에 Payload를 탈취하여 디코딩하면 데이터를 볼 수 있으므로, payload에 중요 데이터를 넣지 않아야 한다.
  4. Store Token : stateless 특징을 가지기 때문에, 토큰은 클라이언트 측에서 관리하고 저장한다. 때문에 토큰 자체를 탈취당하면 대처하기가 어렵게 된다.
728x90
반응형
LIST