<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-rosomakho-oauth-dpop-rt-00" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.30.2 -->
  <front>
    <title abbrev="Separate DPoP for access and refresh tokens">Separating DPoP Bindings for Access and Refresh Tokens</title>
    <seriesInfo name="Internet-Draft" value="draft-rosomakho-oauth-dpop-rt-00"/>
    <author fullname="Yaroslav Rosomakho">
      <organization>Zscaler</organization>
      <address>
        <email>yrosomakho@zscaler.com</email>
      </address>
    </author>
    <author fullname="Loren Weith">
      <organization>Zscaler</organization>
      <address>
        <email>lweith@zscaler.com</email>
      </address>
    </author>
    <date year="2025" month="October" day="14"/>
    <area>Security</area>
    <workgroup>Web Authorization Protocol</workgroup>
    <keyword>DPoP</keyword>
    <keyword>refresh token</keyword>
    <keyword>separation</keyword>
    <abstract>
      <?line 42?>

<t>This document defines an extension to OAuth 2.0 Demonstrating Proof-of-Possession at the application level (DPoP, RFC 9449) that allows refresh tokens to be bound to a different proof-of-possession key than access tokens. In the existing specification, a single DPoP proof is used to bind both tokens to the same key material. However, in many deployments, refresh tokens and access tokens are stored and managed in different security contexts. To support this operational separation, this document introduces a new HTTP header field, DPoP-RT, and corresponding DPoP-RT-Nonce mechanism, enabling independent proof-of-possession for refresh token use while preserving compatibility with existing DPoP-bound access tokens.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://yaroslavros.github.io/oauth-dpop-rt/draft-rosomakho-oauth-dpop-rt.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-rosomakho-oauth-dpop-rt/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Web Authorization Protocol Working Group mailing list (<eref target="mailto:oauth@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/oauth/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/oauth/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/yaroslavros/oauth-dpop-rt"/>.</t>
    </note>
  </front>
  <middle>
    <?line 46?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>OAuth 2.0 Demonstrating Proof-of-Possession <xref target="DPoP"/> defines an application-level mechanism by which a client proves possession of a cryptographic key when obtaining and using access tokens. The same proof is applied when the client requests new tokens from the authorization server (AS), binding both access and refresh tokens to the same DPoP key material.</t>
      <t>In practice, many deployments store and manage refresh tokens and access tokens in different security domains. For example, refresh tokens are often retained by a secure backend service or hardware-protected component, while access tokens are consumed by short-lived front-end instances or mobile applications. Binding both token types to the same DPoP key limits operational flexibility, complicates key rotation, and increases the impact of key compromise.</t>
      <t>This document defines a lightweight extension to DPoP that enables the refresh token to be bound to a distinct proof-of-possession key from the one used for access tokens. The mechanism introduces a new HTTP header field, DPoP-RT, which carries a signed JWT proving possession of the refresh token key when the client redeems a refresh token at the token endpoint. An optional DPoP-RT-Nonce response header provides replay protection and freshness guarantees analogous to the existing DPoP-Nonce mechanism.</t>
      <t>This separation allows deployments to:</t>
      <ul spacing="normal">
        <li>
          <t>Isolate long-term refresh token credentials from short-lived access token keys</t>
        </li>
        <li>
          <t>Rotate or revoke access token keys without affecting the refresh token flow</t>
        </li>
        <li>
          <t>Reduce the blast radius of access token key compromise</t>
        </li>
      </ul>
      <t>The extension is fully backward compatible with <xref target="DPoP"/> as clients and authorization servers that do not implement this specification continue to operate unchanged, while those that support DPoP-RT can negotiate its use on a per-client basis.</t>
      <t>A motivating scenario for this extension is an agent managing numerous long-lived tokens on behalf of its users, where user participation is often required for revocation. When combined with a hardware security module (HSM), DPoP allows use of a refresh token to be halted immediately by disabling the associated key material. The token remains valid but unusable until the key is reactivated. In large, distributed systems with many worker nodes, however, involving an HSM in every transaction is operationally impractical, motivating this extension.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<t>The terminology and conventions defined in <xref target="DPoP"/> apply.
