참고 링크:
https://jwt.io/introduction
https://velog.io/@jellyjw/JWT%EC%99%80-session
JWT와 Session은 둘 다 로그인을 사용할 때 사용하는 인증 방식이다.
JWT는 JSON Web Token의 줄임말로, 당사자 간 정보를 JSON 객체로 안전하게 전송하기 위한 개방형 표준이다. 디지털 서명이 되어 있기 때문에 신뢰할 수 있으며, JWT는 HMAC 알고리즘을 사용한 시크릿 키나, RSA 혹은 ECSDA를 사용한 공개/비공개 키를 사용해 서명할 수 있다.
구조:
.으로 구분되며 헤더, 페이로드, 서명 총 3부분으로 구성되어있음xxxxx.yyyyy.zzzzz
- 헤더
: 토큰의 타입과 서명 알고리즘- 페이로드
: 주장(엔티티에 대한 선언문과 추가적인 정보들을 포함) registered/public/private- 서명
: 메시지가 전송 과정에서 수정되지 않았음을 증명하기 위해 사용됨. 비공개 키를 사용하는 경우에는 JWT의 전송자가 요청을 보낸 쪽과 동일한 전송자임을 증명함
1. 애플리케이션이나 클라이언트가 인증 서버에 인증을 요청
2. 권한이 부여되면 권한 서버는 애플리케이션에 액세스 토큰을 반환
3. 애플리케이션은 액세스 토큰을 사용하여 보호된 리소스에 액세스
사용자가 성공적으로 로그인을 하면 주로 헤더의 Authorization에 담겨서 JWT가 반환된다. 해당 헤더가 존재하면 사용자는 보호된 리소스에 접근할 수 있다.
인증에 사용하는 토큰으로는 SWT(Simple Web Tokens), SAML(Security Assertion Markup Language Tokens) 등 다른 Token들도 존재하는데, 그 중에서도 두드러지는 JWT의 이점은 다음과 같다.
- JSON 형식을 사용하기 때문에 인코딩시 크기가 작아, html이나 http 환경에서 전달이 용이하다.
- JSON 파서는 객체에 직접 매칭되기 때문에, 다양한 프로그래밍 언어와 호환성이 좋아 작업이 간단해진다.
- 모바일에서 웹 토큰 클라이언트의 처리가 용이하다.
![]()
세션은 웹 애플리케이션에서 클라이언트와 서버 간의 상태 정보를 유지하는 데 사용되는 인증 방식이다. 세션은 클라이언트가 서버에 연결할 때 시작되고, 클라이언트와 서버 간의 일련의 상호 작용 동안 유지된다.
일반적으로 세션은 고유한 세션 식별자(Session ID)를 사용하여 관리한다. 클라이언트가 서버에 요청을 보낼 때 이 세션 식별자를 함께 전송하여, 서버가 해당 세션에 대한 상태 정보를 식별할 수 있게 된다.
1. 클라이언트가 서버에 요청을 보낸다.
2. 서버가 세션을 생성하고, 고유한 세션 식별자 (session DI)를 부여한다. (세션이 이미 존재하면, 서버는 이 세션 ID를 사용해 세션을 가져온다)
3. 서버가 요청을 실행하고, (필요할 경우에는 세션 데이터를 업데이트) 클라이언트에 보낼 응답에 세션 ID를 함께 담아 전송한다.
4. 이후로 보내는 요청들에 클라이언트는 session ID를 함께 전송하고, 서버는 일치하는 세션 ID를 찾아 응답한다.
5. 세션이 만료되거나 종료될 때까지 반복된다.
세션은 서버에 저장되기 때문에 유저 수가 많아질 수록 서버에 부하가 걸릴 수 있다.
또, 세션 ID의 안전한 전송 및 유효 기간 관리 등에도 신경써야 한다. 이를 전송할 때는 주로 쿠키를 사용하는데, 이 쿠키는 단일 도메인 및 서브 도메인에서만 작동하도록 설계되어 있어 관리가 번거로워질 수 있다.
| JWT | Session | 설명 | |
|---|---|---|---|
| 상태 | Stateless | Stateful | JWT는 무상태이며 필요한 정보가 토큰 자체에 전부 담겨있다. 세션은 서버가 각 클라이언트의 세션 데이터를 유지하기 때문에 유상태이다. |
| 저장 위치 | 클라이언트 | 서버 | JWT는 클라이언트에 저장되는 반면, session은 서버에 저장된다. |
| 토큰 구조 | JSON 형태(+인코딩) | 서버 측 데이터 구조 | JWT는 JSON 데이터를 압축해 URL에 안전한 형식으로 포함하는 인코딩된 토큰이지만, 세션 데이터는 일반적으로 서버 측 데이터 구조에 저장된다. |
| 확장성 | 높음 | 낮음 | JWT는 서버 측 저장소가 따로 필요하지 않아 확장성이 더 높아, 분산 시스템이나 마이크로 서비스 아키텍처에 더 적합하다. |
| 만료 시간 | 자동 만료 | 서버에서 관리 | JWT는 토큰 자체가 만료 시간을 포함할 수 있어 자동으로 만료될 수 있다. 세션도 만료 시간을 가지지만, 이는 서버에서 관리되고 실제 만료 처리를 위해 추가적인 처리가 필요하다. |
| 보안 | 일부 위험에 취약 | 일부 위험 완화 | JWT는 올바르게 구현되지 않은 경우 토큰 변조 혹은 재생 공격과 같은 일부 공격에 취약해질 수 있다. 세션은 서버에서 관리되기 때문에 JWT에 비해 상대적으로 위험에서 안전하다. |
JWT는 무상태 인증에 적합하며, 분산 시스템, API 및 싱글 페이지 애플리케이션(SPA)과 같은 현대적인 환경에서 자주 사용된다. 반면 세션은 서버 렌더링 웹 애플리케이션에서 전통적으로 사용되며, 서버 측에서 사용자 세션과 데이터를 관리하는 유상태 메커니즘을 제공한다. JWT와 세션 중 선택은 애플리케이션 아키텍처, 확장성 요구 사항 및 보안 고려 사항 등을 고려하여 결정된다.