JWT란?
JWT는 Json Web Token의 약자이다.
Json 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token
웹에서 사용되는 JSON 형식의 토큰에 대한 표준 규격
사용자의 인증(authentication) 또는 인가(authorization) 정보를 서버와 클라이언트 간에 안전하게 주고받기 위해서 사용
모바일이나 웹의 사용자 인증을 위해 사용하는 암호화된 토큰을 의미
JWT 구조
JWT 구조는 Header, Payload, Signature로 구분된다.
Header, Payload, Signature는 모두 JSON 형식을 따르며 각 부분은 Base64로 인코딩 되어 표현된다.
Header, Payload, Signature의 각 부분을 이어 주기 위해 마침표 구분자를 사용해 구분한다.
Header
Header는 토큰의 타입을 정하는 부분과 사용될 서명 알고리즘을 정하는 2가지 부분으로 나누어진다.
서명 알고리즘은 HMAC SHA256 이나 RSA 같은 알고리즘을 사용할 수 있다.
토큰의 타입은JWT를 사용한다면 "JWT"로 설정해두어야 한다.
{
"alg": "HS256",
"typ": "JWT"
}
Payload
Payload는 claim을 포함한다.
claim은 객체와 추가적인 데이터에 대한 상태를 나타낸다
claim은 Registered, Public, Private으로 구분된다.
Registerd claim
필수적이지는 않지만 권장되는 미리 정의된 claim의 집합
토큰 정보를 표현하기 위해, 이미 정해진 종류의 데이터
공식적(표준)으로 사용되는 클레임
- iss : 토큰 발급자 (issuer)
- sub : 토큰 제목 (subject), 유니크한 값을 사용한다. (주로 사용자 이메일)
- aud : 토큰 대상자 (audience)
- exp : 토큰 만료 시간 (expiration), NumericDate 형식
- nbf : 토큰 활성 날짜 (not before), 해당 날이 지나기 전의 토큰은 활성화되지 않는다.
- iat : 토큰 발급 시간 (issued at), 토큰 발급 이후의 경과시간을 알 수 있다.
- jti : JWT 토큰 식별자 (JWT ID), 중복 방지를 위해 사용한다. 일회용 토큰(Access Token) 등에 사용된다.
{
"iss" : "holy-season",
"email" : "holy-season.gmail.com"
}
Public Claim
사용자 정의 클레임
공개용 정보를 위해 사용
충돌 방지를 위해, URI 포맷을 이용하거나 IANA JSON Web Token Registry를 이용
Private Claim
정보를 공유하기위해 정의할 수 있는 claim
서버와 클라이언트 사이에 임의로 지정한 정보를 저장
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
Payload나 Header에 있는 데이터는 누구나 읽을 수 있기 때문에 중요한 정보는 넣지 않도록 해야 한다.
Signature
인코딩 된 Header, Payload와 secret 키를 합쳐 해시화하여 Signature를 생성한다.
Signature는 메시지가 변경되지 않았다는 것을 검증하는 데에 쓰인다
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
ecoded(header).encoded(payload).Signature로 토큰이 생성되게 된다
참고 주소
https://taegyunwoo.github.io/tech/Tech_JWT
https://brunch.co.kr/@jinyoungchoi95/1
https://datatracker.ietf.org/doc/html/rfc7519
https://pronist.dev/143
https://www.daleseo.com/jwt/
https://tech.toktokhan.dev/2021/04/30/JWT/