JWTとJWSの違いとは?

さっきJWTについての記事を書いたんですが、JWTとJWSの違いがよくわからんなと。なので少し調べてみました。

さっき書いた記事っていうのはこれ。

まず、JOSE(JSON Object Signed and Encription)という一連の仕様をまとめているものがあり、そこでJWTとJWSについて言及しています。

要約するとJOSEではJSONを基盤として署名済みオブジェクトフォーマット、暗号化済みフォーマット、鍵フォーマットの3つのフォーマットを定めているようです。それぞれのフォーマットはいかに列挙する名前で定義されています。

  • 署名済みフォーマット:JWS(JSON Web Signature)
  • 暗号化済みフォーマット:JWE(JSON Web Encription)
  • 鍵フォーマット:JWK(JSON Web Key)

つまり、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を軽く読み比べてみました。

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で必須となっているクレームをセットする必要もないんだということになりそうですね。

ちょっとわかってきた気がしました。