JWT 구조 & 구성 요소

썬쑨·2025년 7월 6일

Spring

목록 보기
12/12

JWT는 클라이언트-서버 간에 인증 정보를 안전하게 주고받기 위해 사용되는 자기완결적 토큰이다.
형식은 Header.Payload.Signature의 세 부분으로 구성되며, 각각 Base64Url로 인코딩된다.

1. Header

Header는 토큰의 타입과 서명 알고리즘 정보를 담는 부분이다. 보통 JWT인지, 어떤 알고리즘을 사용하는지 명시한다.

{
  "alg": "HS256",
  "typ": "JWT"
}

역할:

  • alg: 토큰 서명에 사용될 해시 알고리즘(HMAC, RSA 등)을 지정한다.
  • typ: 일반적으로 "JWT"로 고정된다.
    이 정보는 토큰의 해석 및 서명 검증 시 사용된다.

2. Payload

Payload는 토큰의 실제 데이터(클레임)가 담기는 부분이다. 사용자의 ID, 권한, 토큰 만료 시간 등 인증과 관련된 정보가 포함된다.

{
  "sub": "user123",
  "iss": "myapp.com",
  "exp": 1722830190,
  "roles": ["USER", "ADMIN"]
}

역할:

  • sub (Subject): 토큰의 주체, 즉 사용자 ID
  • iss (Issuer): 토큰 발급자
  • exp (Expiration): 토큰 만료 시각 (UNIX timestamp)
  • roles: 사용자 권한 정보 (커스텀 클레임)

Payload는 서명은 되지만 암호화되지는 않기 때문에, 누구나 디코딩해서 내용을 볼 수 있다.
따라서 민감한 정보를 직접 담아서는 안 된다.

3. Signature

Signature는 Header와 Payload의 무결성을 검증하기 위한 서명 값이다. 이 서명을 통해 토큰이 위변조되지 않았는지 검증할 수 있다.

HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secretKey
)

역할:

  • 클라이언트가 임의로 Payload나 Header를 조작해도, 서명 검증에 실패하므로 서버에서 무효한 토큰으로 판단한다.
  • 서버는 비밀키를 통해 서명을 재계산하여, 수신된 Signature와 비교함으로써 위조 여부를 판별한다.

JWT는 이 세 부분만으로 토큰의 유효성과 신뢰성을 검증할 수 있기 때문에 서버가 별도의 세션 저장소를 유지하지 않아도 된다.
하지만 탈취 시 그대로 재사용될 수 있으므로, 짧은 유효 기간 설정과 Refresh Token 관리 전략이 중요하다.

profile
천천히 굴러갑니다!

0개의 댓글