In addition, this document uses the following terms:</t>
      <dl>
        <dt>DPoP-RT proof:</dt>
        <dd>
          <t>A JWT carried in the DPoP-RT HTTP header that proves possession of the refresh token key when a refresh token is presented at the token endpoint.</t>
        </dd>
        <dt>Refresh token key:</dt>
        <dd>
          <t>The asymmetric key used to generate DPoP-RT proofs and to which a refresh token is bound.</t>
        </dd>
        <dt>Access token key:</dt>
        <dd>
          <t>The asymmetric key used to generate DPoP proofs and to which access tokens are bound (as defined in <xref target="DPoP"/>).</t>
        </dd>
        <dt>DPoP-RT-Nonce:</dt>
        <dd>
          <t>An authorization-server-generated value used to ensure freshness of DPoP-RT proofs, analogous to the DPoP-Nonce defined in <xref target="DPoP"/>.</t>
        </dd>
      </dl>
    </section>
    <section anchor="overview">
      <name>Overview</name>
      <t>This specification extends <xref target="DPoP"/> by introducing a second proof-of-possession header, DPoP-RT, which is used to bind refresh tokens to a distinct key from the one used for access tokens. The mechanism allows authorization servers (AS) and clients to maintain separate key lifecycles for access and refresh tokens while preserving backward compatibility with existing DPoP deployments.</t>
      <t>When a client initially requests tokens (for example, during an authorization code exchange), it <bcp14>MAY</bcp14> include both:</t>
      <ul spacing="normal">
        <li>
          <t>a DPoP header — proving possession of the access token key, and</t>
        </li>
        <li>
          <t>a DPoP-RT header — proving possession of the refresh token key to which any issued refresh token will be bound.</t>
        </li>
      </ul>
      <t>If the DPoP-RT header is omitted, the AS follows the behavior defined in <xref target="DPoP"/> and binds both tokens to the same key from the DPoP proof.</t>
      <t>When the client later uses the refresh token to obtain a new access token, it includes a new DPoP-RT proof (signed by refresh key) and a DPoP proof (signed by access key) if a DPoP-bound access token is to be issued. The authorization server <bcp14>MUST NOT</bcp14> infer the access token key from earier tokens.</t>
      <t>The AS validates the DPoP-RT proof before processing the refresh request. If validation succeeds, the AS issues a new access token bound to the key demonstrated in the DPoP header, and, optionally, a new refresh token bound to the key demonstrated in the DPoP-RT header.</t>
      <t>To ensure freshness and replay protection, the AS may provide a DPoP-RT-Nonce response header, whose value the client includes as a nonce claim in subsequent DPoP-RT proofs. This nonce mechanism operates independently from the DPoP-Nonce defined in <xref target="DPoP"/>.</t>
      <t>The following diagram illustrates a complete flow:</t>
      <figure anchor="overview-flow">
        <name>Overall DPoP and DPoP-RT flow</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="368" width="472" viewBox="0 0 472 368" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,32 L 8,80" fill="none" stroke="black"/>
              <path d="M 40,88 L 40,352" fill="none" stroke="black"/>
              <path d="M 80,32 L 80,80" fill="none" stroke="black"/>
              <path d="M 336,32 L 336,80" fill="none" stroke="black"/>
              <path d="M 400,88 L 400,352" fill="none" stroke="black"/>
              <path d="M 464,32 L 464,80" fill="none" stroke="black"/>
              <path d="M 8,32 L 80,32" fill="none" stroke="black"/>
              <path d="M 336,32 L 464,32" fill="none" stroke="black"/>
              <path d="M 8,80 L 80,80" fill="none" stroke="black"/>
              <path d="M 336,80 L 464,80" fill="none" stroke="black"/>
              <path d="M 56,160 L 384,160" fill="none" stroke="black"/>
              <path d="M 56,224 L 384,224" fill="none" stroke="black"/>
              <path d="M 56,304 L 384,304" fill="none" stroke="black"/>
              <path d="M 56,352 L 384,352" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="392,304 380,298.4 380,309.6" fill="black" transform="rotate(0,384,304)"/>
              <polygon class="arrowhead" points="392,160 380,154.4 380,165.6" fill="black" transform="rotate(0,384,160)"/>
              <polygon class="arrowhead" points="64,352 52,346.4 52,357.6" fill="black" transform="rotate(180,56,352)"/>
              <polygon class="arrowhead" points="64,224 52,218.4 52,229.6" fill="black" transform="rotate(180,56,224)"/>
              <g class="text">
                <text x="44" y="52">Client</text>
                <text x="400" y="52">Authorization</text>
                <text x="396" y="68">Server</text>
                <text x="72" y="116">(1)</text>
                <text x="144" y="116">Authorization</text>
                <text x="220" y="116">code</text>
                <text x="276" y="116">exchange</text>
                <text x="112" y="132">DPoP:</text>
                <text x="164" y="132">&lt;proof</text>
                <text x="212" y="132">with</text>
                <text x="244" y="132">AT</text>
                <text x="276" y="132">key&gt;</text>
                <text x="124" y="148">DPoP-RT:</text>
                <text x="188" y="148">&lt;proof</text>
                <text x="236" y="148">with</text>
                <text x="268" y="148">RT</text>
                <text x="300" y="148">key&gt;</text>
                <text x="68" y="180">AS</text>
                <text x="108" y="180">binds:</text>
                <text x="116" y="196">Access</text>
                <text x="168" y="196">Token</text>
                <text x="204" y="196">to</text>
                <text x="228" y="196">AT</text>
                <text x="256" y="196">key</text>
                <text x="300" y="196">(DPoP)</text>
                <text x="120" y="212">Refresh</text>
                <text x="176" y="212">Token</text>
                <text x="212" y="212">to</text>
                <text x="236" y="212">RT</text>
                <text x="264" y="212">key</text>
                <text x="320" y="212">(DPoP-RT)</text>
                <text x="72" y="260">(2)</text>
                <text x="120" y="260">Refresh</text>
                <text x="176" y="260">token</text>
                <text x="232" y="260">request</text>
                <text x="112" y="276">DPoP:</text>
                <text x="164" y="276">&lt;proof</text>
                <text x="212" y="276">with</text>
                <text x="248" y="276">new</text>
                <text x="276" y="276">AT</text>
                <text x="308" y="276">key&gt;</text>
                <text x="124" y="292">DPoP-RT:</text>
                <text x="188" y="292">&lt;proof</text>
                <text x="236" y="292">with</text>
                <text x="268" y="292">RT</text>
                <text x="300" y="292">key&gt;</text>
                <text x="68" y="324">AS</text>
                <text x="120" y="324">validates</text>
                <text x="192" y="324">DPoP-RT</text>
                <text x="240" y="324">and</text>
                <text x="284" y="324">issues</text>
                <text x="328" y="324">new</text>
                <text x="356" y="324">AT</text>
                <text x="124" y="340">optionally</text>
                <text x="200" y="340">rotates</text>
                <text x="244" y="340">RT</text>
                <text x="280" y="340">bound</text>
                <text x="316" y="340">to</text>
                <text x="340" y="340">RT</text>
                <text x="368" y="340">key</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
