JWT
란 Json포맷을 활용한 Claim기반의 웹 토큰이다. JWT는 Self-Contained 방식으로 토큰 자체를 정보로 사용하여 정보를 안전하게 전달하는게 특징이다. 일반적으로 클라이언트와 서버의 통신에서 Header에 포함시켜 보내며 권한 인가(Authorization)
의 목적으로 쓰인다.
Claim 기반?
클레임 기반은 key-value로 이루어진 구조라고 생각하면 된다.
JWT는
Header
, Payload
, Signature
3부분으로 구성 되어있으며, .
을 구분자로 사용하고 각 부분은 Base64URL-Salf로 인코딩 돼있다.
Base64 vs Base64URL-Salf
Base64 URL-Safe 인코딩은 기본 Base64 인코딩에서 '+'(plus)는 '-'(minus)로, '/'(slash)는 '_'(underscore)로 대체된 인코딩 방법으로 JWT를 URI파라메터로 사용 할 수 있도록 했다.
{
"alg": "ES256",
"kid": "JWT"
}
헤더는 JWT를 어떻게 검증하는가에 대한 내용을 담고 있다. alg
는 서명 시 사용하는 알고리즘, kid
는 서명 시 사용하는 키(Public/Private Key)를 식별하는 값이다.
{
"iss": "no-int",
"iat": "1586364327"
}
내용을 당당하고 있는 부분이다. 페이로드의 속성 값들을 ClaimSet이라고 부르며 클라이언트와 서버 간 주고 받기로 약속한 값들로 구성된다.
페이로드를 구성하는 클레임은 등록클레임
과, 공개 클레임
으로 구분된다. 등록 클레임은 토큰 정보를 표현하기 위해 이미 정해진(약속된) 종류의 데이터이며, 공개 클레임은 사용자가 정의한 클레임 값이다.
등록 클레임 값
- iss : 토큰 발급자(issuer)
- sub : 토큰 제목(subject)
- aud : 토큰 대상자(audience)
- exp : 토큰 만료 시간(expiration), 숫자로 표시
- nbf : 토큰 활성 날짜(not before), 이 날이 지나기 전의 토큰은 활성화되지 않음
- iat : 토큰 발급 시간(issued at), 토큰 발급 이후의 경과 시간을 알 수 있음
- jti : JWT 토큰 식별자(JWT ID), 중복 방지를 위해 사용하며, 일회용 토큰(Access Token) 등에 사용
헤더와 페이로드를 합친 문자열을 서명한 값이다. 헤더에 정의된 alg알고리즘과 비밀키를 사용해서 생성 후 인코딩한다.
한 줄평 : 공식 사이트 https://jwt.io/ 에서 Header, Payload, Signature를 사용해서 토큰을 바로 만들어 볼 수 있다.
참고 -
https://meetup.nhncloud.com/posts/239
http://www.opennaru.com/opennaru-blog/jwt-json-web-token/
https://mangkyu.tistory.com/56