2025-12-21
最近、Web の認証領域で DPoP をよく聞くようになったので、概要をまとめました。
DPoP(Demonstrating Proof of Possession)は「所有証明の実証」を意味し、OAuth 2.0 のアクセストークンやリフレッシュトークンとクライアントに暗号学的に紐付ける仕組みです。
従来の Bearer Token 方式と異なり、トークンだけでなく対応する秘密鍵も必要となるため、トークン盗難時の被害を防止できます。
DPoP では、クライアントが秘密鍵・公開鍵のペアを生成します。
リクエスト時に "DPoP Proof" という署名付きJWTをHTTPヘッダーとして送信します。
DPoP: eyJ0eXAiOiJkcG9wK2p3dCIsImFsZyI6IkVTMjU2IiwiandrIjp7Imt0eSI6Ik...
Authorization: DPoP eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...
DPoP は、トークンだけではなく秘密鍵を使用した "DPoP Proof" が必要になるため、トークン単体が盗まれても悪用できません。
(Bearer Token 方式では、トークンが盗まれるとそのまま悪用可能です)
まず実装が複雑になります。
リクエストごとに "DPoP Proof" を生成し、付与する必要があります。
ブラウザの場合、安全に鍵の管理するのが難しいです。
鍵は IndexedDB などで保存する方法が考えられますが、XSS により鍵が盗まれる可能性があります。
またブラウザの場合、JavaScript でヘッダーに付与する必要があるため、初回アクセス時などにいきなり DPoP でリクエストはできません。
全てを DPoP で守るのではなく、これまでのセッションなどと併用して使うことが現実的になると思います。
普及すれば、ブラウザが安全に管理、リクエストに "DPoP Proof" の自動付与などを対応するような未来もあるのかもしれません。
(とはいえ、個人的には難しい気もしています)
DPoP は、トークンによるアクセス制御をよりセキュアにする良い方法だな、と思いました。
一方で、導入のハードルは高く、全ての場面で使えるわけではないので、すぐ採用するのは現実的に難しいと思いました。