+--------+                               +---------------+
| Client |                               | Authorization |
|        |                               |    Server     |
+--------+                               +---------------+
    |                                            |
    |  (1) Authorization code exchange           |
    |      DPoP: <proof with AT key>             |
    |      DPoP-RT: <proof with RT key>          |
    | -----------------------------------------> |
    |  AS binds:                                 |
    |      Access Token to AT key (DPoP)         |
    |      Refresh Token to RT key (DPoP-RT)     |
    | <----------------------------------------- |
    |                                            |
    |  (2) Refresh token request                 |
    |      DPoP: <proof with new AT key>         |
    |      DPoP-RT: <proof with RT key>          |
    | -----------------------------------------> |
    |  AS validates DPoP-RT and issues new AT    |
    |     optionally rotates RT bound to RT key  |
    | <----------------------------------------- |
]]></artwork>
        </artset>
      </figure>
      <t>This explicit dual-key model ensures that each token binding key is known and verifiable by the AS at issuance time, simplifying validation and preventing rebinding attacks during refresh operations.</t>
    </section>
    <section anchor="client-use-of-dpop-rt">
      <name>Client Use of DPoP-RT</name>
      <t>This section defines how clients use the new DPoP-RT HTTP header field and its relationship to the existing DPoP header when interacting with the authorization server (AS).</t>
      <section anchor="including-dpop-rt-during-token-issuance">
        <name>Including DPoP-RT during Token Issuance</name>
        <t>When a client requests tokens from the AS (for example, during an authorization code exchange) with DPoP mechanism in use, it:</t>
        <ul spacing="normal">
          <li>
            <t><bcp14>MUST</bcp14> include a DPoP header containing a proof signed with the access token key; and</t>
          </li>
          <li>
            <t><bcp14>MAY</bcp14> include a DPoP-RT header containing a proof signed with the refresh token key.</t>
          </li>
        </ul>
        <t>If a valid DPoP-RT proof is provided, the AS <bcp14>MUST</bcp14> bind any issued refresh token to the key represented by that proof.
