
JWT(Jason Web Token)
- 당사자 간에 정보를 JSON 형태로 안전하게 전송하기 위한 토큰
- URL로 이용할 수 있는 문자열로만 구성 → HTTP 구성요소 어디든 위치할 수 있음
- 디지털 서명이 적용돼 있어 신뢰할 수 있음
JWT의 구조
점(.)으로 구분된 아래의 세 부분으로 구성
- 헤더(Header)
- 내용(Payload)
- 서명(Signature)
xxxxx . yyyyy . zzzzz
헤더 내용 서명
📌 헤더
- 검증과 관련된 내용
- alg, typ 속성을 포함
- Base64Url 형식으로 인코딩 돼 사용
✔️ alg
- 해싱 알고리즘 지정 - 보통 SHA256, RSA 사용
- 토큰을 검증할 때 사용되는 서명 부분에서 사용
{
"alg": "H256", //HMAC SHA256 알고리즘을 사용한다는 의미
"typ": "JWT"
}
✔️ typ
- 토큰의 타입 지정
📌 내용
- 토큰에 담는 정보 포함 - Claim(클레임)이라고 함
- 등록된 클레임(Registered Claims)
- 공개 클레임(Public Claims)
- 비공개 클레임(Private Claims)
- 완성된 내용은 Base64Url 형식으로 인코딩
<내용 예시>
{
"sub" : "wikibooks payload", //등록된 클레임 - 제목
"exp" : "1602076408", // 등록된 클레임 - 만료시간
"userId" : "wikibooks" //비공개 클레임
"username" : "flature" //비공개 클레임
}
✔️ 등록된 클레임
- 필수는 아니지만 토큰에 대한 정보를 담기 위해 이미 이름이 정해져 있는 클레임
| 클레임(Claim) | 의미 | 설명 |
| iss | 발급자 (Issuer) | JWT의 발급자를 나타내는 대소문자 구분 문자열 또는 URI |
| sub | 제목 (Subject) | JWT의 주제를 나타내며, 일반적으로 사용자 식별자 등으로 사용됨 |
| aud | 수신인 (Audience) | JWT의 대상자 - 토큰을 검증하는 서비스가 자신의 식별자와 일치해야 함. - 일치하지 않으면 JWT 거부됨 |
| exp | 만료 시간 (Expiration Time) | 토큰의 유효기간을 나타내며, NumericDate(UTC timestamp) 형식으로 지정됨 |
| nbf | 사용 가능 시작 시간 (Not Before) | 이 시간 이전에는 JWT가 유효하지 않음을 의미함 |
| iat | 발급 시각 (Issued At) | JWT가 발급된 시간으로, NumericDate 형식 사용 |
| jti | JWT ID(식별자) (JWT Identifier) | JWT의 고유 식별자. 토큰 중복 사용(재사용 공격) 방지를 위해 사용됨 |
✔️ 공개 클레임
- 마음대로 정의 가능
- IANA에 등록된 공개 클레임 목록만 사용할 수 있음
JSON Web Token (JWT)
birth_middle_name Middle name(s) someone has when they were born, or at least from the time they were a child. This term can be used by a person who changes the middle name later in life for any reason. Note that in some cultures, people can have multiple
www.iana.org
✔️비공개 클레임
- 통신 간에 상호 합의되고 등록된 클레임과 공개된 클레임이 아닌 클레임
📌 서명
- 인코딩된 헤더, 인코딩된 내용, 비밀키, 헤더의 알고리즘 속성값을 가져와 생성됨
- 토큰의 값들을 포함해서 암호화하기 때문에 메시지가 도중에 변경되지 않았는지 확인할 때 사용됨
ex) HMAC SHA256 알고리즘을 사용한 서명 생성
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)'SPRING > Security' 카테고리의 다른 글
| Spring Security FilterChain (0) | 2025.11.19 |
|---|---|
| JWT 토큰 생성 과정 - Claims에 관하여 (0) | 2025.11.19 |
| 스프링 시큐리티 흐름 분석: DelegatingFilterProxy와 인증 체계 이해하기 (0) | 2025.10.28 |
| Spring Security 세션 Redis 저장 시 SerializationException 발생 원인과 해결 (0) | 2025.10.27 |
| 250919 (금) 스프링시큐리티 : JWT 로그인 / 정규표현식 (0) | 2025.09.19 |