
Q. 토큰 기반 인증에 대해 설명해 주세요.
xxxxx.yyyyy.zzzzz
| | |
Header Payload Signature
Header: 알고리즘, 타입 정보 (ex: HS256)
Payload: 사용자 정보, 만료 시간 등 (ex: userId, exp)
Signature: 서버의 비밀키로 암호화된 서명 (변조 방지)
1. POST /login → 서버 인증 성공 → JWT 토큰 발급
2. 클라이언트: localStorage에 토큰 저장
3. GET /my-page → Authorization: Bearer {토큰} 포함
4. 서버: 토큰 검증 → 사용자 인증 완료 → 데이터 응답
Stateless 구조: 서버에 세션 저장이 필요 없어 확장성이 높다.
확장에 용이: 서버 간 상태 공유가 필요 없으므로 마이크로서비스, 서버리스 구조에 적합하다.
유연한 저장 방식: 클라이언트가 토큰을 자유롭게 저장이 가능하다.
다중 플랫폼 지원: 웹/모바일 등 다양한 플랫폼에서 활용이 쉽다.
보안 이슈: 토큰이 유출되면 제어 불가능하다. (로그아웃, 만료 이전까지 무방비)
토큰 폐기 어려움: 서버에서 상태를 유지하지 않기 때문에 토큰을 강제로 무효화하기 어렵다.
토큰 크기 문제: 세션 ID보다 JWT는 크기가 크고, 매 요청마다 포함되기 때문에 전송 비용이 증가할 수 있다.
| 구분 | 토큰 기반 인증 | 세션 기반 인증 |
|---|---|---|
| 저장 위치 | 클라이언트 | 서버 |
| 상태 유지 | 무상태 (Stateless) | 상태 유지 (Stateful) |
| 확장성 | 뛰어남 | 낮음 |
| 로그아웃 처리 | 까다로움 | 쉬움 (세션 삭제) |
| 토큰 탈취 시 대응 | 어렵다 | 서버에서 제어 가능 |
| 인증 방식 | 헤더에 토큰 포함 | 쿠키로 세션 ID 전달 |
프론트엔드가 React, Vue, Svelte 등 SPA로 구성된 경우
서버리스 또는 마이크로서비스 아키텍처를 사용하는 경우
여러 플랫폼(웹, 모바일 등)에서 동일한 인증 토큰을 활용하고 싶은 경우
서버의 상태를 최소화하고 싶을 때