JSON Web Signature (JWS) の標準化がIETFで始まっています

JSON Web Signature という、JSON に署名をつけるための標準化が、IETFのJOSE Working Group で始まっています[1]。

初期ドラフトは

です。

私の名前も出ていますが、これは、 OpenID Foundation の AB/C Working Group で検討していたものをIETFに持ち込んだためです[2]。

@ritou さんが、「OAuth 2.0時代の署名つきリクエストとは」というエントリで触れられていますが、Facebook の signed_request によく似ています。

大きな違いは、signed_request が

署名 . 本文

の形式になっているのに対して、JWSでは、

ヘッダ . 本文 . 署名

になっています。これには理由があります。

なぜ、「ヘッダ . 本文 . 署名」か?

世界の覇者、Facebook と同じにすればよいじゃないかという意見もあるかとは思いますが、このような形式になったのには、まっとうな論理的な理由があります。

ヘッダが分かれている理由

signed_request の場合、署名パラメータを本文に含めてしまっています。本文を暗号化したい場合、このアプローチはとれません。復号するためのパラメータまで暗号化されてしまうからです。したがって、ヘッダ部にこれら暗号関連パラメータを分離しておく必要があります。

JWSはJWEとできるだけ共通化するようにしています。そのため、ヘッダを分離する必要がありました。

署名が最後部にある理由

見た目上のもうひとつの大きな違いは、signed_request では、署名が最初にあるのに対して、JWSでは署名が最後にあることです。JWSでは、署名作成をストリーミングするために、署名を最後にしてあります。これは、署名を最初につけようとすると、署名処理が終わるまで全データをバッファしておいて、署名が終わってから「署名.本文」のように送り出さなければならないのに対して、書名を最後にすると、どんどんデータを送り出してしまってよいので、全データをバッファする必要が無く、サーバリソースに対して「やさしい」からです。signed_requestのように、きめ打ちな小さなデータにしか署名しないのであれば大差ありませんが、JWSは巨大なデータに署名することも考えられますので、このような配慮がなされています。

共通の特徴

singed_request, JWS 共通の特徴もあります。代表的なものは、

  • データの正規化は行わない
  • シリアライゼーションには、base64url を使う
  • データ形式には JSON を利用する
  • 任意のデータに署名をかけることができる

データの正規化は行わない

XML Digital Signature という規格があります。非常に汎用的で柔軟です。しかし、異なる実装間での互換性が低いと言われ続け、多くの開発者から嫌われてきました。最大の理由は、XMLデータの正規化だと思われます。signed_request も JWS も、この問題を避けるために、一切の正規化を行いません。もとデータそのものをそのまま使います。

シリアライゼーションには、base64urlを使う

なぜ base64 ではなく、base64url を使うのかというのもよく聞かれます。答えは、「base64には “=”など Web Safe でない文字が含まれるから」です。JWSは、HTTPのヘッダにいれたり、GETやPOSTのパラメータに入れたりします。そのときにいちいち「=」をエスケープするよりも、「=」によるパディングをしないほうがよいでしょう。

データ形式にはJSONを利用する

XMLでなくJSONを利用するのは、JSONの方がコンパクトで、処理に当たってのパフォーマンスもだしやすく、何よりも開発者の方々に人気があるからです。

任意のデータに署名をかけられる

一応、JSONに対する署名の方式となっていますが、JSONのパラメータのひとつに、base64urlエンコーディングしたデータを入れるだけで、任意のデータに署名可能です。

誰がJWSを使うの?

なぜこのような違いがあるのかは、お分かりいただけたと思います。しかし「Facebookが使わないんじゃ、意味ないじゃない?」とお思いになるかもしれません。これについては、次のようにお答えしようと思います。

まず、Facebookが使わないと決めたわけではありません。彼らは現在の signed_request で満足しており、その用途でJWSを使う必要を感じていないだけです。ほかの用途では利用するかもしれません。また、長期的に JWS が一般的になれば、「開発者にやさしい」Facebook としては、追加サポートもありえるのではないでしょうか?

また、Facebookが使わないとしても、多くのプレイヤーが利用することが期待されています。現状では、マイクロソフト、グーグル、セールスフォース、AOL、eBay などです。

いつ対応したらよいの?

JWSは比較的錬度が高いと思います。実際に、Google や eBay などは実装しています。ですから、多少の変更があることに目をつぶれば、今フォローを始めてもよいと思います[3]。皆さんも、署名ニーズがあったら、JWSを使うことを考えてみてください。

[1] 同時に、JSON Web Encryption という暗号化の標準化も始まっています。

[2] OpenID Connect など Identity 標準で使うだけでなく汎用的に使いうるので、IETFで標準化することにしました。同様にして持ち込んだ仕様に JSON Web Token、Simple Web Discovery があります。

[3] 一方、JWEはこれからちょっとした手術にかかります。具体的には、CBCモードを使っている場合に、Integrity Check を MUST で追加するようにします。なので、次のドラフトまで

「JSON Web Signature (JWS) の標準化がIETFで始まっています」への1件の返信

  1. 半構造データ表現に正規化を掛けるってのは筋の悪い話なんでしょうかねぇ。JSONオブジェクト同士の一致不一致を高速に比較するためにハッシュを取りたくて正規化しようと思ったんですが…

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください