소행성이야기

JWT의 구조는 어떻게 생겼을까?

소행성왕자 2018. 7. 9. 09:24

JWT의 구조는 어떻게 생겼을까?


JWT의 구조

JWT는 API 인증 등에 사용하는 토큰이므로 스펙에 인증하는 방법에 대한 내용은 적혀있지 않고

토큰을 어떻게 만들고 검증하는지에 대해서 나와 있습니다.


일단 JWT 로 만들어진 토큰은 아래와 같습니다.

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyaWQiOiJrZXJpYXMiLCJpYXQiOjE1MzEwOTQ0MDMsImV4cCI6MTUzMTA5NDQ2M30.aq-Y2xsjljM72LIqCz8i1Tm4FSTqdnGZ_OBtOkbuA3A


자세히 보면 마침표(.)를 구분자로 세 부분으로 나누어져 있는데 

이 3가지 부분을 각각 

JOSE 헤더(JSON Object Signing and Encryption)

JWT Claim Set

Signature 라고 부릅니다.

https://jwt.io/ 사이트 디버거로 JWT 토큰을 디코딩한 모습니다.


첫번째  JOSE 헤더는

JOSE 헤더는 JWT 토큰을 어떻게 해석해야 하는지를 명시한 부분입니다.

이 헤더를 열어보고 이어서 설명할 JWT Claim Set이나 Signature를 어떻게 해석할지를 알 수 있어요

JOSE 헤더의 값이 '{"typ":"JWT","alg":"HS256"}'라고 한다면 이를 base64로 인코딩해서 JOSE 헤더를 생성합니다.

이 예제에서는 JWT 타입이고 토큰에 사용한 알고리즘은 HS256 즉, HMAC SHA-256이라는 의미입니다.

HS256 외에도 HS512, RS256(RSASSA SHA-256), ES256(ECDSA P-256 curve SHA-256) 등의 알고리즘을 사용할 수 있습니다.


두번째 JWT Claim Set

WT Claim Set은 실제 토큰의 바디로 토큰에 포함할 내용을 넣습니다.


iss: 토큰 발급자 (issuer)

sub: 토큰 제목 (subject)

aud: 토큰 대상자 (audience)

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

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

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

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


세번째 Signature

JOSE 헤더와 JWT Claim Set은 암호화를 한 것이 아니라 단순히 JSON문자열을 base64로 인코딩한 것 뿐입니다.

그래서 누구나 이 값을 다시 디코딩하면 JSON에 어떤 내용이 들어있는지 확인할 수 있습니다.

토큰을 사용하는 경우 이 토큰을 다른 사람이 위변조할 수 없어야 하므로 JOSE 헤더와 JWT Claim Set가 위변조되었는지를

검증하기 위한 부분이 Signature 부분입니다.

JOSE 헤더와 JWT Claim Set는 JOSE 헤더와 JWT Claim Set를 base64로 인코딩해서 만든 두 값을 마침표(.)로 이어 붙이고

JOSE 헤더에서 alg로 지정한 알고리즘 HS256 즉, HMAC SHA-256으로 인코딩하면 JWT 토큰의 세 번째 부분인 Signature를 만듭니다.