JWT
목차 보기
개요
JWT(JSON Web Token)는 사용자의 인증 정보와 필요한 데이터를 JSON 형태로 담아 안전하게 전달하기 위한 토큰 기반 인증 방식이다.
로그인에 성공하면 서버는 JWT를 발급하고, 클라이언트는 이후 API 요청 시 JWT를 함께 전송하여 인증을 수행한다.
REST API, 모바일 앱, SPA, SaaS 서비스 등에서 가장 널리 사용되는 인증 방식 중 하나이다.
JWT 구조
Header
.
Payload
.
Signature
예시
eyJhbGciOiJIUzI1NiIs...
eyJ1c2VySWQiOjE...
abc123xyz...
세 부분이 .으로 연결된 문자열 형태이다.
동작 과정
사용자 로그인
↓
서버 인증
↓
JWT 발급
↓
클라이언트 저장
↓
API 요청
↓
Authorization Header
↓
JWT 검증
↓
데이터 반환
Header
토큰의 암호화 알고리즘과 타입 정보를 저장한다.
예시
{
"alg": "HS256",
"typ": "JWT"
}
Payload
사용자 정보(Claims)를 저장한다.
예시
{
"userId": 1,
"name": "구름",
"role": "admin"
}
민감한 정보(비밀번호 등)는 저장하지 않는 것이 원칙이다.
Signature
Header와 Payload를 비밀키로 서명한 값이다.
HMACSHA256(
Header +
Payload +
SecretKey
)
위조 여부를 검증하는 역할을 한다.
JWT 전송 방식
일반적으로 HTTP Header를 사용한다.
Authorization:
Bearer eyJhbGciOi...
Bearer 뒤에 토큰을 포함하여 전송한다.
로그인 예시
요청
POST /api/login
응답
{
"accessToken": "eyJhbGciOi...",
"refreshToken": "eyJhbGc..."
}
Access Token
- API 인증용
- 유효시간이 짧음
- 만료 시 재발급 필요
예시
30분
1시간
2시간
Refresh Token
- Access Token 재발급용
- 유효기간이 김
예시
7일
30일
90일
Claims
JWT에 저장되는 정보이다.
대표 Claim
| Claim | 설명 |
|---|---|
| sub | 사용자 식별자 |
| iss | 발급자 |
| aud | 대상 |
| exp | 만료 시간 |
| iat | 발급 시간 |
| nbf | 사용 가능 시간 |
| jti | 토큰 ID |
JWT 인증 구조
Client
↓
Login
↓
JWT 발급
↓
API 요청
↓
Authorization Header
↓
JWT 검증
↓
Response
Session과 비교
| JWT | Session |
|---|---|
| 서버 저장 없음 | 서버 메모리 저장 |
| Stateless | Stateful |
| 확장성 높음 | 서버 부담 증가 |
| 모바일 친화적 | 웹 중심 |
| API에 적합 | 전통 웹에 적합 |
JWT 장점
- Stateless 구조
- 서버 부하 감소
- 모바일 앱에 적합
- REST API와 잘 어울림
- 서버 확장이 쉬움
- 다양한 플랫폼에서 사용 가능
JWT 단점
- 발급 후 강제 폐기가 어려움
- 토큰 탈취 시 위험
- Payload가 Base64 인코딩일 뿐 암호화는 아님
- 토큰 크기가 Session ID보다 큼
보안 고려사항
권장 사항
- HTTPS 사용
- 짧은 Access Token 만료 시간
- Refresh Token 별도 관리
- HttpOnly Cookie 사용 고려
- 민감 정보 저장 금지
- 강력한 Secret Key 사용
- 토큰 재사용 방지
- Refresh Token Rotation 적용
JWT 저장 위치
LocalStorage
장점
- 구현이 쉬움
단점
- XSS 공격에 취약
HttpOnly Cookie
장점
- JavaScript 접근 불가
- XSS 방어에 유리
단점
- CSRF 대응 필요
실무에서는 HttpOnly Cookie 사용을 권장하는 경우가 많다.
JWT 라이브러리
Node.js
- jsonwebtoken
PHP
- firebase/php-jwt
Java
- jjwt
- java-jwt
Python
- PyJWT
C#
- System.IdentityModel.Tokens.Jwt
주요 활용 분야
- 로그인 인증
- REST API
- 모바일 앱
- SPA
- SaaS
- ERP
- OAuth 인증
- SSO
실무 메모
실무에서는 다음과 같은 방식이 권장된다.
- Access Token과 Refresh Token 분리
- Access Token은 15~60분 정도의 짧은 만료 시간 설정
- Refresh Token은 DB에 저장하여 관리
- HTTPS 환경에서만 전송
- JWT Payload에는 최소 정보만 저장
- 로그아웃 시 Refresh Token 폐기
- 토큰 서명 알고리즘은 HS256 또는 RS256 사용
- 토큰 갱신 API 별도 제공
- 토큰 만료 예외 처리 구현
- API Gateway에서 JWT 검증 수행 가능
JWT와 함께 사용하는 기술
대표 활용 사례
- React 로그인
- Vue 관리자 페이지
- Flutter 앱 로그인
- ERP 인증
- SaaS 사용자 인증
- OpenAI API Gateway
- 모바일 앱 인증
- 관리자 시스템 로그인
관련 문서
출처
- JWT 공식 홈페이지 (jwt.io)
- RFC 7519 - JSON Web Token
- OWASP JWT Security Cheat Sheet