회사에서 하고 있는 미니프로젝트에서 JWT 토큰을 사용할 일이 있는데,
사실 토큰이라는 것만 알지 제대로 알지 못해서 한번 정리해 보기로 했다.
JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact and self-contained way for securely transmitting information between parties as a JSON object.
공식 문서에 따르면 JWT는 JSON Web Token의 약자로 JSON 객체를 통해 안전하게 정보를 전송하기 위한 방식이라고 되어있다.
JWT는 주로 정보를 암호화하여 주고받을 때, 혹은 로그인 등의 인증이 필요할 때 사용한다.
JWT는 세 부분으로 이루어져 있으며 각 부분은 온점(.)에 의해 구분된다.
세 부분은 각각 다음과 같다.
따라서 JWT는 다음과 같은 구조를 가진다.
xxxxx(header).yyyyy(payload).zzzzz(signature)
Header는 주로 두 가지의 부분으로 이루어져 있다.
토큰의 타입과 암호화 알고리즘의 종류이다.
{
"alg": "HS256",
"typ": "JWT"
}
Payload는 claim들을 저장하고 있다. claim은 개체에 대한 정보(주로 사용자에 대한 정보)와 추가적인 정보를 가지고 있다. claim에는 세 가지 종류, registered, public, private이 있다.
registered
미리 정의된 claim들로 iss(발행자), exp(만료시간), sub(토큰 이름), aud(토큰 발행 대상) 등등이 있다.
public
사용자가 원하는 대로 사용할 수 있는 claim이다. 하지만 공개 claim이기 때문에, 충돌을 방지하기 위해 IANA JSON Web Token Registry에 정의된 것들을 사용하거나 충돌이 일어나지 않는 URI만 사용하여야 한다.
private
사용자가 직접 커스텀 할 수 있는 claim으로 registered와 public에 포함되지 않는 정보들을 포함하고 있다.
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
암호화된 Header와 payload, 암호화 알고리즘이 담겨있다.
Signature는 메세지가 전송 중에 변경되지 않았음을 판별하기 위해 사용한다.
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
공식 사이트(https://jwt.io/#debugger-io)에서 직접 토큰을 만들거나 해독해 볼 수 있다.
참고로 위의 이미지의 Payload에 보이는 iat는 발행시간을 뜻한다.
이유는 모르겠지만 공식 사이트에서 기본적으로 iat가 2018년 1월로 되어있기 때문에..--;;
공식 사이트에서 토큰을 발행할 때에는 iat를 조정하는 것을 추천한다.