현대 웹서비스에서는 토큰을 사용하여 사용자들의 인증 작업을 처리하는 것이 가장 좋은 방법이다.

JWT(JSON Web Token)이란?

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