본문 바로가기

플밍 is 뭔들/그 외..

[JWT] JSON Web Token 소개 및 구조

※ JWT 정의
JSON Web Token(JWT) 은 웹표준(RFC7519) 으로서 두 개체에서 JSON객체를 사용하여 가볍고 자가수용적인(self-contained)방식으로 정보를 안정성 있게 전달해줍니다.
 
※ JWT 구조
Header, Payload, Signature
 
● Header
typ : 토큰 타입 지정
alg : 해싱 알고리즘 지정, 보통 "HMAC SHA25t6" 혹은 "RSA" 방식이 사용되며, 이 알고리즘은 토큰을 검증 할 때 Signature 부분에서 사용됩니다.  
{
    "typ" : "JWT"
    "alg" : "HS256"
}
 
● Payload
토큰에 담을 정보가 들어있습니다. 여기에 담는 정보의 한 '조각'을 클레임(claim) 이라고 부르고 이는 name/value의 한 쌍으로 이루어져있습니다.
토큰에는 여러개의 클레임들을 넣을 수 있습니다.
 
클래임의 종류는 크게 세가지로 나누어져 있습니다.
registered claim (등록된 클레임)
public claim (공개 클레임)
private claim (비공개 클레임)
 
- 등록된 클레임 (registered claim)
서비스에서 필요한 정보들이 아닌, 토큰에 대한 정보들을 담기위하여 이름이 이미 정해진 클레임들 입니다. 등록된 클레임들의 사용은 모두 선택적(optional)이며, 이에 포함된 클레임의 이름들은 다음과 같습니다.
iss : 토큰 발급자 (issuer)
sub : 토큰 제목 (subject)
aud : 토큰 대상자 (audience)
exp : 토큰의 만료시간 (expiraton), 시간은 NumericDate 형식으로 되엉있어야하며 (에: 1480849147370 ) 언제나 현재시간보다 이후로 설정되어있어야합니다.
nbf : Not Before 를 의미하며, 토큰의 활성 날짜와 비슷한 개념입니다. 여기에도 NumericDate 형식으로 날짜를 지정하며, 이 날짜가 지나기 전까지는 토큰이 처리되지 않습니다.
iat : 토큰이 발급된 시간 (issued at), 이 값을 사용하여 토큰의 age가 얼마나 되었는지 판단 할 수 있습니다.
jti : JWT의 고유 식별자로서, 주로 중복적인 처리를 방지하기 위하여 사용됩니다. 일회용 토큰에 사용하면 유용합니다.
 
- 공개 클레임 (public claim)
충돌이 방지된(collision-resistant)이름을 가지고 있어야합니다. 충돌을 방지하기 위해서는 클레임의 이름을 URI 형식으로 사용합니다.
{
    "https://xxxx.com/xxx/xxx" : ture
}
- 비공개 클레임 (private claim)
등록된 클레임도 아니고 공개된 클레임도 아닌 클레임으로써 양 측간에(클라이언트 <-> 서버) 협의하에 사용되는 클레임입니다. 공개 클레임과는 달리 이름이 중복되어 충돌이 일어날 수 있으니 주의해야 합니다.
{
    "username" : "Jone Doe"
}
 
● Signature
서명 부분으로써 헤더의 인코딩값과,정보(payload)의 인코딩값을 합친 후 주어진 비밀키로 해쉬를 하여 생성합니다.
서명을 만드는 수도코드(pseudocode)의 구조는 아래와같습니다.
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

 

JWT 토큰을 검증하고 생성 할 수 있게 해주는 디버거 서비스
Encoded -> Decoded / Decoded -> Encoded 모두 가능
 
※ https://jwt.io/ 로 보는 JWT의 형태
 
JWT는 위에서 말했듯이 header, payload, signature 세 파트로 구분되며, 각 파트는 위의 그림과 같이 점(.)에 의해 구분됩니다. (위 그림의 Encoded 부분 참조)