JWT
JWT(Json Web Token) 이란 두 사용자간 데이터를 전송하는 과정에서 사용하는 Json Object 형식이다.
JWT가 사용되는 대표적인 예시는 Authorization으로 특정 요청을 한 유저가 해당하는 권한을 가지고 있는지 JWT의 검증을 통해 확인할 수 있다.
JWT의 구조
JWT를 프린트해보면 다음과 같은 형식으로 이루어져 있다.
`xxxxx.yyyyy.zzzzz`
JWT는 '.' 을 구분자로 사용하는데, 즉 `xxxxx`, `yyyyy`, `zzzzz`가 각자의 의미를 가지는 필드가 된다.
각 필드는 `Header`, `Payload`, `Signature` 에 해당한다.
Header
header는 일반적으로 2개의 파트로 나누어진다.
토큰의 타입, 그리고 signing에 사용된 알고리즘을 표기하는 두 개의 필드가 이에 해당한다.
헤더의 예시는 아래와 같다.
{
"alg" : "HS256",
"typ" : "JWT"
}
실제 JWT에는 위 내용이 Base64Url로 인코딩되어 존재한다.
Payload
JWT의 두 번째 파트는 payload이다. 이는 claim을 전달하는 역할을 하는데 claim이란 쉽게 말해서 내가 JWT를 통해서 전달하고 싶은 내용을 말한다.
이 claim에도 3가지 타입이 존재한다.
Registered claims
Registered claims란 미리 JWT에서 공식적으로 미리 정의해놓은 몇 가지 필드로, JWT를 정의하는데 있어 필수는 아니지만 권장되는 claim에 해당한다.
iss(issuer), exp(expiration time), sub(subject), aud(audience) 등이 이에 해당한다.
각 claim의 이름이 전부 3개의 글자로 이루어진 것을 확인할 수 있는데, 이는 JWT의 내용을 최대한 간결하게 하기 위해 의도된 설정이다.
Public claims
JWT를 사용하는 유저에 의해 정의된 claim이다. 다만 naming간 충돌을 막기 위해 https://www.iana.org/assignments/jwt/jwt.xhtml에 정의된 이름을 사용하거나 collision을 피하기 쉬운 URI로 이름을 정하는 것을 권장한다.
Private claims
이 파트는 custom claim으로 JWT를 주고받는 유저 간 정보를 공유하기 위해 만들어진 claim 유형이다.
Payload Example
payload의 예시는 아래와 같다.
{
"sub" : "12345",
"name" : "John",
"admin" : true
}
이후 위 json을 Base64Url로 인코딩하여 JWT의 두 번째 필드에 삽입한다.
Signature
signature필드를 만들기 위해서는 4가지의 준비물이 필요하다.
1. 인코딩된 header
2. 인코딩된 payload
3. secret
4. header에 명시된 algorithm
만약 HMAC SHA 256 algorithm을 사용할 경우 signature를 생성하는 과정은 다음과 같다.
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
이렇게 생성한 signature를 message가 전송과정에서 변조되지 않았음을 검증하기 위하여 사용된다.