.(점)으로 구분된 3개의 문자열로 구성xxxxx.yyyyy.zzzzz
Header.Payload.Signature
| 구성 요소 | 설명 | 예시 |
|---|---|---|
| Header | 토큰의 메타데이터, 서명 알고리즘과 타입 명시 | {"alg": "HS256", "typ": "JWT"} |
| Payload | 토큰에 담길 실제 데이터(클레임, Claims) | {"sub": "user123", "name": "John Doe", "iat": 1516239022} |
| Signature | Header와 Payload를 비밀키로 서명한 값, 위변조 방지 | HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret) |
HS256, RS256)"JWT"){
"alg": "HS256",
"typ": "JWT"
}
iss: 발급자sub: 주제(사용자 ID)aud: 수신자exp: 만료 시간nbf: Not Beforeiat: 발급 시간jti: JWT 고유 ID{
"sub": "user123",
"name": "John Doe",
"iat": 1516239022,
"exp": 1516242622
}
Header + "." + Payload를 선택한 알고리즘과 비밀키로 서명eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.eyJzdWIiOiJ1c2VyMTIzIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
{"alg": "HS256", "typ": "JWT"}
{"sub": "user123", "name": "John Doe", "iat": 1516239022}
Header.Payload.Signature 생성) Authorization: Bearer <JWT> 헤더로 전송 iss, exp, nbf) 검증 Authorization 헤더)JwtAuthenticationConverter를 통해 GrantedAuthority 매핑scope 또는 scp 클레임 값을 SCOPE_ prefix 권한으로 변환spring:
security:
oauth2:
resourceserver:
jwt:
issuer-uri: https://idp.example.com/issuer
issuer-uri 기반으로 .well-known/openid-configuration 조회 → jwks_uri 자동 가져오기jwk-set-uri를 직접 지정하면 Authorization Server가 없어도 기동 가능iss 발급자 검증exp/nbf 시간 검증 (기본 clock skew 60초)rfc 7519 공식 문서
https://www.rfc-editor.org/rfc/rfc7519
spring security 공식 문서
RFC(Request for Comments):
인터넷 표준을 정의하는 문서 시리즈로, IETF(Internet Engineering Task Force)에서 발행
네트워크, 프로토콜, 보안 표준 등을 기술하고, 표준으로 채택되면 전 세계적으로 통용된다.
RFC 7519:
JSON Web Token (JWT)
JWT의 구조, 사용 목적, 클레임 종류, 서명/검증 방식 등 JWT를 어떻게 설계하고 구현해야 하는지에 대한 공식 규격 정의