CS
[security] JWT와 Session의 차이
KJihun
2025. 4. 23. 09:40
728x90
JWT (JSON Web Token)
JWT는 JSON 포맷 형식으로 사용자 인증 정보를 담고 있는 토큰 기반 인증 방식이다.
클라이언트 측에서 인증 정보를 유지하고, 요청 시 헤더 또는 쿠키에 포함시켜 서버에 전송한다.
구조
- Header: 토큰의 타입(JWT ...)과 서명 알고리즘(암호화 알고리즘)
- Payload: 사용자 정보
- Signature
- 헤더와 페이로드를 결합한 값을 서명 알고리즘을 통해 암호화하여 구현
- 생성된 Signature를 JWT에서 받은 Signature와 비교하여 토큰의 변조 여부를 확인
장점
- 무상태성(Stateless): 서버가 사용자 상태를 유지할 필요가 없어 확장성에 유리하다
- 분산 처리에 적합: 서버에 상태 정보를 저장하지 않기 때문에 여러 서버를 사용하여도 서버 간 세션 공유가 필요없다
단점
- 보안성: JWT는 발급된 후 만료 시간까지 유효하므로 탈취될 경우, 악용될 수 있다
사용 예시
- SPA (Single Page Application)
- MSA
- 분산 시스템
Session
Session은 서버 측에서 사용자 상태 정보를 저장하고, 클라이언트에게 세션 ID를 반환하는 인증 방식이다
이후 클라이언트는 요청 시 쿠키에 세션 ID를 포함시켜 서버에 전달한다.
구조
- Session ID: 서버가 클라이언트에게 고유한 세션 ID를 생성하여 전달
- 세션 저장소: 세션 ID와 사용자 상태 정보를 저장하는 DB
장점
- 보안성: 정보가 서버에 저장되므로 탈취 위험이 줄어들며, 서버 측에서 세션을 무효화할 수 있어 보안 관리가 용이하다
- 관리: 서버에서 세션 만료 시간이나 무효화 등 유연하게 설정할 수 있다
단점
- 상태 저장성 (Stateful): 서버가 사용자 상태를 관리하므로, 서버 자원 소모가 크며 사용자가 많을수록 부하가 증가한다
- 확장성: 여러 서버 간 세션 정보를 공유해야 할 경우 복잡한 세션 동기화가 필요하다
JWT와 Session의 차이점
항목 | JWT | Session |
상태 관리 | 클라이언트에서 상태 정보 유지 (Stateless) | 서버에서 상태 정보 유지 (Stateful) |
저장 위치 | 클라이언트 측 (localStorage, sessionStorage, 쿠키) | 서버 측에서 세션 정보를 저장 |
확장성 | 서버 자원 사용이 적어 확장성에 유리 | 서버 메모리나 DB를 사용, 확장성 불리 |
무효화 방법 | 만료 시간 전에는 명시적으로 무효화 불가 | 서버에서 언제든 세션 종료 가능 |
보안성 | 토큰 탈취 시 위험 (HTTPS, 토큰 만료 설정 필요) | 세션 ID 자체는 보안에 강함 |
인증 방식 | HTTP 헤더에 JWT를 포함하여 전달 | 세션 ID를 쿠키에 저장하여 서버에 전달 |
사용 예 | SPA, 마이크로서비스 구조, 분산 시스템 | 전통적인 서버 기반 웹 애플리케이션 |
결론
- JWT는 서버 자원 사용을 줄이고, 분산 시스템 및 마이크로서비스 환경에 적합한 인증 방식
- Session은 보안성과 세션 관리에 뛰어나지만, 서버 측에서 상태를 관리하므로 자원 관리가 어려운 방식