世界を動かす技術を、日本語で。

JSON Web Tokenの10年と未来への準備

2025年5月26日原文(self-issued.info)

概要

  • JWT(JSON Web Token) が2015年5月に RFC 7519 として正式化
  • JWTを含む一連の JOSE関連RFC が同時公開
  • OpenID Connect との共同設計と幅広い用途での普及
  • 継続的な セキュリティ強化 とベストプラクティスの更新
  • 今後10年の進化と利用拡大への期待

JWTとJOSE標準の10年

  • 2015年5月、 JWT(JSON Web Token)RFC 7519 として標準化
  • 4.5年 に及ぶ設計・議論による成果
  • 同時に公開された JOSE関連RFC 一覧
    • RFC 7515: JSON Web Signature (JWS)
    • RFC 7516: JSON Web Encryption (JWE)
    • RFC 7517: JSON Web Key (JWK)
    • RFC 7518: JSON Web Algorithms (JWA)
    • RFC 7519: JSON Web Token (JWT)
    • RFC 7520: JOSEによる署名・暗号化例
    • RFC 7521: OAuth 2.0 Assertion Framework
    • RFC 7522: SAML 2.0 Profile for OAuth 2.0
    • RFC 7523: JWT Profile for OAuth 2.0
  • OpenID Connect との共同設計
  • 汎用性広範な採用実績 による成功
  • 「標準が成功した証は、想定外の用途でも使われること」という評価

JWTの普及と影響

  • JWT と関連仕様は、現代のオンラインセキュリティに不可欠な存在
  • OAuthOpenID ConnectJOSE コミュニティの貢献
  • 新たなユースケース業界標準 としての地位確立
  • 電話詐欺対策 など、想定外の分野でも活用

セキュリティ強化とベストプラクティス

  • 5年前に公開された JWT Best Current Practices(BCP)
    • 実運用 から得られた知見を集約
    • 落とし穴推奨事項 を明記
  • Yaron ShefferDick Hardt との共同でBCPを アップデート中
    • 新たな脅威対策 を追加
    • 最新版は JWT Best Current Practices specification で公開
  • Brian CampbellChuck Mortimore らと RFC7523bis も更新
    • トークンのaudience値の曖昧さ による脆弱性対策

今後への展望

  • John BradleyNat Sakimura との共同開発への感謝
  • OAuthJOSEOpenID Connect ワーキンググループの貢献
  • 今後10年 の進化と新たな活用分野への期待

Hackerたちの意見

標準が成功した証拠の一つは、発明者が想像もしなかった用途に使われることだと言われてるよね。それは確かに、何かの有用性や多様性の証だよ。おめでとう!

ハッカーニュースでJWTやOAuthに関する記事を探すと、何百ものコメントが循環論争をしてるのが見つかるよ。人々はこの二つを分けるのがなかなかできないみたい。

サーバー間でのJWTは好きだけど、サーバーとクライアント間だと結局クッキーやセッションを再作成することになるよね。あくまで私の経験/意見だけど、他の人の意見も聞きたいな。

一般的に、クッキーはドメイン間で再利用できないんだ。ブラウザがどのドメインにどのクッキーを送るかを制御してるからね。それに、クッキーは暗号的に署名されてないから、クライアントやブラウザによって簡単に偽造されちゃう。一方、JWTはドメインを越えて使えるから、あるドメインで発行されたIDPのJWTを別のドメインでも信頼できるんだ。暗号署名はデータの整合性を確認するのに役立つし、セッションは通常、一つのバックエンドやアプリケーションサーバーに結びついてるから、異なるアプリ間でセッションデータを再利用するのは難しい。でもJWTは異なるアプリサーバーやマイクロサービス間でセッションデータを共有できるんだよ。

