JWT Bearer Grant and Client Authentication

発行者との信頼関係がすでにあるなら、署名付き JWT をトークンエンドポイントでの認可グラントの代わりにも、クライアントの credential の代わりにも使える。

現在地
RFC として公開済み
公式本文
RFC 7523
公式に文書化された対応
0
動き
1 件の動き (90 日)

RFC を英日対訳で読む解説の元ファイル (GitHub)

どういうときに使うか

  • 認可サーバーと信頼関係がすでにあり、ユーザーを承認画面に通さずに access token が欲しいサービス: JWT をグラントとして提示すると、"without a direct user-approval step at the authorization server" で access token を得られる (Section 1)。
  • トークンエンドポイントで別の認証手段を使いたいクライアント: 署名付き JWT を client_assertion として、使っているグラントに添えて送る。本文の例は authorization code の交換 (Section 1, Section 2.2)。
  • 信頼する IdP が発行した assertion を受け付ける認可サーバー: https://jwt-idp.example.com が mailto:mike@example.com について発行し、サーバー宛てにした JWT が、そのまま access token のグラントになる (Section 4)。
  • 両方同時に: グラントとクライアント認証は直交していて分離できるので、JWT グラントを別の認証方式と組み合わせても、JWT クライアント認証を任意のグラントと組み合わせてもよい (Section 1)。
図
flowchart LR
    A["AS が信頼する発行者の署名付き JWT をクライアントが持っている"] -->|"引き換える標準的な方法がない"| B["サーバーごとの独自連携か、クライアントが保管すべき共有 secret"]
    A -->|"RFC 7523"| C["assertion として送って access token を得る、または client_assertion として送って認証する"]

解決する問題

OAuth Assertion Framework (RFC 7521) は assertion がグラントにもクライアント credential にもなりうると言うが、JWT がその役をどう果たすかは定めていない。プロファイルがなければ、認可サーバーごとに claim や audience の規則、エラーコードが違ってしまい、クライアントは署名付き JWT の形式をサーバー間で使い回せない。RFC 7523 は 2 つのパラメータ名、JWT が持つべき claim、サーバーの検証手順、失敗時のエラーを固定する。クライアントがそもそも JWT をどう手に入れるかは範囲外 (Section 1)。

仕組み

図
sequenceDiagram
    participant I as JWT 発行者
    participant C as クライアント
    participant AS as 認可サーバー
    I-->>C: iss, sub, aud, exp 付きの署名済み JWT
    C->>AS: POST /token grant_type=jwt-bearer, assertion=JWT, scope
    Note over C,AS: または任意のグラントに client_assertion_type=jwt-bearer と client_assertion=JWT を添える
    AS->>AS: iss、sub、aud がこのサーバーか、exp 未経過か、発行者の署名を確認
    AS-->>C: access_token、失敗時は invalid_grant / invalid_client

グラントとして使うとき、クライアントは grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer と assertion に JWT、任意で scope を送る。クライアント認証として使うときは client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer と client_assertion に JWT を、使っているグラントに添えて送る。どちらの場合も認可サーバーは、iss が既知の発行者か、sub が正しい当事者か (認証なら client の client_id)、aud にサーバー自身の識別子が含まれるか、exp が過ぎていないか、署名や MAC が発行者の鍵で検証できるかを確認する (Section 2.1, Section 2.2, Section 3)。

仕様が求めること

  • グラントでは grant_type が urn:ietf:params:oauth:grant-type:jwt-bearer で、assertion は単一の JWT を含まなければならない。client_id はそれに依存するクライアント認証方式を使うときだけ必要 (Section 2.1)。
  • クライアント認証では client_assertion_type が urn:ietf:params:oauth:client-assertion-type:jwt-bearer で、client_assertion に複数の JWT を含めてはならない (Section 2.2)。
  • JWT は iss、sub、aud、exp を含まなければならない。aud は認可サーバーを示さなければならず、サーバーは自分の識別子を audience に含まない JWT を拒否しなければならない (Section 3)。
  • クライアント認証では sub は client_id でなければならない。グラントでは認可されたアクセス主体を示す (Section 3)。
  • JWT は発行者が署名するか MAC を付けなければならず、サーバーは署名や MAC が無効なもの、exp を過ぎたものを拒否しなければならない (Section 3)。
  • グラントの失敗は invalid_grant (Section 3.1)、クライアント認証の失敗は invalid_client を返す (Section 3.2)。
  • RS256 は実装必須 (Section 5)。

