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

반응형

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를 만듭니다.



반응형