JWT는 클라이언트-서버 간에 인증 정보를 안전하게 주고받기 위해 사용되는 자기완결적 토큰이다.
형식은 Header.Payload.Signature의 세 부분으로 구성되며, 각각 Base64Url로 인코딩된다.
Header는 토큰의 타입과 서명 알고리즘 정보를 담는 부분이다. 보통 JWT인지, 어떤 알고리즘을 사용하는지 명시한다.
{
"alg": "HS256",
"typ": "JWT"
}
역할:
Payload는 토큰의 실제 데이터(클레임)가 담기는 부분이다. 사용자의 ID, 권한, 토큰 만료 시간 등 인증과 관련된 정보가 포함된다.
{
"sub": "user123",
"iss": "myapp.com",
"exp": 1722830190,
"roles": ["USER", "ADMIN"]
}
역할:
Payload는 서명은 되지만 암호화되지는 않기 때문에, 누구나 디코딩해서 내용을 볼 수 있다.
따라서 민감한 정보를 직접 담아서는 안 된다.
Signature는 Header와 Payload의 무결성을 검증하기 위한 서명 값이다. 이 서명을 통해 토큰이 위변조되지 않았는지 검증할 수 있다.
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secretKey
)
역할:
JWT는 이 세 부분만으로 토큰의 유효성과 신뢰성을 검증할 수 있기 때문에 서버가 별도의 세션 저장소를 유지하지 않아도 된다.
하지만 탈취 시 그대로 재사용될 수 있으므로, 짧은 유효 기간 설정과 Refresh Token 관리 전략이 중요하다.