Visual RFC.
ALL RFCs / RFC 9449
Read the RFC ↗
RFC 9449 / PROOFS AND PERMISSION

Keep the same key from permission request to token

09

An optional early key fingerprint can clip the permission request’s code to the app’s key before the app redeems that code for a token.

RFC 9449 · § 10EXAMPLE
1 / 4 · Choose whether and where to clip the code to a key

The example assumes ordinary OAuth permission, PKCE and client checks pass.

Early request → code → token requestEarly key A
Early permission requestRequested key A association

Offline worked example. Signature fixtures and key/token hashes can be checked locally; ordinary OAuth, TLS and deployment policy checks remain separate. This is not a production validator.

What happens if you change this?

Predict whether the request will pass. Change one choice to see why; use Restart to restore the original example.

4 / 4
04
Keep or reject the key link

The early fingerprint and later proof refer to the same key A. This check complements the rest of OAuth and PKCE.

Keep the same key from permission request to tokenThe early fingerprint and later proof refer to the same key A. This check complements the rest of OAuth and PKCE.Early request → code → token requestEarly key AAuthorization codeclipped to key ALater key AThis code-binding check passes

Key idea: An early code-to-key binding stops a later request using a different key.

Terms
DPoP
A separately signed note proving use of a key for a particular request. It accompanies, rather than replaces, the access token.
Public key and private key
The shareable key checks signatures. The matching secret key makes them. A public key is not a registered app identity by itself.

Look up a term in the glossary ↗

Rules & examples

These reference examples may differ from the selected experiment.

  • dpop_jkt optionally binds an authorization code to the SHA-256 JWK thumbprint, checked against the later token-request proof. A mismatch MUST be rejected.
  • With PAR, use dpop_jkt in the POST body or a checked DPoP proof header. Servers supporting PAR and DPoP MUST support both approaches. If both are supplied, their key thumbprints MUST agree; otherwise reject the pushed request before issuing a code.
  • dpop_jkt complements PKCE; it is not an unconditional replacement. Similar injection protection requires a unique DPoP key per authorization request. This model assumes all other OAuth/PKCE checks pass.

Bounded offline worked example, not a production OAuth, TLS or general JWT validator. Cryptographic signature fixtures and public-key/token hashes are independently checked.

Sources
Protocol participantThreat or exceptionProtocol controlSimplified drawings · precise section references
New to this? Start hereA quick picture + helpful background

A message needs an address.

Think of a packet as a small addressed envelope. Devices pass it onward; transport protocols decide what delivery promises an application gets.

Helpful first, if these ideas are unfamiliar

These pictures are analogies to help you learn. The linked RFC explains the actual rules.

Related RFCs and changes

“Updates” changes part of an earlier RFC. “Obsoletes” replaces it. This list shows selected related documents.

All chapters in RFC 9449

Drawing view

Scroll the drawing to see every part. Playback controls stay above it.

RFC 9700 / CHAPTERS

Chapters

For full details, tables, algorithms, and exceptions, read the original RFC.

RFC status and corrections ↗