JSON Web Token (RFC 7519)【JWT】

RFC7519参考

なんとなく日本語訳しているだけでほぼ個人用です。雑なので参考程度にしてください。

概要

JSON Web Token(JWT)は一連の要求をJSON Web Signature(JWS)やJSON Web Encryption(JWE)でエンコードしたJSONオブジェクトとして表現したものです。

JSONオブジェクトは0個以上のnameとvalueのペア(メンバーとも)で構成され、nameは文字列、valueは任意のJSON値です。また、JSONオブジェクトはJSON値やの前後に空白または改行を含みます。

JWT Claims Set(クレームセット)のメンバーのnameはClaim Names(クレーム名)と呼ばれ、対応する値はClaim Value(クレーム値)と呼ばれます。

暗号操作を記述するJOSE Header(Javascript Object Signing and Encryption)の内容はJWTクレームセットに適用されます。もしJOSE HeaderがJWSのための場合はJWTはJWSとして表現され、Claimsはデジタル署名されるかMessage Authentication Code(MAC)となります。JWTクレームセットはJWSペイロードです。JOSE HeaderがJWEのための場合はJWTはJWEとして表現され、クレームは暗号化され、JWTクレームセットはJWEにより暗号化された平文です。JWTは別のJWSやJWE構造で囲まれてネストされたJWTが作成されることもあり、ネストされた署名と暗号化を可能にします。

JWTはピリオド(.)で分けられたURL-safeなシーケンスとして表現されます。どの要素もbase64urlでエンコードされた値となります。JWTの要素数はJWSを用いたJWSコンパクトシリアライゼーションやJWEを用いたJWEシリアライゼーションの結果の表現に依存します。

JWTの例

次の例のJOSE HeaderはエンコードされたオブジェクトがJWTであり、JWTはHMAC SHA-256アルゴリズムで署名されたJWSです。

{“typ”:”JWT”,

“alg”:”HS256″}

上のオブジェクトのJSON表現における潜在的な曖昧さを除くために、実際のUTF-8表現のオクテットシーケンスは以下を含んでいます。

[123, 34, 116, 121, 112, 34, 58, 34, 74, 87, 84, 34, 44, 13, 10, 32,
34, 97, 108, 103, 34, 58, 34, 72, 83, 50, 53, 54, 34, 125]

JOSE HeaderのUTF-8表現のオクテットをエンコードするBase64urlは、このエンコードされたJOSE Headerの値を生成します。
eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9

以下はJWTクレームセットの例です。

{“iss”:”joe”,
“exp”:1300819380,
“http://example.com/is_root”:true}

上記のJWTクレームセットに対してこの例で利用されるUTF-8表現のオクテットシーケンスはJWSペイロードです。

[123, 34, 105, 115, 115, 34, 58, 34, 106, 111, 101, 34, 44, 13, 10,
32, 34, 101, 120, 112, 34, 58, 49, 51, 48, 48, 56, 49, 57, 51, 56,
48, 44, 13, 10, 32, 34, 104, 116, 116, 112, 58, 47, 47, 101, 120, 97,
109, 112, 108, 101, 46, 99, 111, 109, 47, 105, 115, 95, 114, 111,
111, 116, 34, 58, 116, 114, 117, 101, 125]

JWSペイロードをエンコードするBase64urlは、このエンコードされたJWSペイロードを生成します。

eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly
9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ

JWSで指定された方法でHMAC値をエンコードするHMAC SHA-256とbase64urlによって符号化されたJWSペイロードとJOSE HeaderのMACを計算すると、このエンコードされたJWS Signatureが生成されます。
dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk

ピリオドでこれらのエンコードされたパーツを連結すると、完全なJWTが得られます。

eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9
.
eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFt
cGxlLmNvbS9pc19yb290Ijp0cnVlfQ
.
dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk

個人的な勉強用なので気分で追記していきます