- クライアントの公開鍵 (
jwk) 。 - メソッド (
htm) と URI (htu) を含む、アクセストークンリクエストを参照するペイロード。 - クライアントの秘密鍵を使用して生成された署名。
- リプレイ防止のための一意の ID (
jti) 。 - すべての API リクエストに対する、アクセストークンの base64url エンコード済み SHA-256 ハッシュ (
ath) 。 - 任意: の場合、クライアントアプリケーションが DPoP Proof JWT を最近生成したことを保証するための
nonceclaim。
一般的なユースケース
- シングルページアプリケーション (SPA) とモバイルアプリケーション: パブリッククライアントである SPA やモバイルアプリケーションには、バックエンドサーバーのように を安全に保存できる、信頼された機密環境がありません。そのため、トークンの窃取に対して脆弱です。DPoP は、アクセストークンをクライアントアプリケーションの公開鍵にバインドして DPoP Proof JWT を生成することで、このセキュリティ上の脆弱性に対処します。クライアントアプリケーションは秘密鍵で DPoP Proof JWT に署名し、認可リクエストに含めて送信します。Auth0 の認可サーバーは DPoP Proof JWT を検証し、有効であれば発行されたアクセストークンをクライアントの公開鍵にバインドします。
- サードパーティ API との統合: クライアントアプリケーションと統合された AI エージェントが、DPoP Proof JWT を使用してユーザーに代わってサードパーティ API を呼び出す場合、は、そのリクエストが認可されていない第三者ではなく AI エージェントから送信されたものであることを、暗号学的に検証できます。
サポートされているアプリケーションのグラントタイプ
| グラントタイプ | 説明 |
|---|---|
authorization_code | 認可コードグラント |
client_credentials | クライアントクレデンシャルグラント |
password | リソースオーナーパスワードグラント |
refresh_token | リフレッシュトークングラント |
urn:ietf:params:oauth:grant-type:device_code | デバイス認可グラント |
http://auth0.com/oauth/grant-type/password-realm | 特定のレルムを指定できる、リソースオーナーパスワードグラントに類似した拡張グラントを使用します |
http://auth0.com/oauth/grant-type/passwordless/otp | パスワードレス グラントリクエスト |
http://auth0.com/oauth/grant-type/mfa-oob | 多要素認証 OOB グラントリクエスト |
http://auth0.com/oauth/grant-type/mfa-otp | 多要素認証 OTP グラントリクエスト |
http://auth0.com/oauth/grant-type/mfa-recovery-code | 多要素認証のリカバリーコード グラントリクエスト |
urn:ietf:params:oauth:grant-type:token-exchange | Custom Token Exchange グラントリクエスト |
urn:okta:params:oauth:grant-type:webauthn | WebAuthn グラントリクエスト |
仕組み

- Auth0 認可サーバーにアクセストークンをリクエストするとき、クライアントアプリケーションは一意の暗号学的キーペアを生成し、公開鍵を使って秘密鍵を保有していることを証明します。
- クライアントアプリケーションは DPoP Proof JWT を生成し、それを Auth0 認可サーバーの /token エンドポイントに送信します。
- Auth0 認可サーバーは DPoP Proof JWT を検証し、有効であればアクセストークンを発行して、クライアントの公開鍵にバインドします。
- Customer API を呼び出す前に、クライアントアプリケーションは新しい DPoP Proof JWT を生成し、トークンに関連付けられた秘密鍵を保有していることを証明します。クライアントアプリケーションは、DPoP Proof JWT と sender-constrained アクセストークンをリソースサーバーに送信します。
- リソースサーバーは DPoP Proof JWT を検証し、トークンの正当な所有者、つまり元のクライアントアプリケーションだけが、それを使って保護されたリソースに正常にアクセスできるようにします。リフレッシュトークンからアクセストークンをリクエストするには、クライアントアプリケーションは新しい DPoP Proof JWT を生成し、リフレッシュトークンがクライアントの公開鍵にバインドされていることを保証します。
Auth0 で DPoP を使用してトークンに送信者制約を適用する

