현대 웹서비스에서는 토큰을 사용하여 사용자들의 인증 작업을 처리하는 것이 가장 좋은 방법이다.
JWT는 일반적으로 클라이언트와 서버, 서비스와 서비스 사이 통신 시 권한 인가(Authorization)을 위해 사용하는 토큰.
URL에 대해 안전한 문자열로 구성되어 있기 때문에 HTTP 어디든(URL, Header,...) 위치할 수 있다.
HEADER.PAYLOAD.SIGNATURE
헤더 . 페이로드 . 서명 // 세 부분을 점(.)으로 구분하는 구조
Header
JWT를 검증하는데 필요한 정보를 가진 JSON 객체는 Base64 URL-Safe 인코딩 된 문자열이다. 헤더(Header)는 JWT를 어떻게 검증(Verify)하는가에 대한 내용을 담고 있다. 참고로 alg는 서명 시 사용하는 알고리즘이고, kid는 서명 시 사용하는 키(Public, Private Key)를 식별하는 값이다.
/*
* Header = JWT를 어떻게 검증(Verify)하는가에 대한 내용
*/
{
"alg" : "ES256", // 서명 시 사용하는 알고리즘
"kid" : "key ID" // 서명 시 사용하는 키(pub,pri)를 식별하는 값
}
위와 같은 JSON 객체를 문자열로 직렬화하고 UTF-8과 Base64 URL-Safe로 인코딩하면 다음과 같이 헤더를 생성할 수 있다.
Base64URLSafe(UTF-8('{"alg": "ES256", "kid": "Key ID"}')) -> eyJhbGciOiJFUzI1NiIsImtpZCI6IktleSBJRCJ9
Payload
JWT의 내용이다. 페이로드(Payload)에 있는 속성들을 클레임 셋(Claim Set)이라 부른다. 클레임 셋은 JWT에 대한 내용(토큰 생성자(클라이언트)의 정보, 생성일시 등)이나 클라이언트와 서버 간 주고 받기로 한 값들로 구성된다.
/*
* Payload = 토큰 생성자(클라이언트)의 정보, 생성 일시 등이 담김
* = JWT의 내용
*/
{
"iss" : "yuri.ji",
"iat" : "1586264327"
}
위와 같은 JSON 객체를 문자열로 직렬화하고 Base64 URL-Safe로 인코딩하면 다음과 같이 페이로드를 생성할 수 있다.
Base64URLSafe('{"iss": "jinho.shin","iat": "1586364327"}') -> eyJpYXQiOjE1ODYzNjQzMjcsImlzcyI6ImppbmhvLnNoaW4ifQ