さっきJWTについての記事を書いたんですが、JWTとJWSの違いがよくわからんなと。なので少し調べてみました。
さっき書いた記事っていうのはこれ。
まず、JOSE(JSON Object Signed and Encription)という一連の仕様をまとめているものがあり、そこでJWTとJWSについて言及しています。
要約するとJOSEではJSONを基盤として署名済みオブジェクトフォーマット、暗号化済みフォーマット、鍵フォーマットの3つのフォーマットを定めているようです。それぞれのフォーマットはいかに列挙する名前で定義されています。
つまり、JOSEで署名済みフォーマットとして定められているものがJWSというわけですね。
それで、JWTはJOSEの文章の中でどのように言及されているかというと 5 Use Case の章の、5.1 Security Tokens のセクションで言及されています。
要約するとJWT (JSON Web Token)はJSONおよびJOSEをベースにしたセキュリティトークンフォーマットであり、JOSEのルールの上で成り立っているものと説明されているみたいです。つまり先にJWS(またはJWEなど)の仕様があり、その一つのユースケースとしてJWTがあると解釈ができるのかなと。そうなると、JWTを作成するということはJWSの仕様にも準拠しているということになりそうですね。
では、JWTはJWSの仕様とどう異なるのか?どう追加で仕様を加えているのか?という疑問が残るわけで、JWTとJWSのRFCを軽く読み比べてみました。
- JSON Web Signature RFC https://openid-foundation-japan.github.io/draft-ietf-jose-json-web-signature-14.ja.html
- JSON Web Token RFC https://openid-foundation-japan.github.io/draft-ietf-oauth-json-web-token-11.ja.html
JWTの概要に書いてあるのですが、JWTはJWSとJWE構造の両方の中にエンコードされるJSONオブジェクトとしてのクレームのセットを表す、ものらしいです。ここでクレームのセットとは何かというと、JSONでいうキーと値であり、JWTはこれらの仕様(いくつかの標準的なキーと値)を制定しています。JWTではこれらをそれぞれクレーム名、クレーム値と言うみたいです。それで、2つをまとめてクレーム、クレームを含むJSONをクレームセットというみたい。
つまり、JWSやJWEで定められている仕様の中で追加でJSONの項目を決めているのがJWSやJWEとJWTの違いになり、こうして作成するJWTはセキュリティトークンとして使う、っていうのがこれらの仕様の言っていることみたいですね。
また、JWSとJWTのRFCの中に例が示されているのですが、JWTではペイロードにクレームセット(JSON)をセットすると書いてある一方で、JWSでは任意のコンテンツなのでJSONである必要はない、と書いてあります。なので、JWSの仕様で作成されたものはペイロードには任意のコンテンツをセットしてよく、もちろんJWTで必須となっているクレームをセットする必要もないんだということになりそうですね。
ちょっとわかってきた気がしました。