- 前提条件
- ステップ 1: クライアントアプリケーションが DPoP キーペアを生成する
- ステップ 2: クライアントアプリケーションが DPoP Proof JWT を作成する
- ステップ 3: クライアントアプリケーションが DPoP にバインドされたトークンを要求する
- ステップ 4: Auth0 認可サーバーが DPoP Proof JWT を検証する
- ステップ 5: クライアントアプリケーションが DPoP にバインドされたトークンと DPoP Proof JWT を使用して API を呼び出す
- ステップ 6: DPoP を使用したトークンのリフレッシュを処理する
前提条件
- クライアントアプリケーションとリソースサーバーに対して、送信者制約を設定していること。
ステップ 1: クライアントアプリケーションが DPoP キーペアを生成する
ステップ 2: クライアントアプリケーションが DPoP Proof JWT を作成する
/token エンドポイントに DPoP にバインドされたアクセストークンをリクエストする前に、クライアントアプリケーションは DPoP Proof JWT を作成する必要があります。DPoP Proof JWT は、クライアントの秘密鍵で署名された JSON Web Token (JWT) であり、「所持証明」として機能します。
DPoP Proof JWT は、JWT ヘッダーと、トークンリクエストに関連付けられたクレームを含むペイロードで構成されます:
JWT ヘッダークレーム
| DPoP Proof JWT クレーム | 説明 |
|---|---|
typ | dpop+jwt に設定します。 |
alg | RS256 や ES256 などの非対称署名アルゴリズムです。 |
jwk | クライアントの公開鍵を表す JSON Web Key (JWK) です。 |
JWT ペイロードのクレーム
| DPoP Proof JWT クレーム | 説明 |
|---|---|
jti | リプレイ攻撃を防ぐための JWT の一意の識別子です。 |
htm | DPoP Proof の対象となるリクエストの HTTP メソッドです。たとえば、トークンリクエストでは POST、API 呼び出しでは GET です。 |
htu | DPoP Proof JWT の対象となるリクエストの HTTP URI です。フラグメントとクエリパラメーターは含まれません。たとえば、https://api.example.com/data?param=1#section1 は https://api.example.com/data になります。 |
iat | JWT の作成時刻を表すタイムスタンプです。 |
ath | アクセストークンを使用する API 呼び出しでは、アクセストークンを base64url エンコードした SHA-256 ハッシュです。 |
nonce | nonce を必要とするパブリッククライアントでは、サーバーから提供される nonce 値です。 |
ステップ 3: クライアントアプリケーションが DPoP にバインドされたトークンをリクエストする
/token エンドポイントにアクセストークンをリクエストする際、HTTP リクエストヘッダーに DPoP Proof JWT を含めます:
- 署名済みの DPoP Proof JWT を使用して、DPoP HTTP ヘッダーを設定します。
- 署名済みの DPoP Proof JWT を含む DPoP HTTP ヘッダーを、
/tokenエンドポイントへのアクセストークンリクエストとともに送信します。 - Auth0 認可サーバーからのレスポンスを処理します。
Public clients
/token リクエストを行い、DPoP HTTP ヘッダーに nonce 値を含めない場合、Auth0 は HTTP 400 コードと、次のようなエラーメッセージを返します。
DPoP-Nonce ヘッダーを含めます。これは、DPoP specification で定義されている標準的な”チャレンジレスポンス”フローに従うものです。DPoP-Nonce ヘッダーの値を使用して DPoP proof を再生成し (Step 2 と同様) 、その値を持つ nonce claim を含めたうえで、リクエストを /token エンドポイントに再送信する必要があります。
次のコードサンプルは、パブリッククライアントから nonce claim を含む /token リクエストを送信し、その後再試行するまでの一連のフローを示しています。
- DPoP Proof JWT、その公開鍵、署名を抽出します。
- 提供された公開鍵を使用して署名を検証します。
htm、htu、jti,、iatの各クレームを検証します。- 有効な場合は、アクセストークンを発行します。Auth0 認可サーバーは、確認用クレーム
cnfをアクセストークンに含めます。cnfクレームには、DPoP Proof JWT から取得した公開鍵のサムプリント (ハッシュ値) が含まれます。これをアクセストークンに含めることで、Auth0 認可サーバーはアクセストークンをその特定の公開鍵に紐付けます。つまり、アクセストークンに「sender constraint」を適用します。 - トークンレスポンスでは、
Authorizationヘッダー内のtoken_typeをBearerではなくDPoPに設定します。従来、アクセストークンをAuthorizationヘッダーで渡す場合はBearerに設定されます。しかし、ここでは DPoP を使用して公開鍵に紐付けられたアクセストークンを渡すため、代わりにDPoPに設定されます。 - その後、Auth0 認可サーバーは DPoP sender-constrained アクセストークンをクライアントアプリケーションに発行します。
ステップ 5: クライアントアプリケーションが DPoP にバインドされたトークンと DPoP Proof JWT を使用して API を呼び出す
- 次の Claims を含む新しい DPoP Proof JWT を生成します。
htmclaim は、GETやPOSTなどの API リクエストのHTTPメソッドです。htuclaim は、API リクエストの URI です。athclaim は、ステップ 3 で受け取った DPoP にバインドされたアクセストークンの、base64url エンコードされた SHA-256 ハッシュです。
- クライアントの秘密鍵を使用して、新しい DPoP Proof JWT に暗号学的に署名します。
-
DPoP認証スキームを使用して、DPoP にバインドされたアクセストークンをAuthorizationヘッダーに含めます。
- 新たに生成した DPoP Proof JWT を
DPoPHTTP ヘッダーに含めます:
DPoP HTTP ヘッダーには、追加の ath クレームを含める必要があります。ath クレームは、発行されたアクセストークンの SHA256 ハッシュを base64url エンコードしたものです。
リソースサーバーは、次の処理を行います。
- API リクエストを受信し、アクセストークン、DPoP JWT プルーフ、公開鍵、署名を抽出します。
jwkヘッダー内の公開鍵を使用して、DPoP Proof JWT の署名を検証します。htm、htu、jti、iat、athの各クレームを検証します。- DPoP Proof JWT の
jwkヘッダーで示された公開鍵が、アクセストークン内のcnf.jktクレームによってそのアクセストークンに関連付けられた公開鍵と一致することを検証します。
/userinfo エンドポイントを呼び出します。
ステップ 6: DPoP を使用したトークンの更新を処理する
- Auth0 認可サーバーの
/tokenエンドポイントにリフレッシュトークンリクエストを送信します。 - リフレッシュトークンリクエスト用の DPoP Proof JWT を生成します (ステップ 2 と同様ですが、
htmはPOST、htuはの URI です) 。 DPoPHTTP ヘッダーに DPoP Proof JWT を含めます。
- DPoP Proof JWT を検証し (ステップ 4 と同様) 、新しい DPoP にバインドされたアクセストークンを発行します。
重要な考慮事項
- 秘密鍵のセキュリティ: DPoP 実装のセキュリティはクライアントの秘密鍵の保護に依存するため、不正アクセスから確実に保護する必要があります。秘密鍵は、ハードウェアに裏打ちされた保存領域で生成および保管し、エクスポート不可に設定する必要があります。
- リプレイ保護 (
jti** およびdpop-nonce):** DPoP Proof JWT のjtiクレームは、/userinfoエンドポイントなどの保護対象リソースに対するリプレイ攻撃の防止に役立ちます。現在、Auth0 認可サーバーは/userinfoエンドポイントでのjtiの再利用を確認しません。Auth0 認可サーバーはレスポンスでDPoP-NonceHTTP ヘッダーを返します。パブリッククライアントは、リプレイ保護を強化するため、後続の DPoP Proof JWT にこれをnonceクレームとして含める必要があります。 - レート制限: DPoP のチャレンジレスポンスフローでは、最初のリクエストの後に、サーバーから提供された nonce を付けて再試行が必要になる場合があるため、各やり取りは実質的に Auth0 テナントのレート制限 に対して 2 リクエスト分としてカウントされます。アプリケーションのリクエスト量がこのオーバーヘッドを考慮していることを確認してください。
- エラー処理:
invalid_dpop_proofやuse_dpop_nonceなど、Auth0 認可サーバーまたはリソースサーバーから返される DPoP 固有のエラーを処理するロジックは、お客様側で実装する必要があります。 - クライアントの種類: クライアントシークレットを安全に保存できない、シングルページアプリケーション (SPA) やモバイルアプリなどのパブリッククライアントでは DPoP を使用してください。では、クライアントシークレットを持つバックエンドサービスなどに対して DPoP は追加のセキュリティ層となりますが、すでに他の sender-constraining の仕組みがあります。
- パフォーマンス: API 呼び出しごとに DPoP Proof JWT を生成して署名するとわずかなオーバーヘッドが生じるため、クライアントアプリケーションの暗号処理が効率的であることを確認してください。
- 鍵のローテーション: セキュリティを強化するために、DPoP キーペアをローテーションする戦略を実装してください。同じセッションでは同じキーペアを使用するようにしてください。
- 永続化: セッションを維持し、DPoP にバインドされたアクセストークンを再利用する必要があるクライアントアプリケーション (長期間動作する SPA など) では、最初に生成したキーペアをアプリケーションの再読み込み後も安全に保存し、再取得できるようにしてください。新しいキーペアが生成されたり、別のキーペアが使用されたりすると、DPoP にバインドされたアクセストークンは無効になります。これは、そのトークンが元のキーペアの公開鍵に暗号学的に結び付けられているためです。たとえば、ブラウザーの
IndexedDBやモバイルアプリのセキュアストレージにキーペアを保存できます。