reference
https://jwt.io/introduction/
JWT는 세가지로 구성.
xxxxx.yyyyy.zzzzz
타입과 어떤 알고리즘을 사용할지 기록하는 부분.
{
"alg": "HS256",
"typ": "JWT"
}
JSON은 Base64Url 로 인코딩돼서 xxxxx 자리에 들어간다.
본문에 해당하는 것. 이때 본문에 사용되는 key 들은 간결함을 위해 세글자 알파벳을 쓰는 걸 auth0 는 권장하는듯.
이중에 자신이 필요한것을 json 에 집어넣어서 payload 를 구성하면 된다.
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
Payload 도 Base64Url 로 인코딩돼서 yyyyy 자리에 들어간다. 단순히 base64 인코딩 하는거라, payload 가 길어질수록 jwt 의 길이도 길어진다.
Do note that for signed tokens this information, though protected against tampering, is readable by anyone. Do not put secret information in the payload or header elements of a JWT unless it is encrypted.
JWT 의 헤더나 페이로드에 암호화 없이 민감한 정보를 집어넣지 마라.
헤더와 페이로드, 그리고 secret 문자열을 합쳐 서명을 만든다.
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
시그니쳐는 위변조를 막고 커뮤니케이션 하는 사람이 제대로 된 사람인지 체크하기 위해 사용된다.
시그니쳐 문자열은 zzzzz 자리에 들어간다.
JWT 는 다음과 같은 형태가 된다.
인증과정에서 사용자가 크레덴셜을 통해 성공적으로 로그인하면 JWT 가 반환된다.
사용자가 인증이 필요한 라우팅에 접근하려면, Bearer 라는 구조의 헤더를 사용해야 한다.
Authorization: Bearer <token>
서버는 Authorization 헤더에 있는 토큰을 검증하고 제대로된 접근인지 판단한다.
이때 인증토큰에 기록된 내용은 사용자가 변경할 수는 없지만 사용자 또는 다른 이에게 노출될 수 있다.