注意点

  • リプレイ防止は必須ではない。サーバーは使用済みの jti を JWT の失効まで追跡してもよいが、やるかどうかは実装の判断 (Section 3, Section 6)。
  • issuer と audience の識別子、トークンエンドポイントの場所、署名鍵、ワンタイム利用の制約、JWT の最大寿命、claim の要件は事前合意が必要で、その交換方法は範囲外 (Section 5)。
  • サーバーは不合理に遠い未来の exp や、不合理に古い iat を拒否することがある。JWT は短命に発行する (Section 3)。
  • JWT はプライバシーに関わるデータを含みうる。TLS のような暗号化された経路でだけ送り、クライアントに読ませたくなければサーバー向けに暗号化し、必要な claim だけ入れる (Section 7)。

出典

他の仕様との関係

関係図
flowchart LR
  s_jwt_bearer["JWT Bearer Grant and Client Authentication"]
  s_jwt["JSON Web Token"]
  s_oauth2["OAuth 2.0"]
  s_identity_chaining["Identity and Authorization Chaining"]
  s_id_jag["Identity Assertion JWT Authorization Grant"]
  s_spiffe_client_auth["OAuth SPIFFE Client Authentication"]
  style s_jwt_bearer stroke-width:3px
  s_jwt_bearer -->|土台とする仕様| s_jwt
  s_jwt_bearer -->|拡張対象| s_oauth2
  s_identity_chaining -->|土台とする仕様| s_jwt_bearer
  s_id_jag -->|土台とする仕様| s_jwt_bearer
  s_spiffe_client_auth -->|プロファイル対象| s_jwt_bearer

公式に文書化された対応

利用状況には、公式のドキュメント(ベンダーやプロジェクト自身のもの、または標準化団体がその名前を挙げているページ)に対応が明記されているものだけを載せている。引用した文言がそのページにまだあるかは毎週確認している。実験的・アルファ・ベータの対応は「プレビュー」として別に数える。

出典付きの対応情報はまだ集めていない。普及していないという意味ではない。

動き

Datatracker の revision 履歴、このサイトの日次 run が書いた解説、draft 名を挙げた ML の件名。

このサイトの解説

  • 実質的な変更OAuth WG

    RFC 10070 が発行され、アサーションベースのクライアント認証とグラントにおけるオーディエンス値について RFC 7521、7522、7523、9126 を更新した。

    RFC 10070 on Updates to OAuth 2.0 JSON Web Token (JWT) Client Authentication and Assertion-Based Authorization Grants

    解説を読む

    RFC Editor が RFC 10070 を告知した。Jones、Campbell、Mortimore、Skokan による Proposed Standard で、draft-ietf-oauth-rfc7523bis-11 に基づく。OAuth 2.0 のクライアントアサーション認証およびアサーションベースの認可グラントにおけるオーディエンス値の扱いについて RFC 7523、7521、7522、9126 を更新し、従来のオーディエンス要件にあったセキュリティ上の脆弱性に対処する。告知文には新しいオーディエンスの規則が書かれておらず、必要とされる具体的な値はこの資料からは分からない。

    • private_key_jwt のクライアントアサーションや JWT ベアラーグラントを受け付け、許容するオーディエンス値を見直す必要がある認可サーバー。
    • クライアントアサーションを生成し、設定するオーディエンス値を確認する必要があるクライアントライブラリ。