Skip to content

DPoP (Demonstrating Proof-of-Possession)

DPoP (Demonstrating Proof-of-Possession) is the “Sovereign Chain” for modern OAuth 2.0 tokens. A standard Access Token is a “Bearer Token”—anyone who possesses it can use it to gain access, much like cash found on the street. DPoP transforms tokens into Sender-Constrained Credentials. By requiring the client to prove possession of a private key for every request, DPoP ensures that if a token is stolen, it is useless to the attacker. For the IAM architect, DPoP is the critical protocol for Hardening Public Clients (SPAs and Mobile Apps) where tokens are most vulnerable to interception.

DPOP

Token Security
Core Mission
Universal Token Binding. Establishing a cryptographic link between an Access Token and the specific client instance that requested it, eliminating the threat of token replay and "Pass-the-Token" attacks.
Like a Non-Transferable Credit Card with a PIN: Imagine standard tokens are like "Cash." If you drop a $100 bill (An Access Token) and someone picks it up, they can spend it. DPoP is like a "Custom Credit Card" that is cryptographically locked to your individual wallet (Your Client Instance). To spend it, the card asks your wallet for a "Sovereign Digital Signature" (The DPoP Proof). Even if someone steals your card, they can't use it because they don't have your wallet's private key. The card is only "Activated" by your specific presence.
Single-Page App (SPA) Security / Financial APIs / Mobile App Token Hardening / Zero Trust Handshakes

Designing for DPoP requires understanding the interplay between the Proof, the Token, and the Resource.

PillarStrategic ResponsibilityIAM Implementation
DPoP Proof (JWT)The Dynamic Evidence.A short-lived (seconds) JWT signed by the client’s private key, sent with every request.
Public Key BindingThe Cryptographic Link.The Access Token contains a hash (cnf) of the client’s public key, permanently binding them.
HTTP Method BindingAnti-Replay.The DPoP Proof includes the HTTP method (GET/POST) and URI, preventing its use elsewhere.
Server nonceFreshness.A server-issued value that ensures a DPoP proof is absolutely current and never re-used.

Securing a request with DPoP follows a “Generate-Bind-Verify” path.

graph LR
    Generate[Client: Generate Signed Proof] --> Request[API: Request with Token + Proof]
    Request --> Bind[Server: Match Proof to Token Binding]
    Bind --> Access[Result: Validated Access]
1

Ephemeral Proof Generation

Before calling an API, the client generates a **DPoP Proof**. This is a tiny, temporary JWT signed by a private key locally stored in the browser or device. The proof includes the destination URI and the current timestamp. This is the "Sovereign Intent" for that specific request.

2

The Proof-Bound Request

The client sends the **Access Token** (in the `Authorization` header) and the **DPoP Proof** (in the `DPoP` header) to the API. Crucially, the Access Token itself was previously "Bound" to this client's public key during the initial OAuth exchange. They are now a "Sovereign Pair."

3

Verification & Replay Prevention

The Resource Server (API) performs three checks: 1) Is the DPoP Proof signature valid? 2) Does the Proof match the current URI and Method? 3) Does the Public Key used in the Proof match the `cnf` claim in the Access Token? If all match, access is granted. An attacker with *only* the token—or *only* the proof—is stopped at the gate.


Requesting a DPoP-bound token during the OAuth 2.0 Authorization Code exchange.

POST /token HTTP/1.1
Host: auth.sovereign.corp
Content-Type: application/x-www-form-urlencoded
DPoP: eyJhbGciOiJFUzI1NiIsImprdCI6Im... (Signed Proof)
grant_type=authorization_code&
code=SplxlOBeZQQYbYS6WxSbIA&
code_verifier=dBjftJeZ4CVP-mB92K_...

Master the technical ceremonies of sender-constrained tokens and modern API security.