이러한 기록과 일부 표준을 기반으로 위의 JWT를 어떻게 처리할 수 있으며 이는 어떤 정보를 보유하고 있을까요?
위의 JWT는 점(‘.’)으로 각각 구분된 세 부분으로 구성됩니다.
- 헤더: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
- 페이로드: eyJzdWIiOiIxMjM0NTY3ODkwQUJDIiwibmFtZSI6IkhlbnJpayBMb2VzZXIiLCJpYXQiOjE2MTExNDA0MDAsImV4cCI6MTYxMTIzNDU2N30
- 서명: _iVbBcypdse-9sjrxp9iOrGsXKBWrBB3mrHgBtukcfM
헤더와 페이로드는 모두 base64url로 인코딩되며 가능한 패딩을 고려하지 않고 다음과 같이 디코딩할 수 있습니다.
henrik@home> base64 -d <<< eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
{"alg":"HS256","typ":"JWT"}
henrik@home> base64 -d <<< eyJzdWIiOiIxMjM0NTY3ODkwQUJDIiwibmFtZSI6IkhlbnJpayBMb2VzZXIiLCJpYXQiOjE2MTExNDA0MDAsImV4cCI6MTYxMTIzNDU2N30
{"sub":"1234567890ABC","name":"Henrik Loeser","iat":1611140400,"exp":1611234567}base64: invalid input
헤더에는 사용된 알고리즘 정보가 포함되어 있으며, 여기서는 HS256(HMAC SHA256)을 사용합니다. 페이로드는 액세스/리프레시/ID 등의 토큰 유형에 따라 달라지며, 클레임으로 구성됩니다.이러한 사전 정의된 JOSE 헤더 및 페이로드 필드는 IANA에 의해 관리됩니다. 위의 예에서 필드와 클레임은 subj(ect), name, issued at (iat) 및 exp(iration time)입니다.
서명은 명시된 알고리즘을 헤더, ‘.’ 및 페이로드의 연결에 적용한 다음 결과를 인코딩하는 base64url을 적용하여 계산됩니다. 그런 다음 점으로 구분된 세 부분이 JWT를 구성합니다. 서명이 파생되는 방법에 대한 자세한 내용은 RFC 7515에 정의되어 있습니다.
JWT.io에서 이 JWT를 온라인 디버거로 확인해보실 수 있습니다. 처음에는 “Invalid Signature”(잘못된 서명)라는 메시지가 표시됩니다. 기본 시크릿 값을 !!!my-really-big-256-bit-secret!!!로 바꾸면 문제를 해결할 수 있습니다.