JWT는 마침표(.)로 구분된 세 부분으로 구성되며, 각 부분은 Base64URL로 인코딩됩니다.
Header 헤더 — 알고리즘과 타입
{
"alg": "HS256",
"typ": "JWT"
}
Base64URL → eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
Payload 페이로드 — 클레임
{
"sub": 1, // Subject — 사용자 ID
"username": "alice",
"email": "alice@example.com",
"iat": 1779562800, // Issued At — 발급 시각
"exp": 1779566400 // Expiration — 만료 시각
}
표준 클레임: iss(발급자), sub(주체), aud(대상),
exp(만료), iat(발급), jti(JWT ID).
Signature 시그니처 — 위변조 방지
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
SECRET_KEY
)
서버만 아는 SECRET_KEY로 서명하여 위변조 방지. 클라이언트는 페이로드를 읽을 수는 있지만 수정할 수 없음.
JWT 보안 주의사항
- Payload는 암호화되지 않음. 비밀번호 등 민감 정보 절대 넣지 말 것.
- SECRET_KEY는 충분히 긴 랜덤값을 사용 (32+ 바이트 권장).
exp 만료 시간은 짧게 (15분~1시간). 갱신은 Refresh Token으로.
alg: none 공격 방지 — 헤더의 alg를 신뢰하지 말고 서버에서 강제.
- 토큰 무효화가 어려움 — 로그아웃은 클라이언트 측 삭제, 서버는 blacklist 또는 짧은 TTL.