クッキーはサーバーによってのみ制御されるけど、当然秘密を使って交渉することもできる。JWTは相互秘密のコンポーネントが組み込まれてて、かなりクールな感じだよね。だから、両方のエンドが相手を信頼して、JWTで証明する必要がある。クッキーが絡むと、運を天に任せることになるけど、相互TLSを使えばJWTが提供するのと同じ信頼を得られるよ。私が運用してるウェブアプリは両方使ってるんだけど、ウェブ開発者たちはJWTを主張して、ああ、認証ベアラーの部分を「忘れちゃった」みたいで、彼らのAPIでは使ってなかったんだ。結局、Apacheモジュールを修正して再コンパイルする羽目になったけど、次のバージョンでサポートするって言ってたから、私の変更を戻せるかも。今使ってるApacheプロキシのJWTモジュールでDBをちょっと調べれば、クレームが得られるよ。その前には、PrivacyIDEAインスタンスに対して認証が成功したときに生成されるApacheセッションクッキーがある。つまり、認証にはクッキー、認可にはJWTを使ってる感じかな。クッキーは両方できるけど、セッション以外はあまり詳しくないから、クレームを複数のクッキーで扱う必要があるように見えるけど、JWTは一つで全部できるんだよね。

JWTは好きだけど、複雑な認可ルールの強制が必要なシステム向けに、詳細でコンパクトな認可情報を伝えるためのより良い標準があればいいなと思う。かつて、JWTに権限を載せようとしたことがあったけど(人気のスコープよりも複雑)、それだとすぐに大きくなっちゃうんだよね。役割情報をJWTに載せる実験もしたけど、それだとロジックが再集中しちゃう。複雑な認可情報を一つのオブジェクトで何度も渡すのは根本的に欠陥のあるアイデアかもしれないけど、もしアイデンティティ標準のウィッシュリストがあったら、これが上位に来ると思う。

そうそう、トークンはすぐに長くなるよね。5年前にクライアントに役割を渡すために使おうとしたこともあったけど、いろいろ問題が出たんだよね。

認可は本当に一般的に解決可能な問題じゃないんだ。大きなシステムはそれぞれ独自のクセがあるし、一般化しようとすると痛みや苦しみ、そしてAWS IAMに繋がるんだよね。

Biscuitをチェックしてみるといいかもね。 > Biscuitは、分散型検証、オフラインの軽減、論理言語に基づく強力なセキュリティポリシー強制を持つ認可トークンだよ。 — https://www.biscuitsec.org

一度、JWTに権限を付与しようとしたことがあるけど(君の人気のスコープよりも複雑)、それだとすぐに大きくなっちゃう。ビットマスクを使うことで解決したよ。例えば、「カレンダーオブジェクトからの読み取りを許可する」というアクセスルールをエンコードしたいとする。典型的なCRUDアクションは4ビットでエンコードできる。例えば、すべてのビットがゼロなら→アクセスなし。最初のビットが1なら→作成可能。2番目のビットが1なら→読み取り可能。などなど。で、もしシステムに32種類のオブジェクトがあれば、「位置13はカレンダーをエンコードする」と言える。だから、32×4=128ビット、つまり32種類のオブジェクトに関するCRUDルールの情報をエンコードするのにたった16バイトで済む。確かに複雑に聞こえるけど、ライブラリに移せば考えなくて済むよ。

JWTはちょっと重すぎるし、JSユーザーはエンコーディングが暗号化じゃないことを忘れがちだよね。ニュースサイトのトラッカーがJWTをURLやヘッダーで第三者トラッカーに送るのを見たことがある。内容は驚くことじゃないけど、私のフルネームやメールアドレスが含まれてて、プライバシーポリシーに違反してるよ。他には、非常にオープンで便利で、JWTトークンを調べることで多くのサイトのアーキテクチャ設計について学べるんだ。

内容は驚くべきものではなく、私のフルネームとメールアドレスだよ。正しく記憶しているか分からないけど、これに関してはJWTに識別情報を保存しないことが推奨されているんじゃなかったっけ?

Hacker Newsで議論の続きを見る