
웹 개발에서 인증은 빠질 수 없는 핵심 요소입니다.
그중에서도 최근 가장 많이 사용되는 방식이 바로 JWT입니다.
JWT의 개념부터 구조, 동작 원리, 세션 방식과의 차이까지 정리해보려고 합니다.
JWT(Json Web Token) 는 서버가 로그인에 성공한 사용자에게 발급하는 서명된 문자열 토큰
❗ 중요! JWT는 Stateless 하다
기존 세션 기반 인증은 서버가 메모리에 세션을 저장하고 클라이언트가 세션 ID 를 쿠키로 보내는 방식
❗문제점
| 장점 | 설명 |
|---|---|
| Stateless | 서버가 사용자의 상태(세션)를 기억하지 않아도 됨 |
| 확장성 | 서버가 여러 대일 때도 중앙 저장소 없이 인증 가능 |
| 유연성 | 토큰 안에 사용자 정보를 직접 담을 수 있음 |
| 효율적 인증 | 로그인 이후 별도 저장소 조회 없이 인증 처리 가능 |
JWT는 다음과 같이 세 부분으로 구성
<HEADER>.<PAYLOAD>.<SIGNATURE>
예시:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.
eyJ1c2VySWQiOiIxMjMiLCJyb2xlIjoiVVNFUiJ9
.
U7MXhzfHqPcjIzR8LP6SgH3W1bRtD4s6l8FVF9t9QZo
| 구성 요소 | 설명 |
|---|---|
| Header | 토큰의 타입과 서명 알고리즘 정보 |
| Payload | 사용자 정보, 토큰 만료 시간 등 주요 데이터 |
| Signature | 서버 비밀키로 생성한 서명. 위조 방지 목적 |
JWT의 작동 흐름
localStorage, sessionStorage, HttpOnly Cookie 등)Authorization: Bearer <JWT>JWT는 Stateless 방식이므로 서버는 세션을 따로 저장하지 않고 토큰 자체로 인증
JWT 인증에서는 보통 두 종류의 토큰을 사용
| 항목 | Access Token | Refresh Token |
|---|---|---|
| 목적 | API 요청 인증 | Access Token 재발급 |
| 만료 시간 | 짧음 (5~30분) | 김 (1일~2주) |
| 저장 위치 | Header / Cookie | HttpOnly Cookie 권장 |
| 보안 위험 | 탈취 시 즉시 악용 가능 | 탈취 시 재발급 차단 로직 필요 |
| 사용 시점 | 모든 API 요청에 사용 | Access Token 만료 시 사용 |
세션은 서버가 클라이언트의 로그인 상태 정보를 메모리 또는 저장소에 저장하는 방식.
클라이언트는 이 정보를 구분하기 위한 세션 ID를 쿠키에 저장.
| 항목 | 세션 방식 | JWT 방식 |
|---|---|---|
| 상태 관리 | 서버가 세션 저장 | 서버는 상태 저장 X (Stateless) |
| 확장성 | 세션 공유 설정 필요 | 토큰만 있으면 어디서나 인증 |
| 저장 위치 | 서버 메모리 / Redis | 클라이언트(localStorage, Cookie 등) |
| 보안 | 세션 ID 탈취 시 인증 우회 가능 | JWT 탈취 시 위조 가능성 있음 |
| 로그아웃 처리 | 서버에서 세션 삭제로 즉시 반영 | 토큰 무효화 어려움 |
| 인증 속도 | 세션 저장소 조회 필요 | 토큰 디코딩만으로 인증 가능 (빠름) |
| 만료 처리 | 서버에서 직접 관리 | 토큰 자체에 exp로 설정 가능 |