JWT

JWT란?

  • JSON 객체로 안전하게 정보를 전송하기 위한 방식
  • 디지털 서명이 되어있기 때문에 안전하다.

JWT 구조

JWT는 Header, Payload, Signature 3가지를 점으로 구분하여  xxxx.yyyy.zzzz 구조를 가지고 있다.

Header와 Payload는 base64로 인코딩 되어있고, signature는 Header, Payload, Secret key를 HS256 방식으로 암호화한 다음 base64로 인코딩 되어있다.

 

Header: 알고리즘, 타입 => "HS256으로 암호화 한 JWT이다"라는 정보가 들어있다.

Payload: 정보 => name, userId 등등

Signature: [헤더, 페이로드, 비밀 키]를 헤더에 있는 알고리즘으로 암호화

 

암호화

HMAC SHA256 또는 RSA 알고리즘을 이용해서 암호화를 진행한다.

 

SHA256: 해쉬 방식 -> 암호화하면 복호화가 불가능함

HMAC: secret key를 포함한 암호화 방식   

HS256: HMAC + SHA256 방식

RSA: 공개키로 암호화하고 개인키로 복화화하는 방식 

 

장점

  • 토큰을 클라이언트에서 가지고 있기 때문에 stateless하다는 장점이 있다.
  • 암호화가 잘되어있어 안전하다.

단점

  • 대부분의 요청에 사용하기 때문에 토큰의 길이가 길면 트래픽 양이 많아질 수 있다.
  • 토큰을 탈취 당했을 때 문제가 발생할 수 있다.

 

Refresh Token

토큰이 탈취됐을 때 피해를 막기 위해 access token의 만료기간을 짧게 설정하여 일정 시간이 지나면 미리 받았던 토큰을 사용할 수 없게 한다.

이렇게 했을 때 토큰 발급 요청을 너무 자주해야하는 문제가 생기기 때문에 refresh 토큰을 이용해서 access token을 재발급 하는 방법을 사용하여 해결할 수 있다. 

예를 들어 자동 로그인을 하고싶을 때 access token의 기간이 만료되어도 refresh token이 있기 때문에 다시 로그인 할 필요가 없어진다.

refresh token을 이용해서 acces token을 재발급 할 때 refresh 토큰과 access token 두 가지를 모두 재발급해서 재발급 기간을 연장시킬 수 있다.

 

토큰 탈취 예방 방법

1. DB에 Refresh 토큰을 저장해놓고, 토큰들 중 DB에 저장된 가장 최신 토큰만 접속이 가능하게 한다.

2. RTR(Refresh Token Rotation) access 토큰 재발급 시 refresh 토큰도 재발급

 

 

추가로 참고하면 좋을 사이트

https://tecoble.techcourse.co.kr/post/2021-10-20-refresh-token/

https://dkswnkk.tistory.com/684

'보안' 카테고리의 다른 글

CORS  (0) 2024.04.09
CSRF와 XSS  (1) 2024.04.09