JWT(Json Web Token) 이란 무엇인가? - 쿠키와 세션 비교를 통해

2024. 2. 23. 02:07BACKEND/Security

글 다 썼는데.. 갑자기 사라졌다. 화가 나지만 복습 겸 다시 쓴다.. 다른 분들은 꼭 임시 저장하시길..

 

그동안 프로젝트를 하면서 로그인, 회원가입 부분을 구현하다 보면 세션 방식, JWT 방식으로 구현해보곤 했다. 구체적인 차이에 대해서 잘 몰랐으나 이번 프로젝트를 하면서 다시 공부하였고 공부한 부분을 정리해보고자 한다.

 

1. JWT(Json Web Token) 란 무엇인가?

JWT는 클라이언트와 서버 간 인증방식을 안전하게 하기 위해 이용하는 토큰이다. .(점)으로 이루어진 세 문자열로 이루어져 있다.

https://jwt.io/ 이 사이트에서 JWT 토큰 인코딩 디코딩을 해볼 수 있다.

 

세 부분은 다음과 같이 나눠진다.

Header

헤더 부분에는 토큰의 종류 (JWT), 사용된 해쉬암호화 방식 등의 메타데이터가 들어 있다.

Payload

페이로드는 토큰 내에 들아가는 클레임(Claim)의 집합이다. 클레임은 데이터 정도로 생각하면 될 것 같다. JWT는 디코딩이 몹시 쉽기 때문에 민감한 정보는 담지 않는 것이 좋다.

Signature

Header, Payload의 정보들과 서버에서 가지고 있는 secret key 의 값을 통해 헤더에서 정의한 알고리즘으로 암호화를 한다. 이때, Header, Payload의 정보 중 한글자라도 바뀌거나 secret key 값이 바뀐다면 Signature 값은 완전히 다르게 변한다. 서버에서는 이 Signature 값을 보고 우리 서버에서 발급한 토큰인지 확인 가능하다.

 

즉 JWT 는 정보 전달의 목적보다는 우리 서버에서 발급한 토큰인지 인증하는 역할이 더 크다.

2. 쿠키 vs 세션 vs jwt

JWT 작동 방식을 알기에 앞서 쿠키와 세션에 대해 살펴보자.

2-1. 쿠키 작동 방식

쿠키는 Key-Value를 가진 문자열 쌍이다. 클라이언트의 브라우저에 저장이 된다.

  1. 클라이언트가 서버에 로그인 요청
  2. 서버는 로그인 요청을 확인하고 응답 헤더에 user에 대한 정보 추가
  3. 클라이언트는 갖고 있던 쿠키를 서버에 요청을 보낼 때 헤더에 담아서 전달
  4. 해당 정보를 바탕으로 서버는 클라이언트의 사용자가 누군지 식별

단점

  1. 쿠키 안에 값이 그대로 들어 있기 때문에 보안에 취약하다.
  2. 쿠키의 용량제한이 있어 많은 정보를 담지 못한다.
  3. 쿠키가 많아질 수록 네트워크에 부하가 간다.

2-2. 세션 작동 방식

위의 쿠키의 단점을 극복하기 위해 세션 방식이 사용된다. 가장 큰 차이는 서버에 세션 DB를 두어 인증 정보를 브라우저가 아닌 서버에 둔다.

  1. 클라이언트가 서버에 로그인 요청
  2. 서버는 세션용 DB에 유저를 만들고 세션 id 값을 생성
  3. 세션 id는 쿠키를 통해 서버에서 클라이언트로 전달
  4. 클라이언트는 쿠키를 저장하고 서버에 요청을 보낼 때마다 쿠키를 통해 세션 id 전달
  5. 서버는 쿠키를 통해 받은 세션 id를 통해 사용자 식별

단점

  1. 세션 id 자체가 탈취 당하면 클라이언트 위장을 할 수가 있다.
  2. 서버에서 DB를 사용하므로 리소스가 많이 든다.

2-3. JWT 작동 방식

JWT 를 이용한 방식은 Token을 이용하기 때문에 DB를 사용하지 않는다는 큰 장점이 있다.

  1. 클라이언트가 서버에 로그인 요청
  2. 서버는 JWT 를 만들고 쿠키에 담아 클라이언트에 전달 (최초 로그인 시 Refresh Token도 같이 발급)
  3. 클라이언트는 JWT를 로컬 스토리지에 저장
  4. 클라이언트는 서버에 요청을 보낼 때마다 Header에 Access Token을 전달
  5. 서버는 클라이언트에서 보낸 토큰이 우리 서버에서 만든 것인지 확인
  6. 우리 서버에서 만든 토큰이라면 request에 맞는 응답을 보내준다.
  7. Access Token이 만료되면, 클라이언트는 Refresh Token을 보내서 새로운 Access Token을 발급받는다.

단점

  1. 서버가 Stateless 하기 때문에 토큰이 탈취되더라도 만료시간이 지날 때까지 유효하다. -> 이러한 단점을 극복하기 위해 Access Token의 만료시간을 짧게 설정하는 경우가 많다.

그렇다고 JWT만 사용하는 것은 아니다. 상황에 따라 쿠키, 세션, JWT를 모두 사용하기 때문에 세 가지 특징에 대해 서로 알고 있으면 좋을 것 같다.