※ 참고 자료
JWT.IO - JSON Web Tokens Introduction
[Server] JWT(Json Web Token)란?
JSON Web Token (JWT) 는 웹표준(RFC 7519)으로서 두 개체에서 JSON 포맷을 사용하여 가볍고 수용적인 자가수용(self-contained) 방식으로 정보를 안전하게 전달한다. 주로 회원 인증과 두 개체 사이에서 정보 전달을 할때 사용 된다.
JWT는 필요한 모든정보를 자체적으로 지니고 있다. JWT 시스템에서 발급된 토큰은 토큰에 대한 기본정보, 전달 할 정보, 토큰이 검증되었다는 것을 증명해 주는 signature 를 포함하고 있다.
JWT는 자가 수용적(self-contained)적이기 때문에 두 개체에서 손쉽게 전달 될 수 있다. 웹서버의 경우 HTTP 헤더에 넣어서 전달 또는 URL의 파라미터로 전달 할 수 있다.
JWT 토큰은 .
을 구분자로 3가지 문자열로 구성되어 있다.
헤더 (Header)
Header는 typ와 alg 두가지로 구성 되어 있다.
HAMAC SHA256
, RSA
을 사용한다. 이 알고리즘은 토큰을 검증 할 때 사용되는 signature 부분에 사용.{
"alg": "HS256",
"typ": "JWT"
}
내용 (Payload)
Payload는 토큰에 담을 정보가 들어 있습니다. 여기에 담는 정보의 한 조각을 'claim' 이라고 부르고, 이는 Key / Value의 한 쌍으로 이루어져 있다. 토큰에는 여러 클레임들을 넣을 수 있다.
Claim의 분류는 총 세가지로 이루어져 있다.
등록된 클레임 (Registered Claim)
등록된 클레임은 토큰에 대한 정보를 담기위한 미리 정의된 클레임의 집합이다. 등록된 클레임의 사용은 선택적으로 사용 가능하지만 사용하는 것을 권장한다.
ex :1480849147370
) 형식이어야 하며 언제나 현재 시간 이후여야 한다.공개 클레임 (Public Claim)
공개 클레임은 사용자 정의 클레임으로. 공개용 정보 전달을 위해 사용된다. 충돌 방지를 위해 URI 포맷을 이용해야 한다.
{
"https://tandohak.co.kr/is_authenticated": true
}
비공개 클레임 (Private Claim)
비공개 클레임은 등록된 클레임도 아니고, 공개 클레임도 아닌 당사자간에 정보를 공유하기 위해 만들어진 사용자지정 클레임이다. 공개 클레임과 달리 이름이 중복되어 충돌이 될 수 있으니 유의 해야 한다.
{
"username": "tandohak"
}
페이로드의 예제
{
"iss": "tandohak.co.kr", // 등록된 클레임
"exp": "1485270000000", // 등록된 클레임
"https://tandohak.co.kr/is_authenticated": true, // 공개 클레임
"username": "tandohak" // 비공개 클레임
}
서명 (Signature)
서명은 토큰을 인코딩하거나 유효성 검증을 할 때 사용하는 고유한 암호화 코드이다. 서명은 위서 만든 헤더와 페이로드의 값을 각각 BASE64로 인코딩 하고, 인코딩 한 값을 비밀 키를 이용하여 헤더에서 정한 알고리즘으로 해싱을 하고, 이 값을 다시 BASE64로 인코딩 하여 생성한다.
JWT 토큰의 예시
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c