본문 바로가기

Develop/기타

Session과 JWT(Json Web Token)의 차이점 이해하기

HTTP는 웹 서버와 사용자의 인터넷 브라우저 사이에 문서를 전송하기 위해 사용되는 통신 규약이다.

가장 큰 특징 중 하나는 바로 Stateless 하다는 점이다. 따라서 이전 통신의 상태는 전혀 기억하지 않는다.

 

하지만 웹서비스에서 이전 통신 상태를 기억하지 못한다면 굉장히 불편하다.

페이지를 이동할 때마다 새롭게 로그인을 해야 한다.

 

따라서 이러한 문제를 해결하기 위한 다양한 수단이 존재한다. 예를 들어 쿠키, 세션, 토큰 등이 가장 대표적이다.

그중에서도 더욱 보편적으로 사용되는 세션과 토큰(JWT)에 대한 차이점을 이해하는 게 중요하다고 생각했다.

(그래야 상황에 따라 적절하게 사용할 수 있으니까!)

차이점 1

세션(session id)과 토큰(JWT)은 크기 차이가 많이 난다.

같은 데이터를 담고 있더라도 토큰의 크기가 훨씬 크다.

차이점 2

세션데이터베이스 서버에 저장하고, 토큰클라이언트 측에서만 저장한다.

 

따라서 세션이 상대적으로 안전한 상태를 유지하기 쉽다.

물론 여전히 공격의 위험이 존재하기 때문에 HttpOnly, Secure 등의 옵션을 주어 쿠키에 저장한다.

 

토큰은 웹 브라우저(local storage, 쿠키 등)에 저장하기 때문에 공격에 노출될 가능성이 더 크다.

따라서 민감한 정보를 담지 않는다.

또한 토큰의 유효기간을 설정하여, 토큰이 탈취당하더라도 피해를 입지 않도록 한다.

이 경우에는 별도로 refresh token을 발행하여 함께 내려준다.

차이점 3

앞서 설명했던 거처럼 세션은 데이터베이스 서버에 저장한다.

따라서 한꺼번에 사용자가 몰린다면 서버 과부하가 걸릴 수 있다.

또한 이러한 서버 부하를 분산하기 위해서 서버를 여러 대 두면 세션을 사용하기가 애매해진다.

최근 많은 서비스들은 서버 과부하 부담을 줄이기 위해 여러 서버를 두고 서비스를 운영한다.

HTTP는 stateless, connectionless 하기 때문에 request마다 접속하는 서버가 달라질 수 있다.

이때 session 정보가 없는 다른 서버에 접속할 때마다 계속 로그인해줘야 한다.

 

그렇기 때문에 '확장성'이라는 측면에서 세션보다는 토큰을 더욱 많이 사용한다.

참고)
https://developer.okta.com/blog/2017/08/17/why-jwts-suck-as-session-tokens