로그인/인증을 구현하다 보면
“JWT 쓸까? 세션으로 쓸까?”
이 고민을 한 번쯤은 하게 된다.
어떤 방법이 더 효율적이고 좋은 방법일지 항상 고민하다
막상 구현하고 비교해보니 철학 자체가 다르다는 걸 깨달았다.
그래서 이번 2편에서는
토큰 기반 인증과 세션 기반 인증을 비교해볼까 한다.
1. 둘의 차이점..?
딱 한 문장으로 말하면 자면 음..
서버가 인증 상태를 기억하는가 안하는가.
세션 기반 인증
→ 서버가 나의 로그인 상태를 기억하고 있음 (Stateful)
토큰 기반(JWT) 인증
→ 서버는 아무것도 기억하지 않음. 클라이언트가 인증 정보 들고 다님 (Stateless)
철학부터 달라서, 구조, 운영방식부터 서로 다르다.

2. 세션 기반 인증 흐름
세션 기반 인증은 밑과 같이 흘러간다
로그인 성공
↓
서버: "해당 유저 로그인했음" 하고 세션에 저장
↓
클라이언트에 세션 ID 쿠키 발급 (JSESSIONID)
↓
이후 요청마다 세션 ID 자동 전송
↓
서버는 세션 저장소에서 유저 정보 꺼내서 인증
서버가 로그인 상태를 들고 있는 형태다.
그래서…
- 보안 제어가 쉽고
- 세션 삭제하면 바로 로그아웃 처리됨
대신 서버를 여러 대 띄우면 문제가 생긴다.
“어..? 얘는 서버1에선 로그인인데 서버2에선 로그인이 아니네?”
그래서 Redis 같은 곳에 세션을 공유할 필요성이 있다.
3. 토큰 기반(JWT) 인증 흐름
JWT는 이렇게 다르게 한다:
로그인 성공
↓
서버가 JWT 생성해서 클라이언트에게 줌
↓
서버는 아무것도 기억하지 않음
↓
클라이언트가 JWT를 들고 다님
↓
요청마다 JWT 검증해서 인증 처리
서버가 인증 상태를 저장하지 않기 때문에
확장성, 성능, 서버 증설이 훨씬 편해진다.
하지만 문제는
토큰이 탈취되면?
→ 서버는 알아낼 방법이 없다…
그래서 실제로는 Refresh Token 정책, 만료 전략 등을 꼭 신경 써야 한다.
⇒ 전략이 다양하다
4. 장단점
세션 기반 인증
세션 기반 인증 장점
- 서버가 인증 상태를 들고 있으니 보안 제어가 직관적
- 세션 탈취? → 서버에서 세션 삭제하면 끝
- Spring Security 기본 기능과 호환이 잘된다
- CSRF 같은 공격은 기본 설계에서 커버하기 쉽다
세션 기반 인증 단점
- 서버 확장 시 세션 공유 필요
- 모바일/SPA와 연동할 때 구조가 조금 답답함
- API 서버 다중화하려면 고려할 게 많음
- 확장에선 닫혀있다
토큰 기반 인증(JWT)
토큰 기반 인증 장점
- 완전 Stateless → 서버 여러 개 띄우기 최고
- 인증 속도 매우 빠름
- 프론트/앱/게이트웨이 등 어디서든 쓰기 좋음
- 마이크로서비스 환경에 특히 잘 맞음
토큰 기반 인증 단점
- Refresh Token 탈취는 정말 크리티컬
- 전략이 매우 중요한거같따
- 만료/재발급/블랙리스트 정책을 설계해야 한다
- 보관 위치(LocalStorage vs Cookie) 논쟁이 끝이 없음
5. 결국 뭐가 더 좋을까..?
가끔 보면 이런 질문을 한다.
“요즘은 JWT 쓰는 게 맞죠?”
“세션 기반 인증은 구식 아닌가요?”
위 질문 자체가 잘못된 질문인거같다.
나도 처음에 앱 개발로 개발로 접하며 JWT로 자연스럽게 빠져들었었는데,
무조건 JWT가 옳다. 세션이 옳다. 가 아니라 상황에 따라 다른 방식을 사용할 수도 있다..!
세션 기반 인증이 더 괜찮은 선택인 경우
- 내부 어드민, 관리자 페이지
- 사용자 수가 적고 안정성이 중요한 서비스
- 서버 확장은 크게 고려하지 않을 때
- Spring Security 기본 기능을 그대로 쓰고 싶을 때
JWT 기반 인증이 더 좋은 상황
- 모바일 앱 + API 서버 조합
- React/Vue SPA + 백엔드 분리 구조
- 서버를 자주 확장하는 서비스
- 마이크로서비스(MSA) 환경
즉, 정리하자면
세션 = 안정적이고 직관적
JWT = 확장성·유연성이 매우 뛰어남
마무리
토큰 기반 인증과 세션 기반 인증은 우열의 문제가 아니라 특성의 차이다
- 서버가 인증 상태를 들고 있으면 → 세션
- 클라이언트가 인증 정보를 들고 다니면 → JWT
이 차이 하나로
확장성, 보안 전략, API 설계 방식까지 전부 달라진다.
다음 편에서는 인증의 핵심 논쟁인…
“JWT는 어디에 저장하는 게 안전할까?” LocalStorage? Cookie? Refresh Token 탈취 위험은?”
이 주제를 정리해볼까 한다
다음 주제는 아직도 많이 헷갈린다 ㅠ
'Knowledge > 개발지식' 카테고리의 다른 글
| [CS] 동시성과 병렬성 (0) | 2025.11.01 |
|---|---|
| [단기 공기업 필기 준비] 데이터베이스 (1) | 2025.10.26 |