암호학
JSON Web TokenJWT
JWT(JSON Web Token)는 당사자 간에 정보를 JSON 형식으로 안전하게 전달하기 위한 개방형 표준(RFC 7519)이다. 서명되어 있어 위변조를 감지할 수 있으며, 웹 인증(로그인 상태 유지)과 API 접근 제어에 널리 사용된다.
JWT 구조
JWT는 점(.)으로 구분된 세 부분으로 구성된다.
Header
서명 알고리즘 비교
JWT 서명에 사용할 수 있는 알고리즘:
| 알고리즘 | 방식 | 키 유형 | 적합 상황 |
|---|---|---|---|
| HS256 | HMAC-SHA256 | 대칭키 (하나의 비밀키) | 단일 서버, API 내부 통신 |
| RS256 | RSA-SHA256 | 비대칭키 (개인키/공개키) | 여러 서비스 간 검증, OAuth2 |
| ES256 | ECDSA-SHA256 | 비대칭키 (ECC) | 모바일, 성능 중시 환경 |
| None | 서명 없음 | 없음 | 보안 위험 — 절대 사용 금지 |
HS256 vs RS256 선택 기준:
- •HS256: 비밀키 하나로 서명+검증 → 비밀키가 유출되면 토큰 위조 가능
- •RS256: 개인키로 서명, 공개키로 검증 → 공개키 노출은 괜찮음. 마이크로서비스 간 검증에 적합
Payload (Claim)
Signature
인증 흐름
JWT 검증 과정
JWT vs 세션 쿠키
| 항목 | JWT | 세션 쿠키 |
|---|---|---|
| 저장 위치 | 클라이언트 (localStorage/Cookie) | 서버 (세션 저장소) |
| 서버 상태 | Stateless | Stateful |
| 확장성 | 수평 확장 용이 | 세션 공유 필요 |
| 크기 | 상대적으로 큼 | 작은 세션 ID |
| 탈취 시 | 만료 전 취소 어려움 | 서버에서 즉시 무효화 가능 |
주요 보안 주의사항
JWT 보안 취약점과 대응
| 취약점 | 설명 | 대응 |
|---|---|---|
| alg:none 공격 | 헤더의 알고리즘을 none으로 바꿔 서명 검증 우회 | 서버에서 허용 알고리즘 명시적 검증 |
| 알고리즘 혼동 (RS256→HS256) | 공개키를 HS256 비밀키로 사용하는 공격 | 알고리즘 고정 검증 |
| 서명 없는 토큰 수락 | 검증 로직 미흡 | 반드시 서명 검증 필수 |
| 토큰 탈취 | XSS로 localStorage의 JWT 탈취 | httpOnly 쿠키에 저장 |
| 만료 검증 누락 | exp 클레임 검증 안 함 | 라이브러리 사용, 만료 검증 필수 |
HS256 비밀키 브루트포스 방어
JWT는 구조 자체가 공개되어 있으므로, HS256 비밀키가 짧으면 Hashcat 같은 도구로 크래킹이 가능하다.
방어 방법:
- •비밀키를 최소 256비트(32바이트) 이상의 무작위 문자열로 설정
- •환경변수로 관리, 코드에 하드코딩 금지
- •중요한 서비스에서는 RS256(비대칭키) 사용 권장
- •JWT 유효기간을 짧게 설정 (크래킹 성공 전 만료)
Refresh Token 패턴
액세스 토큰의 짧은 수명(15분)과 리프레시 토큰의 긴 수명(7일)을 분리하는 패턴.
리프레시 토큰은 DB에 저장해 강제 무효화(로그아웃, 계정 탈취 시 취소) 가능.
OAuth 2.0 / OIDC와 JWT
JWT는 OAuth 2.0 액세스 토큰과 OpenID Connect(OIDC) ID 토큰의 표준 형식으로 사용된다.
| 토큰 유형 | 용도 | 형식 |
|---|---|---|
| Access Token | API 접근 권한 | JWT (aud: API 서버) |
| ID Token (OIDC) | 사용자 신원 정보 | JWT (aud: 클라이언트 앱) |
| Refresh Token | 새 access_token 발급 | 불투명 토큰 (DB 저장) |
JWE (JSON Web Encryption)
JWT의 Payload를 암호화한 형식. 민감한 정보를 토큰에 담을 때 사용.
| 항목 | JWS (일반 JWT) | JWE |
|---|---|---|
| 무결성 | ✓ 서명으로 보장 | ✓ |
| 기밀성 | ✗ Payload 평문 | ✓ 암호화 |
| 사용 | 일반 인증 | 민감 데이터 (주민번호, 의료정보 등) |
관련 개념
- •SHA-256 — JWT HMAC-SHA256 서명에 사용
- •SSL/TLS — JWT 전송 채널 보호
- •HTTP/HTTPS — Authorization 헤더로 JWT 전달
- •bcrypt — JWT 발급 전 비밀번호 검증에 사용
참고문헌
- •RFC 7519 — JSON Web Token (JWT)
- •RFC 7518 — JSON Web Algorithms (JWA)
- •OWASP — JSON Web Token Security Cheat Sheet