JWT(JSON Web Token)
은 당사자 간에 정보를 JSON 형태로 안전하게 전송하기 위한 토큰
JWT는 URL로 이융할 수 있는 문자열
로만 구성돼 있으며(HTTP 구성 요소중 어디든 위치 가능), 디지털 서명이 적용돼 있어 신뢰 가능
서버와의 통신에서 권한 인가
를 위해 주로 사용
JWT는 점( . ) 으로 구분된 아래의 세 부분으로 구성됨
JWT 헤더는 검증과 관련된 내용을 담고 있으며, 두가지 정보(alg
, typ
)를 포함 하고 있다
예제
{
"aig" : "HS256"
"typ" : "JWT"
}
aig에서는 해싱 알고리즘 지정
-> 보통 SHA256 또는 RSA 사용하며, 토큰을 검증할 때 사용되는 서명 부분에 사용
HS256은 HMACSHA256을 사용하겠단 의미
-> typ 속성에서는 토큰 타입 지정
완성된 헤더는 Base64Url 형식으로 인코딩돼 사용됨
JWT의 내용에는 토큰에 담는 정보를 포함, 여기 포함된 속성들을 클레임이라 함
크게 3가지로 구분
등록된 클레임(Registered Claims)
공개 클레임(Public Claims)
비공개 클레임(Private Claims)
등록된 클레임은 필수는 아니지만 토큰에 대한 정보 담기 위해 이미 이름이 정해져 있는 클레임 의미
등록된 클레임은 다음과 같이 정의돼 있음
iss
: JWT의 발급자(issuer) 주체를 나타냄. iss 값은 문자열이나 URI를 포함하는 대소문자를 구분하는 문자열sub
: JWT의 제목(Subject)aud
: JWT의 수신인(Audience), JWT는 처리하려는 각 주체는 해당 값으로 자신을 식별해야 하는데 처리할려는 주체가 aud 값으로 자신을 식별하지 않으면 JWT는 거부됨 exp
: JWT 만료시간(Expiration)nbf
: Not Before 의미iat
: JWT가 발급된 시간(issued at)jti
: JWT의 식별자(JWT ID)공캐 클레임은 키 값을 마음대로 정의할 수 있음(충돌이 안되는 범위 내)
비 공개 클레임은 통신 간에 상호 합의되고 등록된 클레임과 공개된 클레임이 아닌 클레임 의미
{
"sub" : "wikibooks payload",
"exp" : "1602076488",
"userId" : "wikibooks",
"username" : "flature"
}
JWT의 서명 부분은 인코딩된 헤더, 내용, 비밀키, 헤더의 알고리즘 속성값을 가져와 생성
서명은 토큰의 값들을 포함해서 암호화하기 때문에 메세지가 도중에 변경되지 않았는지 확인 할 때 사용
서명 생성 방식
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)
htts://jwt.io/#debugger-io