Search
Duplicate

JWT(JSON Web Token)

개요

JWT(JSON Web Token)은 선택적 서명 및 선택적 암호화를 사용해 데이터를 만들기 위한 인터넷 표준이다. - 위키백과 (https://ko.wikipedia.org/wiki/JSON_웹_토큰)
JSON Object들을 HTTP Authorization 헤더나 URI query 파라미터를 통해 전송될 수 있는 base6로 인코딩된 문자열. - 코드숨 JWT 만들기
JWT는 JSON 포맷을 이용해 인증정보와 같은 사용자에 대한 정보를 저장하는 Claim 기반의 Web Token이며 RFC7519 표준이다.
JWT는 서버와 클라이언트간에 정보를 주고 받을 때 HTTP Request Header에 JSON 토큰을 넣은 후 서버는 별도 인증과정없이 헤더에 포함되어 있는 JWT 정보를 통해 인증 및 인가과정을 수행한다. 이 때 JSON 데이터는 URL-Safe(*URL에 포함할 수 없는 문자를 포함하지 않는 것) 하도록 URL에 포함할 수 있는 문자만으로 만든다.

JWS(JSON Web Signature)

JSON 데이터 구조를 사용하는 서명 표준으로 RFC7515이며, JSON으로 전자 서명을 하여 URL-Safe 문자열로 표현한 것.

JWE(JSON Web Encryption)

JSON 데이터 구조를 사용하는 암호화 방법으로 RFC7516이며, JSON을 암호화하여 URL-safe문자열로 표현한 것.

구조

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앱 환경에서는 토큰이 대부분의 요청에 전송되기에 트래픽 크기에 영향을 줄 수 있다.

관련 포스팅

참고