JWT
기본 정보
- 명칭: JWT
- 영문명: JSON Web Token
- 분류: 인증 토큰 표준
- 표준: RFC 7519
- 주요 용도: 사용자 인증 및 권한 관리
- 관련 주제: #JWT #인증 #API #보안 #RESTAPI
개요
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