구조#
.으로 구분된 세 부분
- Header
- Payload (정보)
- Signature (서명)
Header#
서명 알고리즘, 토큰 유형 ex)
{
"alg": "HS256",
"typ": "JWT"
}Base64Url로 인코딩됨
Payload#
클래임 (정보의 단위)
종류
- 등록된 클레임 (Registered Claims) : 이미 정해저 있는, JWT에 공통적으로 포함되는 클레임 필수❌
- 공개 클레임 (Public Claims) : 사용저 정의 클레임
- 비공개 클레임 (Private Claims) : 등록되지 않음, 두 개체가 합의해서 사용
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}해더와 같이 Base64Url로 인코딩됨
서명#
- 헤더와 페이로드를 Base64Url로 인코딩
- 인코딩된 헤더와 페이로드를 연결하고, 이를 비밀키 또는 개인키와 함께 해시 알고리즘을 사용
- 이 암호화된 값을 다시 Base64Url로 인코딩하여 서명 생성
ex
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)JWT는 암호화가 아니라 서명에 목적이 있다. BASE64로 인코딩하기 때문에, 토큰을 가지고 있다면 누구나 쉽게 읽을 수 있다. 따라서 민감한 정보는 ❌❌