토큰의 종류, 사용된 서명 알고리즘 등을 담고 있음
예시)
{
"alg": "HS256",
"typ": "JWT"
}
Base64 인코딩된다.
사용자에 대한 정보를 의미하는 Claim들을 담고 있음, Claim의 종류에는 크게 세 가지가 있음
필수는 아니지만 정보를 두는 것이 recommended되는 것들
iss(issuer)
expr(expiration time)
sub(subject)
aud(audience)
...
*JWT는 용량을 줄이기 위해 Registerd claim 이름들이 모두 3글자이다.
These can be defined at will by those using JWTs. But to avoid collisions they should be defined in the IANA JSON Web Token Registry or be defined as a URI that contains a collision resistant namespace.
These are the custom claims created to share information between parties that agree on using them and are neither registered or public claims.
Payload 부분도 Base64 인코딩된다.
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
*알고리즘은 HMACSHA256이 아닌 다른 것으로 달라질 수도 있다.(RSA, ESDSA 공개키/개인키 기반으로 정보 교환용으로 JWT는 사용될 수 있다.)
이러한 Signature 부분은 메시지가 통신 도중 변조되지 않았고, private key로 서명된 경우에는 JWT Sender가 JWT에 드러난 자신이라는 것을 증명한다.
그리고 최종 JWT의 모양은
Encoded Header.Encoded Payload.Signature
이다. 각 부분 사이에 점을 붙인다.
서버에서 보내줄 때는
HTTP/1.1 200 OK
Set-Cookie: access_token=abc~; Path=/; Domain=bar.com; expires=Thu, 01 Jan 2050 00:00:00 GMT;
...
이런 식으로 리스폰스의 바디에 담아서 보내준다. 그리고 이렇게 토큰을 받은 클라이언트는
...
Authorization: Bearer <token>
...
리퀘스트의 헤더에 Authorization 헤더를 두고, 거기 부분에 넣어서 서버로 보낸다.
로그아웃할 때는 서버에서
Set-Cookie: access_token=''; Path=/;
이런 식으로 비워서 보내준다.