JWT는 Header, Payload, Signature로 이뤄져있고,
(Header Encode Url).(Payload Encode Url).(Signature Encode Url)
형식으로 '.'을 기준으로 구분됩니다.
Header에는 두가지 정보를 가지고 있습니다.
{
"alg": "HS256",
"typ": "JWT"
}
그런 다음이 JSON은 Base64Url로 인코딩되어 JWT의 첫 번째 부분을 형성합니다.
Payload는 토큰에 담을 정보가 들어있고, 이는 3가지의 클레임 종류로 구분됩니다.
{
"iss": "velopert.com", //Registered claims
"exp": "1485270000000", //Registered claims
"https://velopert.com/jwt_claims/is_admin": true, //Public claims
"userId": "11028373727102", //Private claims
"username": "velopert" //Private claims
}
그런 다음이 JSON은 Base64Url로 인코딩되어 JWT의 두 번째 부분을 형성합니다.
인코딩 후에 생성되는 '=' 패딩문자는 url-safe하지 않으므로 제거해줘야합니다.
Signature는 메시지가 변경되지 않았음을 확인하는 데(무결성 확인) 사용되며 개인 키로 서명 된 토큰의 경우 JWT의 발신자가 자신이 말하는 사람인지 확인할 수도 있습니다.
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
앞서 설명한 구조로 생성된 JWT는 어떻게 Verify할까?? RFC7519 문서를 참고해서 간략히 설명해보겠습니다.
SWT (Simple Web Tokens) 및 SAML (Security Assertion Markup Language Tokens)과 비교할 때 JSON 웹 토큰 (JWT)의 이점에 대해 이야기 해 보겠습니다.
JSON은 XML보다 장황하지 않기 때문에 인코딩 될 때 크기도 작아 져 JWT가 SAML보다 더 간결합니다. 따라서 JWT는 HTML 및 HTTP 환경에서 전달하기에 좋은 선택입니다.
보안 측면에서 SWT는 HMAC 알고리즘을 사용하는 공유 비밀에 의해서만 대칭 적으로 서명 될 수 있습니다. 그러나 JWT 및 SAML 토큰은 서명을 위해 X.509 인증서 형식의 공개 / 개인 키 쌍을 사용할 수 있습니다.
모호한 보안 허점을 도입하지 않고 XML 디지털 서명으로 XML에 서명하는 것은 JSON 서명의 단순성과 비교할 때 매우 어렵습니다.
JSON 파서는 객체에 직접 매핑되기 때문에 대부분의 프로그래밍 언어에서 일반적입니다. 반대로 XML에는 자연스러운 문서 대 개체 매핑이 없습니다. 따라서 SAML 어설 션보다 JWT로 작업하기가 더 쉽습니다.
사용과 관련하여 JWT는 인터넷 규모로 사용됩니다. 이는 여러 플랫폼, 특히 모바일에서 JSON 웹 토큰의 클라이언트 측 처리 용이성을 강조합니다.
JWT는 흔하게 접근할 수 있고 많이 사용되는 것이기 때문에 명확히 JWT를 학습하고 넘어가면 좋을 것 같다는 생각을 하여 이렇게 정리를 하게되었습니다. 내용이 많이 생략된 부분이 있기 때문에 JWT Documentation에서 꼭 확인하시면서 RFC문서들도 함께 확인해보시면 좋을 것 같습니다 !
참고
https://jwt.io/introduction
https://tools.ietf.org/html/rfc7519
https://tools.ietf.org/html/rfc7515
https://tools.ietf.org/html/rfc7516
https://medium.facilelogin.com/jwt-jws-and-jwe-for-not-so-dummies-b63310d201a3