JSON Web Token (JWT)은 웹표준 RFC 7519로 두 개체에서 JSON 객체를 사용하여 가볍고 self-contained 방식으로 정보를 안정성 있게 전달해 준다.


JWT 구조

aaaaa.bbbb.cccc
헤더  정보 서명

헤더

typ : 토큰의 타입을 지정

alg: 해싱 알고리즘을 지정

{
    "typ": "JWT",
    "alg": "HS256"
}


정보(payload)

정보의 한조각을 클레임이라고 부르고 이는 name/value 한 쌍으로 이루어져 있다. 토큰에는 여러개의 클레임 들을 넣을 수 있다.

클레임의 종료는 세 분류로 나뉘어져 있다.

등록된 (registered) 클레임,

공개(public) 클레임,

비공개(private) 클레임

1.등록된 클레임 : 토큰에 대한 정보들을 담기 위하여 이름이 이미 정해진 클레임. 사용은 모두 선택적(optional)


항목

  • iss : 토큰 발급자
  • sub: 토큰 제목
  • aud: 토큰 대상자
  • exp: 토큰의 만료시간, 시간은 NumericDate 형식으로 되어있어야 하며 언제나 현재 시간보다 이후로 설정되어 있어야 한다.
  • nbf: Not Before를 의미하며, 토큰의 활성 날짜와 비슷한 개념. 여기에도 NumericDate 형식으로 날짜를 지하며, 이 날짜가 지나기 전까지는 토큰이 처리되지 않는다.
  • iat: 토큰이 발급된 시간(issued at), 이 값을 사용하여 토큰의 age가 얼마나 되는지 판단할 수 있다.
  • jti: jwt의 고유 식별자로서, 주로 중복적인 처리를 방지하기 위하여 사용된다. 일회용 토큰에 사용하면 유용하다.


  1. 공개 클레임 : 충돌이 방지된 이름을 가지고 있어야하기 때문에 이름을 URI 형식으로 짓는다.
{
    " https://velopert.com/jwt_claims/is_admin": true
}


  1. 비공개 클레임 : 클라이언트와 서버 합의하에 사용되는 클레임 이름들. 이름이 중복되어 충돌이 될 수 있으니 사용할때에 유의해야한다.
{
    "username": "velopert"
}

ex) payload

{
    "iss": "velopert.com",
    "exp": "1485270000000",
    " https://velopert.com/jwt_claims/is_admin": true,
    "userId": "11028373727102",
    "username": "velopert"
}


서명

헤더의 인코딩 값과, 정보의 인코딩 값을 합친 후 주어진 비밀키로 해쉬를 하여 생성

다양한 언어로 지원되는 jwt


출처

https://jwt.io/ https://velopert.com/2389 https://github.com/jwtk/jjwt