If DPoP-RT is omitted, the AS <bcp14>MUST</bcp14> bind both the access token and refresh token to the key conveyed in the DPoP proof, following the behavior defined in <xref target="DPoP"/>.</t>
      </section>
      <section anchor="including-dpop-rt-during-token-refresh">
        <name>Including DPoP-RT during Token Refresh</name>
        <t>When using the refresh token to obtain a new access token, the client <bcp14>MUST</bcp14> include both:</t>
        <ol spacing="normal" type="1"><li>
            <t>A DPoP-RT header proving possession of the refresh token key, and</t>
          </li>
          <li>
            <t>A DPoP header proving possession of the access token key to which the new access token will be bound.</t>
          </li>
        </ol>
        <t>The AS <bcp14>MUST NOT</bcp14> infer the new access token key from any previously issued tokens or server-side state. The only valid source for the access token binding key in a refresh request is the key proved in the DPoP header of that request.</t>
        <t>If the DPoP header is absent, the AS <bcp14>MUST NOT</bcp14> issue a DPoP-bound access token. It <bcp14>MAY</bcp14> issue an unbound (bearer) access token only if explicitly permitted by policy or by the client registration metadata (e.g., when <tt>dpop_bound_access_tokens</tt> is false). Otherwise, the request <bcp14>MUST</bcp14> be rejected according to the rules in <xref target="DPoP"/>.</t>
        <t>If the DPoP-RT header is absent or invalid and the client is registered with <tt>dpop_bound_refresh_tokens</tt> set to true, the AS <bcp14>MUST</bcp14> reject the request using the <tt>invalid_dpop_rt_proof</tt> error.</t>
      </section>
      <section anchor="example-requests">
        <name>Example Requests</name>
        <t>Authorization code exchange with dual proofs:</t>
        <figure anchor="authorization-code-flow-request">
          <name>Authorization code exchange with dual proofs</name>
          <artwork><![CDATA[
POST /oauth2/token HTTP/1.1
Content-Type: application/x-www-form-urlencoded
DPoP: eyJhbGciOiJFUzI1NiIsInR5cCI6ImRwb3Araj... (AT key)
DPoP-RT: eyJhbGciOiJFUzI1NiIsInR5cCI6ImRwb3AtcnQran... (RT key)

grant_type=authorization_code&
code=SplxlOBeZQQYbYS6WxSbIA&
redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb
]]></artwork>
        </figure>
        <t>Refresh token exchange:</t>
        <figure anchor="refresh-token-request">
          <name>Refresh token exchange with dual proofs</name>
          <artwork><![CDATA[
POST /oauth2/token HTTP/1.1
Content-Type: application/x-www-form-urlencoded
DPoP: eyJhbGciOiJFUzI1NiIsInR5cCI6ImRwb3Araj... (new AT key)
DPoP-RT: eyJhbGciOiJFUzI1NiIsInR5cCI6ImRwb3AtcnQran... (RT key)

grant_type=refresh_token&
refresh_token=eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVC...
]]></artwork>
        </figure>
      </section>
      <section anchor="use-of-nonces">
        <name>Use of Nonces</name>
        <t>The DPoP-RT proof may contain a nonce claim when the AS requires proof freshness. If the AS returns a DPoP-RT-Nonce response header, the client <bcp14>MUST</bcp14> include that value in the nonce claim of the next DPoP-RT proof it constructs.</t>
        <t>The DPoP-RT-Nonce mechanism is independent from the DPoP-Nonce defined in <xref target="DPoP"/>; each proof type maintains its own nonce sequence and replay protection.</t>
      </section>
    </section>
    <section anchor="dpop-rt-proof-structure">
      <name>DPoP-RT Proof Structure</name>
      <t>A DPoP-RT proof is a JSON Web Token <xref target="JWT"/> carried in the DPoP-RT HTTP header. It proves possession of the refresh token key when a client presents or obtains a refresh token at the authorization server (AS).</t>
      <t>The proof follows the same overall structure and construction rules as the DPoP proof defined in <xref target="DPoP"/>, but with several distinct requirements.</t>
      <section anchor="jws-header">
        <name>JWS Header</name>
        <t>The JOSE Header of a DPoP-RT JWT <bcp14>MUST</bcp14> contain at least the following parameters:</t>
        <dl>
          <dt>typ:</dt>
          <dd>
            <t>A field with the value dpop-rt+jwt</t>
          </dd>
          <dt>alg:</dt>
          <dd>
            <t>An identifier for a JWS asymmetric digital signature algorithm. It <bcp14>MUST NOT</bcp14> be none or an identifier for a symmetric algorithm. It <bcp14>MAY</bcp14> differ from algorithm used in DPoP JWT.</t>
          </dd>
          <dt>jwk:</dt>
          <dd>
            <t>Represents the public key chosen by the client in JSON Web Key <xref target="JWK"/> format as defined in <xref section="4.1.3" sectionFormat="of" target="JWK"/>. It <bcp14>MUST NOT</bcp14> contain a private key.</t>
          </dd>
        </dl>
      </section>
      <section anchor="jwt-claims">
        <name>JWT Claims</name>
        <t>The payload of a DPoP-RT proof <bcp14>MUST</bcp14> contain at least the following claims:</t>
        <dl>
          <dt>jti:</dt>
          <dd>
            <t>Unique identifier for the DPoP-RT proof JWT. It <bcp14>MUST NOT</bcp14> match any other DPoP or DPoP-RT proof used in the same context during the time window of validity.</t>
          </dd>
          <dt>htm:</dt>
          <dd>
            <t>The value of the HTTP method (<xref section="9.1" sectionFormat="of" target="HTTP"/>) of the request to which the JWT is attached.</t>
          </dd>
          <dt>htu:</dt>
          <dd>
            <t>The HTTP target URI (<xref section="7.1" sectionFormat="of" target="HTTP"/>) of the request to which the JWT is attached, without query and fragment parts.</t>
          </dd>
          <dt>iat:</dt>
          <dd>
            <t>Creation timestamp of the JWT (<xref section="4.1.6" sectionFormat="of" target="JWT"/>).</t>
          </dd>
        </dl>
        <t>When refresh token is presented alongside with DPoP-RT proof, it <bcp14>MUST</bcp14> contain the following claim</t>
        <dl>
          <dt>rth:</dt>
          <dd>
            <t>Hash of the refresh token. The value <bcp14>MUST</bcp14> be the result of a base64url encoding (as defined in <xref section="2" sectionFormat="of" target="JWS"/>) the SHA-256 hash of the ASCII encoding of the associated refresh token value.</t>
          </dd>
        </dl>
        <t>When the AS provides a DPoP-RT-Nonce HTTP header in a response, the DPoP proof <bcp14>MUST</bcp14> also contain the following claim:</t>
        <dl>
          <dt>nonce:</dt>
          <dd>
            <t>A recent nonce provided via the DPoP-RT-Nonce HTTP header.</t>
          </dd>
        </dl>
        <t>A DPoP-RT proof <bcp14>MAY</bcp14> contain other JOSE Header Parameters or claims as defined by extension, profile, or deployment-specific requirements.</t>
      </section>
      <section anchor="construction-and-signing">
        <name>Construction and Signing</name>
        <t>To provide a DPoP-RT proof a client:</t>
        <ol spacing="normal" type="1"><li>
            <t>Creates a JWT with the header and claims described above.</t>
          </li>
          <li>
            <t>Computes the base64url-encoded SHA-256 digest of the refresh-token value and include it in the <tt>rth</tt> claim.</t>
          </li>
          <li>
            <t>Signs the JWT with the private key corresponding to the public key in the <tt>jwk</tt> header parameter.</t>
          </li>
          <li>
            <t>Includes the resulting compact serialization value in the DPoP-RT HTTP header.</t>
          </li>
        </ol>
        <t>A conceptual example of decoded content of DPoP-RT proof:</t>
        <figure anchor="dpop-rt-example">
          <name>Example JWT Content of a DPoP-RT Proof</name>
          <artwork><![CDATA[
{
  "typ":"dpop-rt+jwt",
  "alg":"ES256",
  "jwk": {
    "kty":"EC",
    "x":"l8tFrhx-34tV3hRICRDY9zCkDlpBhF42UQUfWVAWBFs",
    "y":"9VE4jf_Ok_o64zbTTlcuNJajHmt6v9TDVrU0CdvGRDA",
    "crv":"P-256"
  }
}
.
{
  "jti":"f62b7f84-eafd-44d8-88b3-ba4f6a574744",
  "htm":"POST",
  "htu":"https://as.example.com/oauth2/token",
  "iat":1760400097,
  "rth":"fUHyO2r2Z3DZ53EsNrWBb0xWXoaNy59IiKCAqksmQEo"
}
]]></artwork>
        </figure>
      </section>
    </section>
    <section anchor="authorization-server-processing">
      <name>Authorization Server Processing</name>
      <t>This section defines the processing requirements for authorization servers (AS) when handling requests that include the DPoP-RT header.</t>
      <section anchor="proof-validation">
        <name>Proof Validation</name>
        <t>When a request containing a DPoP-RT header is received, the AS <bcp14>MUST</bcp14> perform the following checks in order:</t>
        <ol spacing="normal" type="1"><li>
            <t>Verify the JWS signature using the public key contained in the <tt>jwk</tt> header parameter. The algorithm <bcp14>MUST</bcp14> match the <tt>alg</tt> header value, and the algorithm <bcp14>MUST</bcp14> be supported and permitted by the AS.</t>
          </li>
          <li>
            <t>Confirm that the <tt>typ</tt> header value is "dpop-rt+jwt". Proofs with any other value <bcp14>MUST</bcp14> be rejected.</t>
          </li>
          <li>
            <t>Ensure that the <tt>htm</tt> and <tt>htu</tt> claims exactly match the HTTP method and absolute URI of the current request to the token endpoint. Implementations <bcp14>MUST</bcp14> compare the scheme, host, and path components in a case-sensitive manner as defined in <xref target="DPoP"/>.</t>
          </li>
          <li>
            <t>Validate that the <tt>iat</tt> claim is within an acceptable time window and that the <tt>jti</tt> value has not been used before with the same key and nonce context. The AS <bcp14>MUST</bcp14> maintain state or use another mechanism to prevent re-use of jti values for the lifetime of the nonce or replay window.</t>
          </li>
          <li>
            <t>If the AS previously issued a DPoP-RT-Nonce value, it <bcp14>MUST</bcp14> verify that the proof contains a matching <tt>nonce</tt> claim. If the nonce is missing, invalid, or expired, the AS <bcp14>MUST</bcp14> reject the request with the <tt>use_dpop_rt_nonce</tt> error and include a new DPoP-RT-Nonce response header.</t>
          </li>
          <li>
            <t>If the request includes a <tt>refresh_token</tt> parameter, the AS <bcp14>MUST</bcp14> compute the base64url-encoded SHA-256 digest of the presented refresh token value and compare it to the <tt>rth</tt> claim in the proof. A mismatch or missing <tt>rth</tt> claim in this case <bcp14>MUST</bcp14> cause the request to fail with <tt>invalid_dpop_rt_proof</tt>. If no refresh token is included in the request (for example, during the initial authorization code exchange), the <tt>rth</tt> claim <bcp14>MUST NOT</bcp14> be present.</t>
          </li>
        </ol>
        <t>If any of the above checks fail, the AS <bcp14>MUST</bcp14> reject the request with an appropriate error.</t>
        <t>Successful validation proves that the client possesses the private key corresponding to the refresh-token binding and that the proof is specific to the current token request.</t>
      </section>
      <section anchor="token-binding-and-issuance">
        <name>Token Binding and Issuance</name>
        <t>When both DPoP and DPoP-RT proofs are successfully validated, the AS <bcp14>MUST</bcp14> bind tokens as follows:</t>
        <ul spacing="normal">
          <li>
            <t>The access token is bound to the public key carried in the <tt>jwk</tt> header of the DPoP proof, as specified in <xref target="DPoP"/>.</t>
          </li>
          <li>
            <t>The refresh token is bound to the public key carried in the <tt>jwk</tt> header of the DPoP-RT proof.</t>
          </li>
        </ul>
        <t>If the client omits the DPoP-RT header, the AS <bcp14>MUST</bcp14> bind both tokens to the same key proved in the DPoP header, preserving compatibility with <xref target="DPoP"/>. If the client omits the DPoP header and policy allows bearer tokens, the AS <bcp14>MAY</bcp14> issue an unbound (bearer) access token. Otherwise, the request <bcp14>MUST</bcp14> be rejected according to <xref target="DPoP"/>.</t>
        <t>If the AS rotates refresh tokens as part of the response, the newly issued refresh token <bcp14>MUST</bcp14> be bound to the same refresh token key proven in the current request.</t>
      </section>
      <section anchor="dpop-rt-nonce-issuance">
        <name>DPoP-RT Nonce Issuance</name>
        <t>The AS <bcp14>MAY</bcp14> return a DPoP-RT-Nonce header in success or error response to signal that the client must include this value in subsequent DPoP-RT proofs. The AS <bcp14>SHOULD</bcp14> periodically refresh the nonce to limit replay potential. Nonce values are opaque to the client and <bcp14>MUST</bcp14> be treated as short-lived.</t>
        <t>The DPoP-RT-Nonce mechanism operates independently from the DPoP-Nonce defined in <xref target="DPoP"/>. Each proof type maintains its own nonce sequence and state.</t>
      </section>
    </section>
    <section anchor="client-registration-metadata">
      <name>Client Registration Metadata</name>
      <t>This specification introduces a new boolean client registration metadata parameter named <tt>dpop_bound_refresh_tokens</tt>.</t>
      <t>With <tt>true</tt> value of this parameter client indicates that its refresh tokens are always bound to a proof-of-possession key, as demonstrated by a DPoP-RT proof, and that the AS <bcp14>MUST</bcp14> enforce the use of such proofs whenever a refresh token is presented.</t>
      <t>This parameter can be supplied during client registration <xref target="OAUTH-DYNAMIC"/>. Authorization servers that support this extension <bcp14>MAY</bcp14> advertise support for this metadata in their documentation or discovery interfaces, but no new AS metadata fields are defined by this specification.</t>
      <section anchor="server-enforcement">
        <name>Server Enforcement</name>
        <t>If a client is registered with dpop_bound_refresh_tokens = true, the AS <bcp14>MUST</bcp14>:</t>
        <ol spacing="normal" type="1"><li>
            <t>Reject any request using a refresh token that does not contain a valid DPoP-RT header. The AS <bcp14>MUST</bcp14> return the <tt>invalid_dpop_rt_proof</tt> error when a proof is malformed, invalid, or fails validation. The AS <bcp14>MUST</bcp14> return <tt>use_dpop_rt_nonce</tt> when a fresh proof with a valid nonce is required.</t>
          </li>
          <li>
            <t>Bind all refresh tokens issued to that client to the key demonstrated by the corresponding DPoP-RT proof at issuance time.</t>
          </li>
          <li>
            <t>AS <bcp14>MUST</bcp14> reject unbound refresh token use including refresh token previously issued without binding information (for example, before registration or migration).</t>
          </li>
        </ol>
        <t>If a client is registered with dpop_bound_refresh_tokens = false or the parameter is omitted, the AS <bcp14>MAY</bcp14> treat DPoP-RT as optional and continue to follow the behavior defined in <xref target="DPoP"/>.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>This extension introduces an additional proof type (DPoP-RT) and the ability to bind refresh tokens to a distinct proof-of-possession key. Implementations <bcp14>MUST</bcp14> apply all security considerations of <xref target="DPoP"/> in addition to those described below.</t>
      <section anchor="key-separation-and-compartmentalization">
        <name>Key Separation and Compartmentalization</name>
        <t>Using distinct keys for access and refresh tokens limits the impact of key compromise:</t>
        <ul spacing="normal">
          <li>
            <t>If the access token key is compromised, an attacker can invoke protected APIs until the access token expires but cannot obtain new tokens.</t>
          </li>
          <li>
            <t>If the refresh token key is compromised, an attacker can redeem the refresh token and obtain new access tokens, binding them to an attacker-controlled access token key. Separation merely forces AS interaction.</t>
          </li>
        </ul>
        <t>Implementers <bcp14>SHOULD</bcp14> store the refresh-token key in an HSM or hardened server-side environment and <bcp14>MAY</bcp14> allow the access-token key to reside in a more transient context such as a front-end instance or mobile device. Key separation materially reduces the blast radius of access token key compromise but does not reduce the impact of a full refresh token key compromise.</t>
      </section>
      <section anchor="replay-protection-and-nonces">
        <name>Replay Protection and Nonces</name>
        <t>DPoP-RT proofs are bearer artifacts and are therefore susceptible to replay if intercepted. To mitigate this risk:</t>
        <ul spacing="normal">
          <li>
            <t>Clients <bcp14>MUST</bcp14> include unique <tt>jti</tt> values and use short-lived proofs.</t>
          </li>
          <li>
            <t>Authorization servers <bcp14>MUST</bcp14> detect and reject replayed <tt>jti</tt> values within the nonce or replay window.</t>
          </li>
          <li>
            <t>When the AS requires additional freshness, it <bcp14>SHOULD</bcp14> use the DPoP-RT-Nonce mechanism defined in this document. The AS <bcp14>MUST</bcp14> return <tt>use_dpop_rt_nonce</tt> to request a fresh proof with the supplied nonce.</t>
          </li>
          <li>
            <t>Nonces for DPoP and DPoP-RT are independent and <bcp14>MUST NOT</bcp14> be interchanged.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document makes the following registrations.</t>
      <section anchor="http-header-field-registrations">
        <name>HTTP Header Field Registrations</name>
        <t>IANA is requested to register the following HTTP header fields, as specified by this document, in the "Hypertext Transfer Protocol (HTTP) Field Name Registry":</t>
        <t>DPoP-RT:</t>
        <ul spacing="normal">
          <li>
            <t>Field name: DPoP-RT</t>
          </li>
          <li>
            <t>Status: Provisional (Permanent if approved)</t>
          </li>
          <li>
            <t>Reference: This document</t>
          </li>
        </ul>
        <t>DPoP-RT-Nonce:</t>
        <ul spacing="normal">
          <li>
            <t>Field name: DPoP-RT-Nonce</t>
          </li>
          <li>
            <t>Status: Provisional (Permanent if approved)</t>
          </li>
          <li>
            <t>Reference: This document</t>
          </li>
        </ul>
      </section>
      <section anchor="oauth-extensions-error-registry">
        <name>OAuth Extensions Error Registry</name>
        <t>IANA is requested to register the following entries to the "OAuth Extensions Error Registry":</t>
        <t>invalid_dpop_rt_proof:</t>
        <ul spacing="normal">
          <li>
            <t>Name: invalid_dpop_rt_proof</t>
          </li>
          <li>
            <t>Usage Location: token error response</t>
          </li>
          <li>
            <t>Protocol Extension: This document</t>
          </li>
          <li>
            <t>Change Controller: IETF</t>
          </li>
          <li>
            <t>Reference: This document</t>
          </li>
        </ul>
        <t>use_dpop_rt_nonce:</t>
        <ul spacing="normal">
          <li>
            <t>Name: use_dpop_rt_nonce</t>
          </li>
          <li>
            <t>Usage Location: token error response</t>
          </li>
          <li>
            <t>Protocol Extension: This document</t>
          </li>
          <li>
            <t>Change Controller: IETF</t>
          </li>
          <li>
            <t>Reference: This document</t>
          </li>
        </ul>
      </section>
      <section anchor="oauth-dynamic-client-registration-metadata">
        <name>OAuth Dynamic Client Registration Metadata</name>
        <t>IANA is requested to register the following value in the IANA "OAuth Dynamic Client Registration Metadata" registry:</t>
        <ul spacing="normal">
          <li>
            <t>Client Metadata Name: dpop_bound_refresh_tokens</t>
          </li>
          <li>
            <t>Client Metadata Description: Boolean value specifying whether the client always uses DPoP-RT for refresh token requests</t>
          </li>
          <li>
            <t>Change Controller: IETF</t>
          </li>
          <li>
            <t>Reference: This document</t>
          </li>
        </ul>
      </section>
      <section anchor="media-type-registration">
        <name>Media Type Registration</name>
        <t>IANA is requested to register the application/dpop-rt+jwt media type in the "Media Types" registry.</t>
        <ul spacing="normal">
          <li>
            <t>Type name: application</t>
          </li>
          <li>
            <t>Subtype name: dpop-rt+jwt</t>
          </li>
          <li>
            <t>Required parameters: n/a</t>
          </li>
          <li>
            <t>Optional parameters: n/a</t>
          </li>
          <li>
            <t>Encoding considerations: binary. A DPoP-RT JWT is a JWT; JWT values are encoded as a series of base64url-encoded values (some of which may be the empty string) separated by period ('.') characters.</t>
          </li>
          <li>
            <t>Security considerations: This document</t>
          </li>
          <li>
            <t>Interoperability considerations: n/a</t>
          </li>
          <li>
            <t>Published specification: This document</t>
          </li>
          <li>
            <t>Applications that use this media type: Applications using this specification for application-level proof of possession of refresh tokens</t>
          </li>
          <li>
            <t>Fragment identifier considerations: n/a</t>
          </li>
          <li>
            <t>Additional information:
            </t>
            <ul spacing="normal">
              <li>
                <t>File extension(s): n/a</t>
              </li>
              <li>
                <t>Macintosh file type code(s): n/a</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Person &amp; email address to contact for further information: Yaroslav Rosomakho, yrosomakho@zscaler.com</t>
          </li>
          <li>
            <t>Intended usage: COMMON</t>
          </li>
          <li>
            <t>Restrictions on usage: none</t>
          </li>
          <li>
            <t>Author: Yaroslav Rosomakho, yrosomakho@zscaler.com</t>
          </li>
          <li>
            <t>Change controller: IETF</t>
          </li>
        </ul>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="DPoP">
          <front>
            <title>OAuth 2.0 Demonstrating Proof of Possession (DPoP)</title>
            <author fullname="D. Fett" initials="D." surname="Fett"/>
            <author fullname="B. Campbell" initials="B." surname="Campbell"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="T. Lodderstedt" initials="T." surname="Lodderstedt"/>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="D. Waite" initials="D." surname="Waite"/>
            <date month="September" year="2023"/>
            <abstract>
              <t>This document describes a mechanism for sender-constraining OAuth 2.0 tokens via a proof-of-possession mechanism on the application level. This mechanism allows for the detection of replay attacks with access and refresh tokens.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9449"/>
          <seriesInfo name="DOI" value="10.17487/RFC9449"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="JWT">
          <front>
            <title>JSON Web Token (JWT)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is used as the payload of a JSON Web Signature (JWS) structure or as the plaintext of a JSON Web Encryption (JWE) structure, enabling the claims to be digitally signed or integrity protected with a Message Authentication Code (MAC) and/or encrypted.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7519"/>
          <seriesInfo name="DOI" value="10.17487/RFC7519"/>
        </reference>
        <reference anchor="JWK">
          <front>
            <title>JSON Web Key (JWK)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>A JSON Web Key (JWK) is a JavaScript Object Notation (JSON) data structure that represents a cryptographic key. This specification also defines a JWK Set JSON data structure that represents a set of JWKs. Cryptographic algorithms and identifiers for use with this specification are described in the separate JSON Web Algorithms (JWA) specification and IANA registries established by that specification.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7517"/>
          <seriesInfo name="DOI" value="10.17487/RFC7517"/>
        </reference>
        <reference anchor="HTTP">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <reference anchor="JWS">
          <front>
            <title>JSON Web Signature (JWS)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>JSON Web Signature (JWS) represents content secured with digital signatures or Message Authentication Codes (MACs) using JSON-based data structures. Cryptographic algorithms and identifiers for use with this specification are described in the separate JSON Web Algorithms (JWA) specification and an IANA registry defined by that specification. Related encryption capabilities are described in the separate JSON Web Encryption (JWE) specification.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7515"/>
          <seriesInfo name="DOI" value="10.17487/RFC7515"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="OAUTH-DYNAMIC">
          <front>
            <title>OAuth 2.0 Dynamic Client Registration Protocol</title>
            <author fullname="J. Richer" initials="J." role="editor" surname="Richer"/>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="M. Machulak" initials="M." surname="Machulak"/>
            <author fullname="P. Hunt" initials="P." surname="Hunt"/>
            <date month="July" year="2015"/>
            <abstract>
              <t>This specification defines mechanisms for dynamically registering OAuth 2.0 clients with authorization servers. Registration requests send a set of desired client metadata values to the authorization server. The resulting registration responses return a client identifier to use at the authorization server and the client metadata values registered for the client. The client can then use this registration information to communicate with the authorization server using the OAuth 2.0 protocol. This specification also defines a set of common client metadata fields and values for clients to use during registration.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7591"/>
          <seriesInfo name="DOI" value="10.17487/RFC7591"/>
        </reference>
      </references>
    </references>
    <?line 452?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
Dzo3fbR3BN6H/RKA4f8Ah5DVOFldAAA=

-->

</rfc>
