개요
JWT(JSON Web Token)은 선택적 서명 및 선택적 암호화를 사용해 데이터를 만들기 위한 인터넷 표준이다.
- 위키백과 (https://ko.wikipedia.org/wiki/JSON_웹_토큰)
JSON Object들을 HTTP Authorization 헤더나 URI query 파라미터를 통해 전송될 수 있는 base6로 인코딩된 문자열.
- 코드숨 JWT 만들기
JWT는 서버와 클라이언트간에 정보를 주고 받을 때 HTTP Request Header에 JSON 토큰을 넣은 후 서버는 별도 인증과정없이 헤더에 포함되어 있는 JWT 정보를 통해 인증 및 인가과정을 수행한다. 이 때 JSON 데이터는 URL-Safe(*URL에 포함할 수 없는 문자를 포함하지 않는 것) 하도록 URL에 포함할 수 있는 문자만으로 만든다.
JWS(JSON Web Signature)
JWE(JSON Web Encryption)
구조
JWT Structure
JWT는 dot(.)을 구분자로 3파트로 구분되어 있으며 각각의 파트를 Header, Payload, Signature라 부르며 각각 필요한 정보들을 담아 보관한다.
•
Header
: 토큰의 타입과 해시 암호화 알고리즘으로 구성되어 있다. 첫 째는 토큰의 유형을 나타내고 두 번째는 HMAC, SHA256또는 RSA와 같은 해시 알고리즘을 나타낸다.
Header는 typ와 alg 두 정보로 구성되는데, 여기서 alg는 Signature를 해싱하기 위한 알고리즘을 의미한다.
◦
typ: 토큰의 타입 지정(ex: JWT)
◦
alg: 알고리즘 방식을 지정하며, Signature와 토큰 검증에 사용한다.
{
"alg": "HS256",
"typ": JWT
}
JSON
복사
•
Payload
: 토큰에 담을 Claim 정보를 포함하고 있으며, Payload에 담는 정보의 한 조각을 Claim이라 부르고 이는 key/value pair로 이뤄져 있다. 여러 조각(claim)을 넣을 수 있다.
Claim은 Registered Claim, Public Claim, Private Claim 세 종류가 있다.
◦
Registrered Claim : 토큰 정보를 표현하기 위해 이미 정해진 종류의 데이터들
▪
iss: 토큰 발급자(issuer)
▪
sub: 토큰 제목(subject)
▪
aud: 토큰 대상자(audience)
▪
exp: 토큰 만료 시간(expiration), NumericData 형식
▪
nbf: 토큰 활성일(not before), 이 날이 지나기 전의 토큰은 활성화 안됌
▪
iat: 토큰 발급 시간(issued at): 토큰 발급 이후의 경과 시간을 알 수 있음
▪
jti: JWT 토큰 식별자(JWT ID), 중복 방지를 위해 사용하며 일회용 토큰(Access Token)등에 사용된다.
◦
Public Claim: 사용자 정의 Claim, 공개용 정보를 위해 사용된다. 충돌 방지를 위해 URI 포맷을 이용한다.
{
"https://catsbi.oopy.io": true
}
JSON
복사
◦
Private Claim: 사용자 정의 Claim, 서버와 클라이언트 사이의 임의로 지정한 정보를 저장한다.
{
"token_type": access
}
JSON
복사
•
Signature
: secret key를 포함하여 암호화되어 있다.
장/단점
장점
•
토큰 자체에 인증에 필요한 정보가 모두 있기에 별도의 인증 저장소가 필요 없다.
•
별도의 사용자 정보를 요청할 필요가 없기에 데이터 요청이 좀 더 가벼워 질 수 있다.
•
XML보다 덜 장황해서 인코딩 시 크기도 작아져 SAML보다 컴팩트하다.
•
분산/클라우드 기반 infra-structure에 대응하기 쉽다
•
URL 파라미터와 헤더로 사용한다.
•
수평 스케일이 쉽다.
•
트래픽에 대한 부담이 적다.
•
내장된 만료가 존재한다.
•
REST 서비스 제공이 가능하다.
단점
•
저장 할 필드 수에 따라 토큰이 커질 수 있다.
•
토큰이 클라이언트에 저장되어 데이터베이스에서 사용자 정보를 조작해도 토큰에 직접 적용할 수 없다
•
stateless앱 환경에서는 토큰이 대부분의 요청에 전송되기에 트래픽 크기에 영향을 줄 수 있다.