JWT(2)

2021-03-16

JWT에 관해 간략하게 정리했습니다.


Payload

Payload 부분에는 토큰에 담을 클레임(Claim) 정보를 포함하고 있습니다.

Payload에 담는 정보의 한 ‘조각’ 을 클레임(claim) 이라고 부르고,

이는 name / value 의 한 쌍으로 이뤄져있습니다.

토큰에는 여러개의 클레임 들을 넣을 수 있고, 이 속성들을 클레임 셋(Claim Set)이라 부릅니다.

클레임 셋은 JWT에 대한 내용(토큰 생성자(클라이언트)의 정보, 생성 일시 등)이나

클라이언트와 서버 간 주고 받기로 한 값들로 구성됩니다.

클레임 의 종류는 다음과 같이 크게 세 분류로 나뉘어져있습니다:

  • 등록된 (registered) 클레임
  • 공개 (public) 클레임
  • 비공개 (private) 클레임

등록된 (registered) 클레임

등록된 클레임들은 서비스에서 필요한 정보들이 아닌,

토큰에 대한 정보들을 담기위하여 이름이 이미 정해진 클레임들입니다.

등록된 클레임의 사용은 모두 선택적 (optional)이며,

이미 정의된 클레임들로 무조건 따라야 하는 것은 아니지만 권장하고 있습니다.

  • iss: 토큰 발급자 (issuer)

  • sub: 토큰 제목 (subject)

  • aud: 토큰 대상자 (audience)

  • exp: 토큰의 만료시간 (expiraton), 시간은 NumericDate 형식으로 되어있어야 하며
    (예: 1480849147370) 언제나 현재 시간보다 이후로 설정되어있어야합니다.

  • nbf: Not Before 를 의미하며, 토큰의 활성 날짜와 비슷한 개념입니다.
    여기에도 NumericDate 형식으로 날짜를 지정하며, 이 날짜가 지나기 전까지는 토큰이 처리되지 않습니다.

  • iat: 토큰이 발급된 시간 (issued at), 이 값을 사용하여 토큰의 age 가 얼마나 되었는지 판단 할 수 있습니다.

  • jti: JWT의 고유 식별자로서, 주로 중복적인 처리를 방지하기 위하여 사용됩니다.

공개 (public) 클레임

JWT를 사용하는 사람들에 의해 정의되는 클레임입니다.

공개 클레임들은 클레임 충돌을 피하기 위해서 클레임 이름을 URI 형식으로 짓습니다.

{
  "https://junghyun100.github.io": true
}

비공개 (private) 클레임

등록된 클레임도아니고, 공개된 클레임들도 아닙니다.

양 측간에 (보통 클라이언트 <->서버) GUI, 서버, 그 외 모듈간에 협의하에 사용되는 클레임 이름들입니다.

공개 클레임과는 달리 이름이 중복되어 충돌이 될 수 있으니 사용할때에 유의해야합니다.

{
    "username": "junghyun100"
}

Signature

점(.)을 구분자로 해서 헤더와 페이로드를 합친 문자열을 서명한 값입니다.

헤더의 alg에 정의된 알고리즘과 비밀 키를 이용해 성성하고 Base64 URL-Safe로 인코딩합니다.

예를 들어 HMAC SHA256 알고리즘을 사용하려는 경우 서명은 다음과 같은 방식으로 생성됩니다.

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

서명은 메시지가 변경되지 않았음을 확인하는 데 사용되며,

개인 키로 서명 된 토큰의 경우 JWT의 발신자가 자신이 말하는 사람인지 확인할 수도 있습니다.

이렇게 3개에 대해서 하나씩 구하게 된다면,

(.)를 기준으로, 헤더 + 페이로드 + 서명을 합하면 우리가 알고있는 JWT 토큰의 형태가 됩니다.

참고자료

https://jwt.io/introduction/

VELOPERT.LOG

NHN Cloud