프로젝트를 진행하며 다루었던 JWT에 대한 복습 겸 정리를 해보려고 한다.
Json Web Token의 약자로, 사용자 인증/인가 정보를 JSON 형식으로 담아 클라이언트와 서버가 주고받는 서명된 토큰
JWT는 .으로 구분된 3개의 Base64Url 문자열로 구성
xxxxx.yyyyy.zzzzz
Header.Payload.Signature
{
"alg": "HMAC SHA256",
"typ": "JWT"
}
→ 이 JSON을 Base64Url로 인코딩한 것이 헤더 부분이다.
토큰에 담긴 실제 데이터(클레임, Claims)
{
"sub": "user123",
"role": "USER",
"exp": 1700000000
}
→ Header와 마찬가지로 Base64Url 인코딩
※ Payload는 암호화가 아니라 인코딩이므로
민감 정보(비밀번호 등)를 절대 넣지 않도록 한다.
토큰 위변조 방지를 위한 서명 부분입니다.
HMACSHA256(
Base64UrlEncode(header) + "." + Base64UrlEncode(payload),
secret
)
서버는 이 Signature를 검증해 토큰이 조작되지 않았는지 확인함
💡 Secret Key 관리
서명에 사용되는 secret은 보안상 매우 중요하므로, 코드에 직접 작성하지 않고 application.properties 또는 application.yml 파일에서 관리
| 단점 | 해결 방안 |
|---|---|
| 토큰 탈취 시 만료까지 악용 가능 | RefreshToken 전략, 짧은 만료 시간 설정 |
| Payload가 암호화되지 않음 | 민감 정보 포함 금지 |