
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
