CS 공부 & 기초 지식

[Spring Boot] JWT와 세션의 차이

Coding-Su 2024. 11. 7. 17:38
728x90

JWT란?

JWT(JSON Web Token)란 JSON으로 이루어진 Web 토큰입니다.

 

JWT의 구성요소와 특징

  • 헤더: 어떤 알고리즘으로 인코딩을 할 것인지, 어떤 토큰을 사용할 것인지에 관한 정보입니다.
  • 페이로드: 전달하고자 하는 정보가 들어갑니다.(ex. 아이디, 이름, 이메일 등), 최소한의 정보만 담아야 합니다.
  • 시그니처: 토큰이 변조되지 않았는지 확인하기 위한 부분입니다.

 

JWT의 가장 중요한 점은 JWT는 암호화가 아닌 인코더라는 점입니다.

암호화: 키가 없다면 복호화가 불가능

인코더: 키가 없더라도 복호과가 가능

따라서 JWT는 탈취당하면 다른 사람이 누구나 페이로드의 내용을 볼 수 있습니다. 

 

저희 또한 아래 홈페이지에 들어가서 JWT를 입력한다면 시그니처가 없더라도 JWT의 내용을 확인 할 수 있습니다.

https://jwt.io/

 

JWT.IO

JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.

jwt.io

 

그럼 여기서 시그니처가 왜 있는지 궁금하실 수도 있는데 시그니처는 위조되거나 변경되지 않았는지 토큰의 Header, PayLoad의 값을 비밀키로 서명한 것이 Signature에 들어가 있는 것입니다. 따라서 시그니처는 토큰이 위조, 변조 되었다는 사실을 알기 위함이지 내용을 암호화 하기 위함은 아니라는 점을 꼭 알고있어야 합니다.

 

이러한 위험성(다른 사람이 정보를 볼 수 있음)이 있는데 JWT를 사용하는 이유가 무엇일까요?

-> JWT를 사용하는 이유는 JWT토큰은 무상태성(stateless)이기 때문입니다. (서버 관점입니다.)

     따라서 상태를 저장하거나 유지할 필요가 없습니다.

 

세션이란?

세션은 유저의 정보를 모두 서버에 저장을 합니다. 세션은 현재 누가 들어와있는지 모두 저장함으로 부적합한 접근이 있다면 이를 차단하여 보안성이 높습니다.

 

하지만 세션 방식의 단점은 모든 내용을 서버에 저장하기 때문에 비용이 많이 들어갑니다.

 

만약 MSA처럼 각각 서비스가 분비된다면 세션이 매우 많이 필요하고 이 내용을 모두 DB에 저장하고, 세션을 동기화하고, 유지를 하기 위해서는 많은 비용이 발생한다는 단점이 있습니다.

이를 해결하기 위한 방법으로는 세션을 하나로 유지하는 방법이 있지만 이 방법은 로그인 할때마다 유저를 계속 확인해야 한다는 단점이 있습니다.

 

즉, 정리하자면 세션을 사용한다면 보안성이 좋지만 개발 난이도가 증가하고 비용이 많이 나온다는 점입니다.

 

 

JWT의 단점을 보안하기 위한 방법

우선 무상태성을 사용하여 신뢰하고 사용해야 합니다. 

 

보안상의 문제의 보안책

  1. 토큰의 만료시간 설정: 언제 만료가 되는지 필터에 넣어서 토큰을 만료시킵니다.
  2. 리프레시 토큰을 사용
    1. 토큰을 엑세스 토큰과 리프레시 토큰으로 구분합니다.
    2. 엑세스 토큰은 복사해서 사용하는 토큰입니다.
    3. 리스레시 토큰은 사용자 정보를 어느정도 담아둔 토큰으로 리프레시 토큰을 가지고 엑세스 토큰을 발급해줍니다.
    4. 액세스 토큰의 만료 시간을 5분 ~ 15분 사이로 주고, 리프레시 토큰은 시간을 길게 줍니다.
    5. 리프레시 토큰을 사용해서 한번만 발급을 하여 1, 2일 사용하고, 리프레시 토큰은 서버에서만 가지고 있습니다.
  3. 토큰 블랙리스트 사용
    1. 토큰을 탈취 당하면 -> 블랙리스트에 등록합니다.
    2. 특정 토큰이랑 일치하면 바로 응답 실패
    3. 비정상적인 움직임이 발행하면 블랙리스트에 등록합니다.

 

 

 

728x90