<?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.39 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ambekar-oauth-epop-02" category="std" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.0 -->
  <front>
    <title abbrev="EPOP">JSON Web Token (JWT) Profile for OAuth 2.0 Enveloped Proof of Possession (EPOP)</title>
    <seriesInfo name="Internet-Draft" value="draft-ambekar-oauth-epop-02"/>
    <author fullname="Ashwin Ambekar">
      <organization>eBay</organization>
      <address>
        <email>ambekar@gmail.com</email>
        <email>aambekar@ebay.com</email>
      </address>
    </author>
    <date year="2026" month="July" day="20"/>
    <area>Security</area>
    <workgroup>Web Authorization Protocol</workgroup>
    <keyword>EPOP</keyword>
    <keyword>oauth</keyword>
    <keyword>proof-of-possession</keyword>
    <keyword>sender-constrained</keyword>
    <keyword>token binding</keyword>
    <keyword>jwt profile</keyword>
    <keyword>token profile</keyword>
    <abstract>
      <?line 70?>

<t>This specification defines a profile for OAuth 2.0 sender-constrained credentials in which authorization codes, access tokens, and refresh tokens are cryptographically bound to the client's private key as a single inseparable envelope. Unlike existing mechanisms, EPOP provides proof-of-possession uniformly across both JWT and opaque access tokens, and across HTTP and non-HTTP transports. The profile extends sender-constraining beyond HTTP to non-HTTP transports including MQTT, Kafka, the Model Context Protocol (MCP), gRPC, and SASL-based protocols such as those defined in <xref target="RFC7628"/>. It introduces atomic proof-of-possession key rotation, enabling clients to rotate key pairs without disrupting active sessions, and an offline-derived client nonce (<tt>cnonce</tt>) that eliminates the server-issued nonce round-trip required by existing mechanisms — enabling stateless proof validation critical for non-HTTP and high-throughput deployments. Authorization servers, resource servers, and clients from different vendors can implement this profile interoperably.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://asambeka.github.io/epop/draft-ambekar-oauth-epop.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ambekar-oauth-epop/"/>.
      </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/asambeka/epop"/>.</t>
    </note>
  </front>
  <middle>
    <?line 74?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>OAuth 2.0 <xref target="RFC6749"/> access tokens are bearer tokens by default: any party in possession of a token can use it, regardless of whether that party is the legitimate client to which the token was issued. This property makes token theft a practical attack — intercepted tokens can be replayed without further credential material.</t>
      <t>Sender-constraining mechanisms address this by cryptographically binding a token to the client's key pair so that possession of the token alone is insufficient to use it. Demonstrating Proof of Possession (DPoP) <xref target="RFC9449"/> introduced sender-constraining for HTTP-based OAuth flows. However, DPoP relies on HTTP-specific request parameters (<tt>htm</tt>, <tt>htu</tt>) and a server-issued nonce mechanism that requires an additional round-trip and imposes per-client nonce state management on servers — making it unsuitable for non-HTTP transports such as MQTT, Kafka, gRPC, and SASL-based protocols. DPoP's <tt>ath</tt> claim binds opaque access tokens on HTTP, but provides no sender-constraining path for opaque tokens on non-HTTP transports. No existing specification provides an interoperable sender-constraining profile that operates uniformly across both JWT and opaque access tokens, and across both HTTP and non-HTTP transports.</t>
      <t>Opaque access tokens are widely deployed in production environments for their revocability, privacy properties, and compact size. Selective disclosure mechanisms such as SD-JWT (<xref target="RFC9901"/>) require JWT structure and cannot be applied to opaque tokens. No existing sender-constraining mechanism addresses opaque access tokens outside of HTTP. This leaves a broad class of production deployments — those using opaque tokens with Kafka, MQTT, gRPC, or SASL-based protocols — without any interoperable proof-of-possession mechanism.</t>
      <t>A further deployment challenge with DPoP is the requirement to propagate two distinct HTTP headers — <tt>Authorization: DPoP &lt;token&gt;</tt> and <tt>DPoP: &lt;proof&gt;</tt> — as an inseparable pair through every layer of a distributed system. API gateways, reverse proxies, and service-mesh sidecars must each be updated to recognize and forward the <tt>DPoP</tt> header; many intermediaries strip non-standard headers by default. Every resource server onboarded to DPoP must separately implement dual-header awareness and proof validation. A single hop that discards the <tt>DPoP</tt> header silently invalidates the proof-of-possession guarantee for the entire request chain, creating a widespread integration burden across heterogeneous microservice deployments.</t>
      <t>This document defines the Enveloped Proof of Possession (EPOP) profile for OAuth 2.0 credentials. In this profile, the OAuth credential — authorization code, access token, or refresh token — is nested within the <tt>ntk</tt> (Nested Token) claim (<xref target="token-payload"/>) of a signed JSON Web Token (JWT) <xref target="RFC7519"/> envelope. The entire structure, credential and proof together, is signed with the client's private key. The credential and the proof of possession are a single, inseparable cryptographic object: there is no credential without a proof. The <tt>ntk</tt> claim accommodates both JWT and opaque access tokens using the same envelope and validation path, providing uniform proof-of-possession regardless of token format.</t>
      <t>The profile introduces a protocol-neutral <tt>rctx</tt> (Request Context) claim (<xref target="token-payload"/>) that replaces the HTTP-specific <tt>htm</tt>/<tt>htu</tt> claims of DPoP, enabling EPOP tokens to operate over any transport without protocol-specific adaptation. An offline-derived client nonce (<tt>cnonce</tt>) (<xref target="cnonce"/>) computed from public inputs eliminates the server-issued nonce round-trip required by <xref target="RFC9449"/>, enabling stateless proof validation particularly suited to non-HTTP and high-throughput transports. The profile further defines atomic proof-of-possession key rotation, in which a client introduces a new key pair during a token refresh without disrupting the active session, and extends coverage to the full OAuth token lifecycle including token revocation and token exchange. Together, these properties make EPOP the first sender-constraining profile to cover all four combinations: JWT tokens over HTTP, opaque tokens over HTTP, JWT tokens over non-HTTP transports, and opaque tokens over non-HTTP transports.</t>
      <t>For SASL-based protocols, this document defines <tt>OAUTHEPOP</tt>, a new SASL mechanism extending <xref target="RFC7628"/> with sender-constraining support. All behaviors defined in <xref target="RFC7628"/> remain in effect; this document adds only the EPOP-specific authentication type and key binding verification.</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>Conformance requirements for EPOP-issuing Authorization Servers, EPOP-validating Resource Servers, and EPOP Clients are summarized in <xref target="conformance"/>.</t>
      <t>The following terms are used throughout this document:</t>
      <dl>
        <dt>EPOP Token:</dt>
        <dd>
          <t>A signed JWT (<xref target="RFC7519"/>) with <tt>typ: epop+jwt</tt>, signed by the client's private key. Contains an OAuth 2.0 credential in the <tt>ntk</tt> claim when used for resource access, token refresh, token revocation, or token exchange. In authorization code exchange and PAR flows, contains only <tt>cnf.jkt</tt> for key binding; the authorization code travels as the standard <tt>code</tt> form parameter and is never embedded in <tt>ntk</tt>.</t>
        </dd>
        <dt>Nested Token (ntk):</dt>
        <dd>
          <t>The OAuth 2.0 credential (access token, refresh token, or another EPOP token for key rotation) embedded inside an EPOP token's payload. Not present in EPOP tokens used for authorization code exchange.</t>
        </dd>
        <dt>Request Context (rctx):</dt>
        <dd>
          <t>A JSON object in the EPOP payload that identifies the target resource and protocol action, replacing the HTTP-specific <tt>htm</tt>/<tt>htu</tt> claims of DPoP.</t>
        </dd>
        <dt>Client Nonce (cnonce):</dt>
        <dd>
          <t>An HMAC value derived offline from the client's public key, an optional server-supplied seed, and a time-step counter, providing replay resistance without server-issued nonce state.</t>
        </dd>
        <dt>Authorization Server (AS):</dt>
        <dd>
          <t>A server that issues OAuth 2.0 tokens to clients. As defined in <xref target="RFC6749"/>.</t>
        </dd>
        <dt>Resource Server (RS):</dt>
        <dd>
          <t>A server that hosts protected resources and accepts OAuth 2.0 tokens. As defined in <xref target="RFC6749"/>.</t>
        </dd>
        <dt>Client:</dt>
        <dd>
          <t>An application that requests OAuth 2.0 tokens and uses them to access protected resources. As defined in <xref target="RFC6749"/>.</t>
        </dd>
        <dt>JWK Thumbprint:</dt>
        <dd>
          <t>The SHA-256 thumbprint of a JSON Web Key, computed as defined in <xref target="RFC7638"/>.</t>
        </dd>
      </dl>
      <section anchor="conformance">
        <name>Conformance</name>
        <t>This specification defines normative requirements for three conformance roles:</t>
        <dl>
          <dt>EPOP-issuing Authorization Server:</dt>
          <dd>
            <t>An AS that issues EPOP-bound tokens <bcp14>MUST</bcp14> bind all issued tokens to the client's public key via <tt>cnf.jkt</tt>, <bcp14>MUST</bcp14> validate EPOP tokens presented at the token endpoint per <xref target="validating-epop"/>, and <bcp14>MUST</bcp14> publish EPOP capability metadata per <xref target="discovery"/>.</t>
          </dd>
          <dt>EPOP-validating Resource Server:</dt>
          <dd>
            <t>An RS that accepts EPOP tokens <bcp14>MUST</bcp14> verify the outer envelope signature, <bcp14>MUST</bcp14> validate <tt>rctx</tt> members when <tt>rctx</tt> is present, and <bcp14>MUST</bcp14> verify <tt>cnf.jkt</tt> against the key in the EPOP token header per <xref target="validating-epop"/>.</t>
          </dd>
          <dt>EPOP Client:</dt>
          <dd>
            <t>A client producing EPOP tokens <bcp14>MUST</bcp14> sign each token with the private key whose public component appears in the EPOP token header, <bcp14>MUST NOT</bcp14> reuse <tt>jti</tt> values, and <bcp14>MUST</bcp14> derive <tt>cnonce</tt> per <xref target="cnonce"/> when the AS requires it.</t>
          </dd>
        </dl>
      </section>
    </section>
    <section anchor="token-profile">
      <name>EPOP Token Profile</name>
      <t>An EPOP token is a signed JWT (<xref target="RFC7519"/>) with <tt>typ: epop+jwt</tt>.</t>
      <section anchor="token-header">
        <name>Header</name>
        <dl>
          <dt><tt>typ</tt></dt>
          <dd>
            <t><bcp14>REQUIRED</bcp14>. <bcp14>MUST</bcp14> be <tt>epop+jwt</tt>.</t>
          </dd>
          <dt><tt>alg</tt></dt>
          <dd>
            <t><bcp14>REQUIRED</bcp14>. Asymmetric signature algorithm. Edwards curve algorithms are <bcp14>RECOMMENDED</bcp14> for their superior security, performance, and payload compactness; see <xref target="sec-algorithm-selection"/>. Symmetric algorithms (<tt>HS*</tt>) and <tt>none</tt> <bcp14>MUST NOT</bcp14> be used.</t>
          </dd>
          <dt><tt>jwk</tt></dt>
          <dd>
            <t><bcp14>REQUIRED</bcp14>. The client's public key as a JWK (<xref target="RFC7517"/>). <bcp14>MUST NOT</bcp14> contain private key material.</t>
          </dd>
        </dl>
        <t>Example header:</t>
        <sourcecode type="json"><![CDATA[
{
  "typ": "epop+jwt",
  "alg": "EdDSA",
  "jwk": {
    "kty": "OKP",
    "crv": "Ed25519",
    "x": "<base64url-encoded-x>"
  }
}
]]></sourcecode>
      </section>
      <section anchor="token-payload">
        <name>Payload</name>
        <dl>
          <dt><tt>jti</tt></dt>
          <dd>
            <t><bcp14>REQUIRED</bcp14>. Unique JWT ID with high entropy (see <xref target="sec-replay-prevention"/>). Servers <bcp14>MUST</bcp14> maintain a replay cache keyed on <tt>jti</tt>.</t>
          </dd>
          <dt><tt>iat</tt></dt>
          <dd>
            <t><bcp14>REQUIRED</bcp14>. Issued-at Unix timestamp. Servers <bcp14>MUST</bcp14> reject tokens older than the server-defined maximum EPOP lifetime or issued in the future beyond clock skew. EPOP tokens <bcp14>MUST</bcp14> be short-lived, per-request credentials. The <tt>exp</tt> claim <bcp14>MUST NOT</bcp14> be included; the validity window is controlled entirely by the server's <tt>iat</tt>-based lifetime policy and, when <tt>cnonce</tt> is required, by <tt>epop_cnonce_step_seconds</tt>.</t>
          </dd>
          <dt><tt>ntk</tt></dt>
          <dd>
            <t>CONDITIONAL. The nested OAuth 2.0 credential. <bcp14>REQUIRED</bcp14> for resource access, token refresh, token revocation, and introspection. OMITTED in authorization code exchange flows; the authorization code travels as the standard <tt>code</tt> form parameter. JWT credentials (access tokens, refresh tokens, and inner EPOP tokens for key rotation) are encoded as compact-serialized JWTs; opaque credentials are Base64URL-encoded opaque strings.</t>
          </dd>
          <dt><tt>cnonce</tt></dt>
          <dd>
            <t><bcp14>RECOMMENDED</bcp14>. Offline-derived client nonce (see <xref target="cnonce"/>). <bcp14>MUST</bcp14> be included when the server publishes <tt>epop_cnonce_required: true</tt>.</t>
          </dd>
          <dt><tt>rctx</tt></dt>
          <dd>
            <t><bcp14>OPTIONAL</bcp14>. Request context object. When present, all recognized members <bcp14>MUST</bcp14> be validated by the server. Unrecognized members <bcp14>MUST</bcp14> be ignored. Future <tt>rctx</tt> member names will be registered in the EPOP Request Context Members registry (<xref target="iana-rctx"/>).</t>
          </dd>
          <dt><tt>rctx.res</tt></dt>
          <dd>
            <t><bcp14>OPTIONAL</bcp14>. URI or URN of the target resource or endpoint.</t>
          </dd>
          <dt><tt>rctx.method</tt></dt>
          <dd>
            <t><bcp14>RECOMMENDED</bcp14>. Protocol action string. Case-insensitive for HTTP methods; case-sensitive otherwise.</t>
          </dd>
          <dt><tt>rctx.id</tt></dt>
          <dd>
            <t><bcp14>OPTIONAL</bcp14>. Client-generated correlation ID for async or multiplexed protocols.</t>
          </dd>
          <dt><tt>cnf.jkt</tt></dt>
          <dd>
            <t>CONDITIONAL. SHA-256 JWK Thumbprint (<xref target="RFC7638"/>) of the client's public key. <bcp14>REQUIRED</bcp14> in authorization code exchange and in the inner envelope of a key rotation request. <bcp14>SHOULD</bcp14> be omitted on routine resource access and simple refresh where the key is already bound to the token.</t>
          </dd>
        </dl>
        <t>Example payload:</t>
        <sourcecode type="json"><![CDATA[
{
  "jti": "A8B2B026-6C81-4A8C-A403-0F225E3DFEED",
  "iat": 1775749791,
  "ntk": "<credential>",
  "cnonce": "<base64url-hmac-value>",
  "rctx": {
    "res": "https://api.example.com/orders",
    "method": "GET",
    "id": "req_5521"
  },
  "cnf": {
    "jkt": "<sha256-thumbprint-of-public-key>"
  }
}
]]></sourcecode>
      </section>
    </section>
    <section anchor="creating-epop">
      <name>Issuing and Constructing EPOP Tokens</name>
      <t>The client <bcp14>MUST</bcp14> have an asymmetric key pair (private key held exclusively by the client; public key embedded in every EPOP header), a reliable source of high-entropy identifiers for <tt>jti</tt>, and a trusted clock for <tt>iat</tt>.</t>
      <t>An EPOP token is a JWS (<xref target="RFC7515"/>) signed with the client's private key, carrying the header and payload claims defined in <xref target="token-header"/> and <xref target="token-payload"/>. The compact serialization is transmitted as:</t>
      <ul spacing="normal">
        <li>
          <t><strong>Token endpoint and PAR</strong>: the <tt>epop</tt> form parameter in the POST body, preserving the <tt>Authorization</tt> header for client authentication.</t>
        </li>
        <li>
          <t><strong>Resource server</strong>: <tt>Authorization: EPOP &lt;compact-serialized-epop-token&gt;</tt> per <xref target="RFC7235"/>.</t>
        </li>
      </ul>
      <t>When the AS issues tokens in response to a valid EPOP request, it <bcp14>MUST</bcp14> bind the issued credential to the client's public key by including <tt>cnf.jkt</tt> — the SHA-256 JWK Thumbprint (<xref target="RFC7638"/>) of the EPOP token's <tt>jwk</tt> — in the response. For opaque tokens, the AS <bcp14>MUST</bcp14> record this binding server-side for use by the introspection endpoint. The AS <bcp14>MUST NOT</bcp14> issue EPOP-bound tokens unless the EPOP token has been successfully validated per <xref target="validating-epop"/>.</t>
      <t>The token endpoint response <bcp14>MUST</bcp14> include <tt>"token_type": "EPOP"</tt> for all EPOP-bound credentials, per <xref target="RFC6749"/> Section 5.1. This signals to the client that the issued token must be presented using the <tt>Authorization: EPOP</tt> scheme at the RS.</t>
    </section>
    <section anchor="validating-epop">
      <name>Validating an EPOP Token</name>
      <t>To validate an EPOP token, the receiving server <bcp14>MUST</bcp14> ensure all of the following:</t>
      <ol spacing="normal" type="1"><li>
          <t>The <tt>typ</tt> header value is <tt>epop+jwt</tt>.</t>
        </li>
        <li>
          <t>The <tt>jwk</tt> header is a valid asymmetric public key with no private key material.</t>
        </li>
        <li>
          <t>The JWS signature verifies with the public key in <tt>jwk</tt>.</t>
        </li>
        <li>
          <t>The <tt>iat</tt> is within an acceptable window, accounting for clock skew and the server's maximum EPOP lifetime policy.</t>
        </li>
        <li>
          <t>The <tt>jti</tt> has not been seen before; record it and reject any future token presenting the same value.</t>
        </li>
        <li>
          <t>If the server requires <tt>cnonce</tt> (i.e., <tt>epop_cnonce_required</tt> is <tt>true</tt> in its discovery document), the <tt>cnonce</tt> claim <bcp14>MUST</bcp14> be present. If <tt>cnonce</tt> is present, it <bcp14>MUST</bcp14> be valid for the current time-step (see <xref target="cnonce-validation"/>).</t>
        </li>
        <li>
          <t>If <tt>rctx</tt> is present, its members match the current request context; unrecognized members <bcp14>MUST</bcp14> be ignored.</t>
        </li>
        <li>
          <t>If <tt>ntk</tt> is present, <tt>sha256(jwk)</tt> <bcp14>MUST</bcp14> equal <tt>cnf.jkt</tt> from the nested credential (see <xref target="ntk-validation"/>). This check <bcp14>MUST</bcp14> be performed after steps 1–3 pass.</t>
        </li>
      </ol>
      <t>These checks apply at both the AS (token endpoint, PAR) and RS (resource access). The server <bcp14>MUST</bcp14> reject the request with an appropriate error (see <xref target="error-responses"/>) if any check fails.</t>
      <section anchor="error-responses">
        <name>Error Responses</name>
        <t>When a server rejects an EPOP token, it <bcp14>MUST</bcp14> respond as follows.</t>
        <t>At the <strong>token endpoint</strong> (AS), validation failures <bcp14>MUST</bcp14> result in an HTTP 400 response with an OAuth error body per <xref target="RFC6749"/> Section 5.2. The <tt>error</tt> value <bcp14>MUST</bcp14> be <tt>invalid_request</tt> for structural failures (e.g., missing <tt>typ</tt>, invalid <tt>jwk</tt> format) and <tt>invalid_grant</tt> for credential failures (e.g., expired <tt>iat</tt>, replayed <tt>jti</tt>, invalid <tt>cnonce</tt>, <tt>cnf.jkt</tt> mismatch).</t>
        <t>At the <strong>resource server</strong>, validation failures <bcp14>MUST</bcp14> result in an HTTP 401 response with a <tt>WWW-Authenticate</tt> challenge using the <tt>EPOP</tt> scheme per <xref target="RFC7235"/>:</t>
        <sourcecode type="http"><![CDATA[
HTTP/1.1 401 Unauthorized
WWW-Authenticate: EPOP error="invalid_token",
                  error_description="EPOP token validation failed"
]]></sourcecode>
        <t>The <tt>error</tt> parameter <bcp14>MUST</bcp14> be <tt>invalid_token</tt> for any EPOP envelope or key binding failure. Servers <bcp14>MAY</bcp14> include <tt>error_description</tt> with a human-readable explanation. Servers <bcp14>MUST NOT</bcp14> reveal which specific validation step failed, as such information could aid an attacker.</t>
      </section>
      <section anchor="ntk-validation">
        <name>Nested Credential Validation</name>
        <t>When <tt>ntk</tt> is present and the outer envelope has passed steps 1–7, the server <bcp14>MUST</bcp14> perform the key binding check (step 8) and then validate the nested credential:</t>
        <ul spacing="normal">
          <li>
            <t><strong>JWT (access or refresh token)</strong>: verify signature, <tt>iss</tt>, <tt>exp</tt>, <tt>aud</tt>, and scopes.</t>
          </li>
          <li>
            <t><strong>Opaque token</strong>: introspect with the AS per <xref target="RFC7662"/>.</t>
          </li>
          <li>
            <t><strong>Inner EPOP (key rotation)</strong>: apply steps 1–8 to the inner envelope; <tt>cnf.jkt</tt> in the inner envelope identifies the new key.</t>
          </li>
        </ul>
        <t>The key binding check requires <tt>sha256(outer jwk) == cnf.jkt</tt> from the nested credential. If this check fails, the server <bcp14>MUST</bcp14> reject the request with <tt>invalid_token</tt>.</t>
      </section>
    </section>
    <section anchor="flows">
      <name>OAuth 2.0 Flows with EPOP</name>
      <section anchor="as-flows">
        <name>Authorization Server Flows</name>
        <section anchor="as-protocol-changes">
          <name>OAuth 2.0 Protocol Changes Summary</name>
          <table>
            <thead>
              <tr>
                <th align="left">Element</th>
                <th align="left">Change</th>
                <th align="left">Impacted Flows</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">
                  <tt>grant_type</tt></td>
                <td align="left">New values: <tt>epop_code_grant</tt>, <tt>epop_refresh_token</tt></td>
                <td align="left">Authorization code exchange, token refresh</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>epop</tt></td>
                <td align="left">New form parameter; carries compact-serialized EPOP token</td>
                <td align="left">Authorization code exchange, token refresh, PAR</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>actor_token_type</tt></td>
                <td align="left">New values: <tt>urn:ietf:params:oauth:token-type:epop_access_token</tt>, <tt>urn:ietf:params:oauth:token-type:epop_refresh_token</tt></td>
                <td align="left">Token exchange</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>token_type_hint</tt></td>
                <td align="left">New value: <tt>epop_token</tt></td>
                <td align="left">Token revocation, token introspection</td>
              </tr>
              <tr>
                <td align="left">Issued token response</td>
                <td align="left">AS <bcp14>MUST</bcp14> include <tt>cnf.jkt</tt> binding in all issued tokens</td>
                <td align="left">All grant flows</td>
              </tr>
              <tr>
                <td align="left">PKCE (<tt>code_challenge</tt>)</td>
                <td align="left">Elevated from <bcp14>RECOMMENDED</bcp14> to <bcp14>REQUIRED</bcp14></td>
                <td align="left">Authorization code exchange, PAR</td>
              </tr>
            </tbody>
          </table>
        </section>
        <section anchor="auth-code-flow">
          <name>Authorization Code Flow with PKCE</name>
          <t>PKCE (<xref target="RFC7636"/>) is <bcp14>REQUIRED</bcp14> in all EPOP authorization code flows. PKCE and EPOP protect complementary attack surfaces: PKCE binds the authorization request to the token request; EPOP binds the authorization code to the client's key pair. Without PKCE, an attacker who intercepts the authorization code could generate their own key pair and wrap the code in a valid EPOP token signed with their key. Together they provide end-to-end chain of trust from the authorization request through token issuance (see <xref target="fig-auth-code-flow"/>).</t>
          <figure anchor="fig-auth-code-flow">
            <name>Authorization Code Flow with EPOP and PKCE</name>
            <artwork><![CDATA[
Client                           AS                         RS
  |                              |                           |
  |-- 1. Authorization Request ->|                           |
  |   (code_challenge, PKCE)     |                           |
  |                              |                           |
  |<-- 2. Authorization Code ----|                           |
  |                              |                           |
  |-- 3. Token Request (POST) -->|                           |
  |   grant_type=epop_code_grant |  (abbreviated; full URN)  |
  |   epop=<token: cnf.jkt,rctx>|                           |
  |   + code, code_verifier      |                           |
  |   (form parameters)          |                           |
  |                              |                           |
  |<-- 4. Access Token ----------|                           |
  |   (cnf.jkt bound to key)     |                           |
  |                              |                           |
  |-- 5. Resource Request ---------------------------------->|
  |   Authorization: EPOP <epop-token: AT in ntk, rctx>     |
  |                              |                           |
  |<-- 6. Protected Response --------------------------------|
]]></artwork>
          </figure>
          <t>Token request (Step 3):</t>
          <sourcecode type="http"><![CDATA[
NOTE: '\' line wrapping per {{RFC8792}}

POST /token HTTP/1.1
Host: as.example.com
Content-Type: application/x-www-form-urlencoded
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW

grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Aepop_code_grant
&code=SplxlOBeZQQYbYS6WxSbIA
&client_id=s6BhdRkqt3
&redirect_uri=https%3A%2F%2Fclient.example.com%2Fcb
&code_verifier=bEaL42izcC-o-xBk0K2vuJ6U-y1p9r_wW2dFWIWgjz-
&epop=eyJ0eXAiOiJlcG9wK2p3dCIsImFsZyI6IkVkRFNBIiwiandrIjp7Imt0eSI6Ik9\
LUCIsImNydiI6IkVkMjU1MTkiLCJ4IjoiMTFxWUFZS3hDcmZWU183VHlXUUhPZzdoY3Z\
QYXBpTWxyd0lhYVBjSFVSbyJ9fQ.eyJqdGkiOiJBOEIyQjAyNi02QzgxLTRBOEMtQTQw\
My0wRjIyNUUzREZFRUQiLCJpYXQiOjE3NzU3NDk3OTEsImNuZiI6eyJqa3QiOiJrUHJL\
X3FteFZXYVlWQTl3d0JGNkl1bzN2Vnp6N1R4SENUd1hCeWdyUzRrIn0sInJjdHgiOnsi\
cmVzIjoiaHR0cHM6Ly9hcy5leGFtcGxlLmNvbS90b2tlbiIsIm1ldGhvZCI6IlBPU1Qi\
fX0.I45kzp-niCPrDZoHUA_n9vor9lqjBD7Pw3hNcaecAVkCKl2yyZIUqZseociCHt_U\
U60NFDLx6kEE8NWIR4aYAQ
]]></sourcecode>
          <t>Decoded EPOP token payload for this request (<tt>cnf.jkt</tt> declares the client's key binding; <tt>ntk</tt> is absent because the authorization code travels as the <tt>code</tt> form parameter per standard OAuth 2.0):</t>
          <sourcecode type="json"><![CDATA[
{
  "jti": "A8B2B026-6C81-4A8C-A403-0F225E3DFEED",
  "iat": 1775749791,
  "cnf": {
    "jkt": "kPrK_qmxVWaYVA9wwBF6Iuo3vVzz7TxHCTwXBygrS4k"
  },
  "rctx": {
    "res": "https://as.example.com/token",
    "method": "POST"
  }
}
]]></sourcecode>
          <t>Token endpoint response (Step 4):</t>
          <sourcecode type="json"><![CDATA[
{
  "access_token": "<compact-serialized-jwt-access-token>",
  "token_type": "EPOP",
  "expires_in": 3600
}
]]></sourcecode>
          <t>The issued access token returned by the AS carries the <tt>cnf.jkt</tt> binding:</t>
          <sourcecode type="json"><![CDATA[
{
  "sub": "jdoe@acme.org",
  "aud": ["https://api.example.com"],
  "cnf": {
    "jkt": "kPrK_qmxVWaYVA9wwBF6Iuo3vVzz7TxHCTwXBygrS4k"
  },
  "iat": 1775749800,
  "exp": 1775753400
}
]]></sourcecode>
        </section>
        <section anchor="refresh-flow">
          <name>Token Refresh Flow</name>
          <t>The client wraps the refresh token in the <tt>ntk</tt> claim of an EPOP token and submits it using the <tt>epop_refresh_token</tt> grant type:</t>
          <sourcecode type="http"><![CDATA[
POST /token HTTP/1.1
Host: as.example.com
Content-Type: application/x-www-form-urlencoded
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW

grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Aepop_refresh_token
&client_id=s6BhdRkqt3
&epop=<compact-serialized-epop-token>
]]></sourcecode>
          <section anchor="simple-refresh">
            <name>Simple Refresh</name>
            <t>The EPOP token wraps the refresh token directly in <tt>ntk</tt>:</t>
            <sourcecode type="json"><![CDATA[
{
  "jti": "<unique-id>",
  "iat": "<unix-time>",
  "ntk": "<refresh-token-opaque-or-jwt>",
  "rctx": { "res": "https://as.example.com/token", "method": "POST" }
}
]]></sourcecode>
            <t>After standard EPOP validation (<xref target="validating-epop"/>), the AS validates the nested refresh token. For an opaque token, the AS looks it up in the server-side store, verifies it is not revoked or expired, and confirms the associated key matches <tt>sha256(outer jwk)</tt>. For a JWT refresh token, the AS verifies the signature, <tt>iss</tt>, <tt>exp</tt>, and <tt>jti</tt>, then confirms <tt>cnf.jkt == sha256(outer jwk)</tt>.</t>
          </section>
          <section anchor="key-rotation-refresh">
            <name>Key Rotation Refresh</name>
            <t>Key rotation uses a two-layer structure. The inner envelope is a Simple Refresh EPOP token (signed with the OLD key) with one addition: <tt>cnf.jkt</tt> set to the thumbprint of the NEW key. The outer envelope, signed with the NEW key, carries the compact-serialized inner EPOP token in <tt>ntk</tt>:</t>
            <sourcecode type="json"><![CDATA[
{
  "jti": "<unique-id-outer>",
  "iat": "<unix-time>",
  "ntk": "<compact-serialized-inner-epop-token>"
}
]]></sourcecode>
            <t>Standard EPOP validation (<xref target="validating-epop"/>) applies to both envelopes. Beyond that, the AS verifies the key handoff chain: <tt>sha256(inner jwk)</tt> <bcp14>MUST</bcp14> match the key previously bound to the refresh token, and <tt>sha256(outer jwk)</tt> <bcp14>MUST</bcp14> equal <tt>inner cnf.jkt</tt>. On success, the AS issues new tokens bound to <tt>sha256(outer jwk)</tt>, atomically updates the server-side key binding, and revokes the old key for this session. The old key's authorization of the new key's introduction, combined with the new key's simultaneous proof of possession, provides a non-repudiable chain of custody.</t>
          </section>
        </section>
        <section anchor="token-introspection">
          <name>Token Introspection</name>
          <t>Token introspection (<xref target="RFC7662"/>) for EPOP tokens supports two modes.</t>
          <section anchor="introspection-inner">
            <name>Mode 1: Inner Token Introspection</name>
            <t>The caller extracts the access token from the <tt>ntk</tt> claim of the received EPOP token and submits it to the introspection endpoint with the appropriate <tt>token_type_hint</tt> (e.g., <tt>access_token</tt>):</t>
            <sourcecode type="http"><![CDATA[
POST /introspect HTTP/1.1
Host: as.example.com
Content-Type: application/x-www-form-urlencoded
Authorization: Basic <rs-credentials>

token=<access-token-extracted-from-ntk>
&token_type_hint=access_token
]]></sourcecode>
            <t>The introspection response includes <tt>cnf.jkt</tt>. The caller <bcp14>MUST</bcp14> verify that <tt>sha256(EPOP token signing key)</tt> equals the <tt>cnf.jkt</tt> returned in the response. This check confirms that the EPOP envelope was signed by the key legitimately bound to the nested token.</t>
          </section>
          <section anchor="introspection-epop">
            <name>Mode 2: Full EPOP Token Introspection</name>
            <t>The caller sends the entire EPOP token to the introspection endpoint with <tt>token_type_hint=epop_token</tt>:</t>
            <sourcecode type="http"><![CDATA[
POST /introspect HTTP/1.1
Host: as.example.com
Content-Type: application/x-www-form-urlencoded
Authorization: Basic <rs-credentials>

token=<epop-token-received-from-client>
&token_type_hint=epop_token
]]></sourcecode>
            <t>The AS validates the EPOP envelope signature, extracts the credential from <tt>ntk</tt>, and validates it. The AS <bcp14>MUST</bcp14> verify that <tt>sha256(EPOP token signing key)</tt> equals the <tt>cnf.jkt</tt> in the nested token before returning a response. This check prevents a caller from presenting a valid EPOP envelope wrapping a token not bound to that key.</t>
            <t>In both modes the introspection response includes <tt>cnf.jkt</tt>. For opaque tokens, <tt>cnf.jkt</tt> is the server-side registered client EPOP public key; for JWT tokens it is extracted from the token's own <tt>cnf.jkt</tt> claim. The <tt>token_type</tt> field reflects the type of the inner access token in <tt>ntk</tt>, not the outer EPOP envelope.</t>
            <sourcecode type="json"><![CDATA[
{
  "active": true,
  "token_type": "Bearer",
  "sub": "jdoe@acme.org",
  "iss": "https://as.example.com",
  "aud": ["https://api.example.com"],
  "scope": "read:orders",
  "iat": 1775748567,
  "exp": 1775752167,
  "cnf": {
    "jkt": "NLp8qGUJ1ywXs4ayYFLHfh8TA0crUe4g78UyBfx5j0Y"
  }
}
]]></sourcecode>
          </section>
        </section>
        <section anchor="token-exchange">
          <name>Token Exchange</name>
          <t>Clients can exchange an EPOP-wrapped token for a new token using the token exchange framework (<xref target="RFC8693"/>). In this flow the client is the actor — it acts on behalf of a subject and proves its identity by presenting the EPOP token as the <tt>actor_token</tt>. The <tt>subject_token</tt> carries the token being exchanged on behalf of the subject; <tt>subject_token_type</tt> identifies its format. The <tt>actor_token_type</tt> identifies the EPOP token format using the <tt>epop_access_token</tt> token type identifier (<xref target="iana-token-types"/>):</t>
          <sourcecode type="http"><![CDATA[
POST /token HTTP/1.1
Host: as.example.com
Content-Type: application/x-www-form-urlencoded
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW

grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Atoken-exchange
&subject_token=<subject-access-token>
&subject_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Aaccess_token
&actor_token=<compact-serialized-epop-token>
&actor_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Aepop_access_token
&requested_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Aepop_access_token
]]></sourcecode>
          <t>The AS <bcp14>MUST</bcp14> validate the EPOP envelope per <xref target="validating-epop"/> before processing the exchange. The AS <bcp14>MUST</bcp14> also validate the <tt>subject_token</tt> independently per its token type. The AS issues a new EPOP-wrapped access token bound to the same client public key, or to a new key if the exchange request includes key rotation.</t>
          <t>Token exchange response:</t>
          <sourcecode type="json"><![CDATA[
{
  "access_token": "<compact-serialized-epop-bound-access-token>",
  "issued_token_type": "urn:ietf:params:oauth:token-type:epop_access_token",
  "token_type": "EPOP",
  "expires_in": 3600
}
]]></sourcecode>
          <t>The issued access token carries <tt>cnf.jkt</tt> bound to the client's public key, as in all EPOP flows.</t>
        </section>
        <section anchor="token-revocation">
          <name>Token Revocation</name>
          <t>Clients revoke EPOP-wrapped tokens using the token revocation framework (<xref target="RFC7009"/>). The client constructs and signs the EPOP token containing the credential to be revoked, then submits it as the <tt>token</tt> parameter with a <tt>token_type_hint</tt> identifying the credential type:</t>
          <sourcecode type="http"><![CDATA[
POST /revoke HTTP/1.1
Host: as.example.com
Content-Type: application/x-www-form-urlencoded
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW

token=<compact-serialized-epop-token>
&token_type_hint=epop_token
]]></sourcecode>
          <t>The AS <bcp14>MUST</bcp14> validate the EPOP envelope per <xref target="validating-epop"/> before processing revocation. The <tt>token_type_hint</tt> value <bcp14>MUST</bcp14> be <tt>epop_token</tt> (<xref target="iana-token-type-hint"/>).</t>
          <t>The requirement that the client construct and sign the EPOP envelope provides proof-of-possession on revocation: an attacker who captured a token but does not hold the corresponding private key cannot revoke it. This is a deliberate security improvement over plain RFC 7009 revocation, where any party holding the raw token value can submit a revocation request.</t>
        </section>
        <section anchor="par">
          <name>Pushed Authorization Requests</name>
          <t>For PAR (<xref target="RFC9126"/>), the client <bcp14>MAY</bcp14> declare its public key fingerprint at the PAR endpoint to pre-bind the authorization code to the client's key before the browser redirect. The client includes the EPOP token as the <tt>epop</tt> form parameter — with <tt>cnf.jkt</tt> and <tt>rctx</tt> but no <tt>ntk</tt> — alongside the standard PAR request parameters. The <tt>Authorization</tt> header carries client authentication as usual. PKCE parameters (<tt>code_challenge</tt>, <tt>code_challenge_method</tt>) <bcp14>MUST</bcp14> be included in the PAR request (this specification elevates PKCE from <bcp14>RECOMMENDED</bcp14> in <xref target="RFC9126"/> to <bcp14>REQUIRED</bcp14> in all EPOP flows); the subsequent token endpoint request <bcp14>MUST</bcp14> include <tt>code_verifier</tt>.</t>
          <t>EPOP token payload for the PAR request:</t>
          <sourcecode type="json"><![CDATA[
{
  "jti": "<unique-id>",
  "iat": "<unix-time>",
  "cnf": { "jkt": "<client-public-key-thumbprint>" },
  "rctx": {
    "res": "https://as.example.com/par",
    "method": "POST"
  }
}
]]></sourcecode>
          <t>HTTP request:</t>
          <sourcecode type="http"><![CDATA[
POST /par HTTP/1.1
Host: as.example.com
Content-Type: application/x-www-form-urlencoded
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW

response_type=code
&client_id=s6BhdRkqt3
&redirect_uri=https%3A%2F%2Fclient.example.com%2Fcb
&scope=read%3Aorders
&code_challenge=E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM
&code_challenge_method=S256
&epop=<compact-serialized-epop-token>
]]></sourcecode>
          <t>The AS verifies the EPOP signature, extracts <tt>cnf.jkt</tt>, and records it against the <tt>request_uri</tt> it returns. Once a <tt>cnf.jkt</tt> is registered via PAR, that key binding is final for the lifetime of the resulting authorization code. If the EPOP token presented at the token endpoint declares a different <tt>cnf.jkt</tt> than the one recorded at the PAR endpoint, the AS <bcp14>MUST</bcp14> reject the request.</t>
        </section>
        <section anchor="unsupported-flows">
          <name>Unsupported Flows</name>
          <section anchor="client-credentials-flow">
            <name>Client Credentials Flow</name>
            <t>Client credentials flow is not covered by this specification.</t>
          </section>
          <section anchor="auth-request-binding">
            <name>Authorization Request Key Binding Not Supported</name>
            <t>Binding a public key thumbprint inside the authorization request URL (analogous to <tt>dpop_jkt</tt> in <xref target="RFC9449"/> Section 10) is not supported; see <xref target="sec-auth-request-binding"/> for the security rationale.</t>
          </section>
        </section>
      </section>
      <section anchor="rs-flows">
        <name>Resource Server Flows</name>
        <section anchor="resource-access">
          <name>Resource Access</name>
          <t>The client sends the EPOP token in the HTTP <tt>Authorization</tt> header using the <tt>EPOP</tt> authentication scheme (<xref target="RFC7235"/>). No <tt>Authorization: Bearer</tt> header is used.</t>
          <t>EPOP token payload:</t>
          <sourcecode type="json"><![CDATA[
{
  "jti": "626545DF-CD19-48EA-BB85-974130E012B5",
  "iat": 1775749791,
  "ntk": "<compact-serialized-access-token>",
  "rctx": {
    "res": "https://api.example.com/orders",
    "method": "GET"
  }
}
]]></sourcecode>
          <t>HTTP request:</t>
          <sourcecode type="http"><![CDATA[
GET /orders HTTP/1.1
Host: api.example.com
Authorization: EPOP <compact-serialized-epop-token>
]]></sourcecode>
          <t>The RS verifies the outer envelope, then extracts and validates the access token from <tt>ntk</tt> as defined in <xref target="ntk-validation"/>.</t>
        </section>
        <section anchor="non-http-protocols">
          <name>Non-HTTP and Agentic Protocols</name>
          <t>The EPOP token structure is identical for non-HTTP protocols; only <tt>rctx</tt> values differ. The <tt>rctx.res</tt> field accommodates any URI or URN:</t>
          <table>
            <thead>
              <tr>
                <th align="left">Protocol</th>
                <th align="left">rctx.res</th>
                <th align="left">rctx.method</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">HTTPS</td>
                <td align="left">
                  <tt>https://api.example.com/orders</tt></td>
                <td align="left">
                  <tt>GET</tt></td>
              </tr>
              <tr>
                <td align="left">MQTT</td>
                <td align="left">
                  <tt>urn:mqtt:broker:sensors/temperature</tt></td>
                <td align="left">
                  <tt>PUBLISH</tt></td>
              </tr>
              <tr>
                <td align="left">MCP</td>
                <td align="left">
                  <tt>urn:mcp:server:filesystem</tt></td>
                <td align="left">
                  <tt>tools/call</tt></td>
              </tr>
              <tr>
                <td align="left">Kafka</td>
                <td align="left">
                  <tt>urn:kafka:cluster:orders-topic</tt></td>
                <td align="left">
                  <tt>Produce</tt></td>
              </tr>
              <tr>
                <td align="left">gRPC</td>
                <td align="left">
                  <tt>urn:grpc:service:helloworld.Greeter</tt></td>
                <td align="left">
                  <tt>SayHello</tt></td>
              </tr>
            </tbody>
          </table>
          <t>The <tt>rctx.id</tt> field lets the server correlate the EPOP token with an asynchronous response — critical in multiplexed or streaming protocols where request/response pairs are not strictly sequential:</t>
          <sourcecode type="json"><![CDATA[
{
  "jti": "9F3A1C22-4D87-4B3E-BC12-0A5E8D7F1234",
  "iat": 1775750000,
  "ntk": "<compact-serialized-access-token>",
  "rctx": {
    "res": "urn:mcp:server:filesystem",
    "method": "tools/call",
    "id": "req_5521"
  }
}
]]></sourcecode>
        </section>
        <section anchor="sasl">
          <name>SASL Integration</name>
          <t>This section extends <xref target="RFC7628"/> to support Enveloped Proof of Possession. All behaviors defined in <xref target="RFC7628"/> — including the GS2 (<xref target="RFC5801"/>) message structure, connection-establishment scope, server error challenge format, and error handling — apply to <tt>OAUTHEPOP</tt> unless explicitly stated otherwise in this section.</t>
          <section anchor="oauthepop-mechanism">
            <name>OAUTHEPOP Mechanism</name>
            <t><tt>OAUTHEPOP</tt> is a new SASL mechanism following the structure of <xref target="RFC7628"/> Section 3. Implementors should note that EPOP compact serializations (header, payload, and signature) may be significantly larger than a plain bearer token; SASL implementations <bcp14>MUST</bcp14> support initial client response buffers large enough to carry the full compact-serialized EPOP JWT. It introduces <tt>EPOP</tt> as the OAuth authentication type for the <tt>auth</tt> field of the GS2 initial client response.</t>
            <t>The <tt>auth</tt> field for <tt>OAUTHEPOP</tt> is defined as:</t>
            <artwork><![CDATA[
auth-field = "auth" "=" "EPOP" SP epop-token kvsep
]]></artwork>
            <t>where <tt>epop-token</tt> is the compact-serialized EPOP JWT as defined in <xref target="token-profile"/> and <tt>kvsep</tt> is <tt>%x01</tt> per <xref target="RFC7628"/>. All other fields in the GS2 initial client response (<tt>host</tt>, <tt>port</tt>, GS2 header, final <tt>kvsep</tt>) are unchanged from <xref target="RFC7628"/> Section 3.</t>
            <t>Example initial client response (using <tt>%x01</tt> represented as <tt>&lt;SOH&gt;</tt>):</t>
            <artwork><![CDATA[
n,,<SOH>auth=EPOP <compact-epop-token><SOH>host=mail.example.com<SOH>port=993<SOH><SOH>
]]></artwork>
          </section>
          <section anchor="oauthbearer-compat">
            <name>OAUTHBEARER Backward Compatibility</name>
            <t>Servers advertising <tt>OAUTHBEARER</tt> <bcp14>MAY</bcp14> also accept EPOP tokens by recognizing <tt>auth=EPOP</tt> in the initial client response. When a server receives <tt>auth=EPOP</tt> over the <tt>OAUTHBEARER</tt> mechanism, it <bcp14>MUST</bcp14> treat the value as a compact-serialized EPOP JWT and apply the key binding check defined in <xref target="ntk-validation"/>.</t>
            <t>The server determines whether the nested access token in <tt>ntk</tt> is EPOP-bound as follows:</t>
            <ul spacing="normal">
              <li>
                <t><strong>Opaque nested access token</strong>: The server calls token introspection (<xref target="RFC7662"/>). If the introspection response includes <tt>cnf.jkt</tt>, the token is EPOP-bound; the server <bcp14>MUST</bcp14> verify <tt>sha256(outer jwk) == cnf.jkt</tt> before accepting the connection.</t>
              </li>
              <li>
                <t><strong>JWT nested access token</strong>: The server inspects the <tt>typ</tt> claim of the access token extracted from <tt>ntk</tt>. If <tt>typ == "epop+jwt"</tt>, the token is EPOP-bound; the server <bcp14>MUST</bcp14> apply the same key binding check.</t>
              </li>
            </ul>
            <t>Servers <bcp14>SHOULD</bcp14> advertise <tt>OAUTHEPOP</tt> in SASL capability responses when EPOP is supported and <bcp14>SHOULD</bcp14> list it ahead of <tt>OAUTHBEARER</tt>. Clients that support EPOP <bcp14>MUST</bcp14> use <tt>OAUTHEPOP</tt> when the server advertises it.</t>
          </section>
        </section>
        <section anchor="userinfo-endpoint">
          <name>UserInfo Endpoint</name>
          <t>The client presents an EPOP token wrapping the access token at the UserInfo endpoint:</t>
          <sourcecode type="json"><![CDATA[
{
  "jti": "<unique-id>",
  "iat": "<unix-time>",
  "ntk": "<access-token>",
  "rctx": {
    "res": "https://as.example.com/userinfo",
    "method": "GET"
  }
}
]]></sourcecode>
          <sourcecode type="http"><![CDATA[
GET /userinfo HTTP/1.1
Host: as.example.com
Authorization: EPOP <compact-serialized-epop-token>
]]></sourcecode>
          <t>The AS validates the EPOP token per <xref target="validating-epop"/>, verifying <tt>rctx.res</tt> matches its UserInfo endpoint URI, then returns UserInfo claims.</t>
        </section>
        <section anchor="rs-binding">
          <name>Resource Server Binding</name>
          <section anchor="key-binding-enforcement">
            <name>Key Binding Enforcement</name>
            <t>Every JWT access token issued under EPOP carries a <tt>cnf.jkt</tt> claim — the SHA-256 thumbprint of the client's EPOP public key. When the RS receives an EPOP-wrapped request:</t>
            <ol spacing="normal" type="1"><li>
                <t>It verifies the outer EPOP signature using the <tt>jwk</tt> embedded in the header.</t>
              </li>
              <li>
                <t>It extracts the access token from <tt>ntk</tt> and validates it (signature, <tt>exp</tt>, <tt>aud</tt>, scopes).</t>
              </li>
              <li>
                <t>It computes <tt>sha256(outer jwk header key)</tt> and compares it to <tt>cnf.jkt</tt> inside the access token.</t>
              </li>
            </ol>
            <t>If the two values differ, the RS <bcp14>MUST</bcp14> reject the request with <tt>invalid_token</tt>. This check prevents an attacker from wrapping a stolen access token in their own EPOP envelope.</t>
          </section>
          <section anchor="early-exit">
            <name>Early-Exit Pattern</name>
            <t>The <tt>rctx</tt> check (<xref target="validating-epop"/> Step 7) <bcp14>SHOULD</bcp14> occur before nested credential validation (<xref target="ntk-validation"/>). If <tt>rctx.res</tt> or <tt>rctx.method</tt> does not match the current request, the RS <bcp14>SHOULD</bcp14> reject immediately without decoding or verifying the access token. This is the primary defense against replay of an EPOP token from one endpoint at another within the token's short validity window.</t>
          </section>
          <section anchor="rs-opaque-tokens">
            <name>RS Handling of Opaque Access Tokens</name>
            <t>When the access token in <tt>ntk</tt> is opaque, the RS <bcp14>MUST</bcp14> introspect the received EPOP token with the AS (<xref target="RFC7662"/>), passing it as the <tt>token</tt> parameter with <tt>token_type_hint=epop_token</tt> so the AS can validate the envelope and extract the inner token:</t>
            <sourcecode type="http"><![CDATA[
POST /introspect HTTP/1.1
Host: as.example.com
Content-Type: application/x-www-form-urlencoded
Authorization: Basic <rs-credentials>

token=<epop-token-received-from-client>
&token_type_hint=epop_token
]]></sourcecode>
            <t>The introspection response includes the <tt>cnf.jkt</tt> claim:</t>
            <sourcecode type="json"><![CDATA[
{
  "active": true,
  "sub": "jdoe@acme.org",
  "scope": "read:orders",
  "cnf": {
    "jkt": "NLp8qGUJ1ywXs4ayYFLHfh8TA0crUe4g78UyBfx5j0Y"
  },
  "exp": 1775752167
}
]]></sourcecode>
          </section>
          <section anchor="rs-state-management">
            <name>RS State Management for Opaque Tokens</name>
            <t>The RS <bcp14>MUST NOT</bcp14> cache introspection results beyond the EPOP token's validity window. Since EPOP tokens are very short duration per-request credentials, a stale introspection cache could cause the RS to validate a post-rotation request against the pre-rotation key.</t>
            <t>When the client performs key rotation (<xref target="key-rotation-refresh"/>), the AS <bcp14>MUST</bcp14> atomically update its server-side registry before issuing any new tokens. Introspection responses for access tokens issued after rotation <bcp14>MUST</bcp14> reflect the new client EPOP public key.</t>
            <table>
              <thead>
                <tr>
                  <th align="left">Scenario</th>
                  <th align="left">RS Obligation</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="left">Opaque access token, no caching</td>
                  <td align="left">Call introspection per request; use returned <tt>cnf.jkt</tt> for binding check</td>
                </tr>
                <tr>
                  <td align="left">Opaque access token, cached introspection</td>
                  <td align="left">Cache <bcp14>MUST</bcp14> expire at or before the EPOP token validity window; <bcp14>MUST NOT</bcp14> reuse across key rotation</td>
                </tr>
                <tr>
                  <td align="left">Key mismatch detected</td>
                  <td align="left">Reject with <tt>invalid_token</tt>; <bcp14>MUST NOT</bcp14> fall back to a previously cached key</td>
                </tr>
                <tr>
                  <td align="left">Opaque refresh token key rotation (AS-side)</td>
                  <td align="left">AS <bcp14>MUST</bcp14> atomically update server-side key registration; partial update <bcp14>MUST NOT</bcp14> be possible</td>
                </tr>
              </tbody>
            </table>
          </section>
        </section>
      </section>
    </section>
    <section anchor="cnonce">
      <name>Client Nonce (cnonce)</name>
      <section anchor="cnonce-overview">
        <name>Overview</name>
        <t><tt>cnonce</tt> is an offline-derived nonce that time-bounds each EPOP token to a discrete step window. Unlike the DPoP server-issued nonce (<xref target="RFC9449"/> Section 8), it requires no server round-trip and carries no server-side nonce state, making it particularly suited to non-HTTP transports and high-throughput deployments. <tt>cnonce</tt> reduces the replay opportunity within a window; the <tt>jti</tt> replay cache (<xref target="validating-epop"/> Step 5) remains the primary replay prevention mechanism and <bcp14>MUST</bcp14> be maintained regardless.</t>
      </section>
      <section anchor="cnonce-notation">
        <name>Notation</name>
        <t>The following notation is used in this section:</t>
        <dl>
          <dt><tt>SPKI</tt></dt>
          <dd>
            <t>DER-encoded SubjectPublicKeyInfo of the client public key in the EPOP token header.</t>
          </dd>
          <dt><tt>X</tt></dt>
          <dd>
            <t>Time-step duration in seconds, taken from <tt>epop_cnonce_step_seconds</tt>.</t>
          </dd>
          <dt><tt>seed</tt></dt>
          <dd>
            <t>Optional 32-byte deployment seed from <tt>epop_cnonce_seed</tt>. When absent, treated as the empty octet string.</t>
          </dd>
          <dt><tt>HKDF-SHA256(ikm, salt, info, len)</tt></dt>
          <dd>
            <t>HKDF with SHA-256 per <xref target="RFC5869"/>, producing <tt>len</tt> octets.</t>
          </dd>
          <dt><tt>HMAC-SHA256(key, data)</tt></dt>
          <dd>
            <t>HMAC with SHA-256 per <xref target="RFC2104"/>.</t>
          </dd>
          <dt><tt>BASE64URL(octets)</tt></dt>
          <dd>
            <t>Base64url encoding without padding per <xref target="RFC4648"/> Section 5.</t>
          </dd>
          <dt><tt>UTF8(str)</tt></dt>
          <dd>
            <t>UTF-8 encoding of string <tt>str</tt> per <xref target="RFC3629"/>.</t>
          </dd>
          <dt><tt>UINT64BE(n)</tt></dt>
          <dd>
            <t>8-octet big-endian encoding of integer <tt>n</tt>.</t>
          </dd>
          <dt><tt>||</tt></dt>
          <dd>
            <t>Octet string concatenation.</t>
          </dd>
        </dl>
      </section>
      <section anchor="cnonce-computation">
        <name>Computation</name>
        <t>The time-step counter is:</t>
        <artwork><![CDATA[
T = floor(CurrentUnixTime / X)
]]></artwork>
        <t>The per-client key material is derived once per key pair and re-derived on seed rotation:</t>
        <artwork><![CDATA[
key_material = HKDF-SHA256(seed || SPKI, SHA256(SPKI), "epop-cnonce-v1", 32)
]]></artwork>
        <t>When <tt>seed</tt> is absent, <tt>ikm = SPKI</tt>. The optional <tt>seed</tt> scopes derivation per deployment so that cnonce values from clients under different seeds are non-interchangeable.</t>
        <t>The cnonce value is:</t>
        <artwork><![CDATA[
cnonce = BASE64URL(HMAC-SHA256(key_material, UTF8(jti) || UINT64BE(T)))
]]></artwork>
        <t>where <tt>jti</tt> is the EPOP token's own unique identifier.</t>
      </section>
      <section anchor="cnonce-validation">
        <name>Verification</name>
        <t>The server (AS or RS) derives <tt>key_material</tt> identically and verifies:</t>
        <artwork><![CDATA[
cnonce == BASE64URL(HMAC-SHA256(key_material, UTF8(jti) || UINT64BE(t)))
]]></artwork>
        <t>for any <tt>t</tt> ∈ <tt>{T-1, T, T+1}</tt>. This window absorbs clock skew of up to one step. If no value of <tt>t</tt> satisfies the equality, the server <bcp14>MUST</bcp14> reject the token. A cnonce satisfying the time-window check but carrying a replayed <tt>jti</tt> is caught by the replay cache (<xref target="validating-epop"/> Step 5).</t>
        <t>When <tt>epop_cnonce_seed</tt> is rotated, the server <bcp14>MUST</bcp14> update <tt>epop_cnonce_seed_id</tt> simultaneously so that clients re-derive <tt>key_material</tt>.</t>
      </section>
    </section>
    <section anchor="discovery">
      <name>Discovery Metadata</name>
      <t>Authorization Servers that support EPOP <bcp14>MUST</bcp14> publish their capabilities in the OAuth Authorization Server Metadata document (<xref target="RFC8414"/>), available at <tt>/.well-known/oauth-authorization-server</tt> (or <tt>/.well-known/openid-configuration</tt> for OpenID Connect providers). Resource Servers publish EPOP capabilities in the OAuth Protected Resource Metadata document (<xref target="RFC9728"/>), available at <tt>/.well-known/oauth-protected-resource</tt>.</t>
      <section anchor="epop-metadata-fields">
        <name>Metadata Fields</name>
        <t>The <tt>epop_cnonce_seed</tt>, <tt>epop_cnonce_seed_id</tt>, and <tt>epop_cnonce_step_seconds</tt> values <bcp14>MUST</bcp14> be identical in the AS and RS discovery documents. Clients <bcp14>SHOULD</bcp14> validate this consistency on startup and after any seed rotation.</t>
        <dl>
          <dt><tt>epop_supported</tt></dt>
          <dd>
            <t>String; AS and RS. <bcp14>REQUIRED</bcp14> when EPOP is active. Server EPOP posture: <tt>"disabled"</tt> — clients <bcp14>MUST NOT</bcp14> send EPOP tokens; <tt>"recommended"</tt> — EPOP accepted but non-EPOP requests also accepted; <tt>"required"</tt> — requests without a valid EPOP token <bcp14>MUST</bcp14> be rejected.</t>
          </dd>
          <dt><tt>epop_ntk_types_supported</tt></dt>
          <dd>
            <t>Array of strings; AS and RS. <bcp14>REQUIRED</bcp14> when <tt>epop_supported</tt> is not <tt>"disabled"</tt>. Credential formats accepted inside <tt>ntk</tt>: <tt>"jwt"</tt> and/or <tt>"opaque"</tt>.</t>
          </dd>
          <dt><tt>epop_key_rotation_supported</tt></dt>
          <dd>
            <t>Boolean; AS only. Default: <tt>false</tt>. When <tt>true</tt>, the server supports the two-layer EPOP key rotation flow (<xref target="key-rotation-refresh"/>). Clients <bcp14>MUST</bcp14> check this field before attempting key rotation.</t>
          </dd>
          <dt><tt>epop_cnonce_required</tt></dt>
          <dd>
            <t>Boolean; AS and RS. Default: <tt>false</tt>. When <tt>true</tt>, the server <bcp14>MUST</bcp14> reject EPOP tokens that omit <tt>cnonce</tt>. Clients <bcp14>MUST</bcp14> include <tt>cnonce</tt> if either the AS or RS sets this to <tt>true</tt>.</t>
          </dd>
          <dt><tt>epop_cnonce_step_seconds</tt></dt>
          <dd>
            <t>Integer; AS and RS. <bcp14>REQUIRED</bcp14> when <tt>epop_cnonce_required</tt> is <tt>true</tt>. Time-step duration in seconds; both client and server compute <tt>T = floor(utc_now() / epop_cnonce_step_seconds)</tt>. <bcp14>MUST</bcp14> be identical in AS and RS documents.</t>
          </dd>
          <dt><tt>epop_cnonce_seed</tt></dt>
          <dd>
            <t>String (Base64URL, 32 bytes); AS and RS. <bcp14>OPTIONAL</bcp14>. Namespace discriminator for multi-tenant deployments; mixed into the per-client HKDF derivation so cnonce values across tenants are non-interchangeable. Not a secret. <bcp14>MUST</bcp14> be identical in AS and RS documents when present. Rotated in coordination with <tt>epop_cnonce_seed_id</tt>.</t>
          </dd>
          <dt><tt>epop_cnonce_seed_id</tt></dt>
          <dd>
            <t>String; AS and RS. <bcp14>REQUIRED</bcp14> when <tt>epop_cnonce_seed</tt> is present; <bcp14>OPTIONAL</bcp14> otherwise. Opaque identifier for the current <tt>epop_cnonce_seed</tt>. Clients <bcp14>MUST</bcp14> cache the discovery document keyed on this value and re-derive <tt>key_material</tt> only when it changes. <bcp14>MUST</bcp14> be identical in AS and RS documents.</t>
          </dd>
        </dl>
      </section>
      <section anchor="as-metadata-example">
        <name>AS Metadata Example</name>
        <sourcecode type="json"><![CDATA[
{
  "issuer": "https://as.example.com",
  "token_endpoint": "https://as.example.com/token",
  "epop_supported": "recommended",
  "epop_ntk_types_supported": ["jwt", "opaque"],
  "epop_key_rotation_supported": true,
  "epop_cnonce_required": true,
  "epop_cnonce_step_seconds": 30,
  "epop_cnonce_seed": "<base64url-32-bytes>",
  "epop_cnonce_seed_id": "seed-2026-q2"
}
]]></sourcecode>
      </section>
      <section anchor="rs-metadata-example">
        <name>RS Metadata Example</name>
        <sourcecode type="json"><![CDATA[
{
  "resource": "https://api.example.com",
  "authorization_servers": ["https://as.example.com"],
  "epop_supported": "required",
  "epop_ntk_types_supported": ["jwt", "opaque"],
  "epop_cnonce_required": true,
  "epop_cnonce_step_seconds": 30,
  "epop_cnonce_seed": "<base64url-32-bytes>",
  "epop_cnonce_seed_id": "seed-2026-q2"
}
]]></sourcecode>
      </section>
    </section>
    <section anchor="related-specs">
      <name>Relationship to Other Specifications</name>
      <table>
        <thead>
          <tr>
            <th align="left">RFC</th>
            <th align="left">Title</th>
            <th align="left">Relationship</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">
              <xref target="RFC7628"/></td>
            <td align="left">A Set of Simple Authentication and Security Layer (SASL) Mechanisms for OAuth</td>
            <td align="left">EPOP extends RFC 7628 by introducing <tt>EPOP</tt> as a new OAuth authentication type for the SASL <tt>auth</tt> field and defining <tt>OAUTHEPOP</tt> as a new SASL mechanism. All behaviors defined in RFC 7628 remain in effect; this document adds only the <tt>auth=EPOP</tt> field value and the key binding check that <tt>OAUTHBEARER</tt> servers apply when they encounter it.</td>
          </tr>
          <tr>
            <td align="left">
              <xref target="RFC9449"/></td>
            <td align="left">OAuth 2.0 Demonstrating Proof of Possession (DPoP)</td>
            <td align="left">EPOP generalizes the DPoP proof model: replaces <tt>htm</tt>/<tt>htu</tt> with <tt>rctx</tt> for protocol agnosticism; replaces the <tt>ath</tt> hash with <tt>ntk</tt> embedding so credential and proof travel as one object; extends coverage to authorization codes and refresh tokens; adds atomic key rotation and the offline <tt>cnonce</tt>. Additionally, DPoP's requirement to carry two coordinated HTTP headers (<tt>Authorization</tt> and <tt>DPoP</tt>) imposes a propagation burden on every intermediary and resource server in a distributed system; EPOP eliminates this by enveloping the proof inside the token, so a single <tt>Authorization</tt> header carries the inseparable credential-and-proof object through all hops without requiring middleware changes. Additionally, DPoP's <tt>ath</tt> mechanism for opaque access tokens is coupled to HTTP request parameters, leaving opaque tokens on non-HTTP transports without a sender-constraining path. EPOP's <tt>ntk</tt> claim handles opaque and JWT tokens identically across all transports.</td>
          </tr>
          <tr>
            <td align="left">
              <xref target="RFC7636"/></td>
            <td align="left">Proof Key for Code Exchange (PKCE)</td>
            <td align="left">EPOP elevates PKCE from <bcp14>RECOMMENDED</bcp14> to <bcp14>REQUIRED</bcp14> in all authorization code flows.</td>
          </tr>
          <tr>
            <td align="left">
              <xref target="RFC8414"/></td>
            <td align="left">OAuth 2.0 Authorization Server Metadata</td>
            <td align="left">EPOP adds new discovery fields to the well-known document: <tt>epop_supported</tt>, <tt>epop_ntk_types_supported</tt>, <tt>epop_key_rotation_supported</tt>, and the <tt>epop_cnonce_*</tt> family.</td>
          </tr>
          <tr>
            <td align="left">
              <xref target="RFC7638"/></td>
            <td align="left">JSON Web Key (JWK) Thumbprint</td>
            <td align="left">EPOP uses the SHA-256 JWK thumbprint (<tt>cnf.jkt</tt>) as its primary key binding primitive — embedded in every issued token and checked by the RS as its main defense against token substitution.</td>
          </tr>
          <tr>
            <td align="left">
              <xref target="RFC7662"/></td>
            <td align="left">OAuth 2.0 Token Introspection</td>
            <td align="left">EPOP extends introspection responses to include <tt>cnf.jkt</tt>. For opaque tokens the AS returns the server-side registered client EPOP public key; for JWT tokens it is extracted from the token's own claim.</td>
          </tr>
          <tr>
            <td align="left">
              <xref target="RFC9126"/></td>
            <td align="left">OAuth 2.0 Pushed Authorization Requests (PAR)</td>
            <td align="left">EPOP extends PAR to let the client declare <tt>cnf.jkt</tt> at the earliest point in the flow, pre-binding the authorization code before the browser redirect.</td>
          </tr>
          <tr>
            <td align="left">
              <xref target="RFC5869"/></td>
            <td align="left">HMAC-based Key Derivation Function (HKDF)</td>
            <td align="left">EPOP uses HKDF-SHA256 to derive a per-client key from the optional server-controlled <tt>epop_cnonce_seed</tt> and the client's public key, enabling stateless offline cnonce computation.</td>
          </tr>
          <tr>
            <td align="left">
              <xref target="RFC9901"/></td>
            <td align="left">Selective Disclosure for JWTs (SD-JWT)</td>
            <td align="left">SD-JWT provides selective disclosure of JWT claims but has no sender-constraining mechanism and requires JWT structure — it cannot be applied to opaque access tokens. EPOP is complementary: an SD-JWT credential can be carried in the EPOP <tt>ntk</tt> claim, gaining sender-constraining without modifying the SD-JWT format. A profile combining EPOP and SD-JWT is left to a future document.</td>
          </tr>
        </tbody>
      </table>
    </section>
    <section anchor="performance">
      <name>Performance Considerations</name>
      <section anchor="perf-token-size">
        <name>Token Size</name>
        <t>EPOP consolidates the access token and the proof of possession into a single
token, eliminating the separate DPoP proof header. The net effect on wire size
depends on the access token format in use.</t>
        <t>The table below compares the combined size of an AT+DPoP pair against an EPOP
token for representative algorithm combinations, and shows the percentage
change (negative = EPOP is smaller; positive = EPOP is larger). Sizes include
the full Base64url-encoded token strings as they would appear on the wire.
The compressed figures approximate HTTP/2 header-compression (Huffman coding)
applied to the token value.</t>
        <table anchor="tbl-token-size">
          <name>Token size comparison: AT+DPoP vs EPOP</name>
          <thead>
            <tr>
              <th align="left">AT Format</th>
              <th align="left">Proof Algorithm</th>
              <th align="right">AT+DPoP / EPOP Raw (B)</th>
              <th align="right">Raw Δ%</th>
              <th align="right">AT+DPoP / EPOP Compressed (B)</th>
              <th align="right">Compressed Δ%</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Opaque</td>
              <td align="left">Ed25519</td>
              <td align="right">599 / 553</td>
              <td align="right">−7.7%</td>
              <td align="right">437 / 398</td>
              <td align="right">−8.9%</td>
            </tr>
            <tr>
              <td align="left">Opaque</td>
              <td align="left">RSA-256</td>
              <td align="right">1247 / 1201</td>
              <td align="right">−3.7%</td>
              <td align="right">918 / 880</td>
              <td align="right">−4.1%</td>
            </tr>
            <tr>
              <td align="left">JWT Ed25519</td>
              <td align="left">Ed25519</td>
              <td align="right">1030 / 1128</td>
              <td align="right">+9.5%</td>
              <td align="right">745 / 811</td>
              <td align="right">+8.9%</td>
            </tr>
            <tr>
              <td align="left">JWT Ed25519</td>
              <td align="left">RSA-256</td>
              <td align="right">1678 / 1776</td>
              <td align="right">+5.8%</td>
              <td align="right">1230 / 1291</td>
              <td align="right">+5.0%</td>
            </tr>
            <tr>
              <td align="left">JWT RSA-256</td>
              <td align="left">Ed25519</td>
              <td align="right">1288 / 1472</td>
              <td align="right">+14.3%</td>
              <td align="right">950 / 1050</td>
              <td align="right">+10.5%</td>
            </tr>
            <tr>
              <td align="left">JWT RSA-256</td>
              <td align="left">RSA-256</td>
              <td align="right">1936 / 2120</td>
              <td align="right">+9.5%</td>
              <td align="right">1429 / 1536</td>
              <td align="right">+7.5%</td>
            </tr>
          </tbody>
        </table>
        <t>EPOP is 4–9% smaller than AT+DPoP when the access token is opaque, because
eliminating the separate DPoP proof token removes its JOSE header, claims, and
signature overhead. When the access token is a JWT, EPOP is 6–14% larger, as
the full AT payload must be re-encoded inside the EPOP envelope; the overhead
is highest with RSA keys, where large key material is effectively carried
twice. Header compression (e.g., HPACK in HTTP/2) reduces the gap in all
cases but does not reverse the direction of the comparison.</t>
        <t>The absolute size differences in the table (46–184 bytes uncompressed) are
small relative to typical HTTP request sizes. On networks with standard MTUs
(1500 bytes) or jumbo frames (9000 bytes), these differences are unlikely to
cause additional TCP segment fragmentation for most requests. However,
deployments on legacy or constrained networks with smaller effective MTUs, or
requests already near the fragmentation boundary due to large URL paths or
other headers, may see an additional packet fragment introduced in JWT AT
configurations where EPOP is larger. Implementers with strict packet-budget
requirements on such networks should prefer opaque access tokens with Ed25519
proofs, which yield the smallest EPOP tokens.</t>
      </section>
      <section anchor="perf-computation">
        <name>Computational Overhead</name>
        <t>EPOP validation replaces the two independent verification steps required for
AT+DPoP (verify the access token, then verify the DPoP proof) with a single
nested-token validation. The cryptographic cost depends on the algorithms
chosen and is equivalent to the sum of one AT signature verification and one
proof signature verification in both approaches; EPOP does not introduce
additional cryptographic operations relative to AT+DPoP.</t>
        <t>Resource servers that implement the early-exit optimization described in
<xref target="early-exit"/> can skip inner-token decoding when the outer EPOP signature
fails, achieving better average-case performance under adversarial or
malformed-token conditions.</t>
      </section>
      <section anchor="perf-latency">
        <name>Latency and Header Processing</name>
        <t>Because EPOP is presented as a single <tt>Authorization</tt> header value, resource
servers process one token per request rather than parsing and validating two
separate headers (<tt>Authorization: DPoP ...</tt> and <tt>DPoP: &lt;proof&gt;</tt>). This
reduces per-request HTTP header parsing overhead and simplifies the
validation state machine on the resource server.</t>
        <t>For deployments using token introspection, the reduction from two
network-visible tokens to one also halves the number of token values the
resource server must convey to the introspection endpoint per request (when
full-token introspection is used; see <xref target="introspection-epop"/>).</t>
      </section>
      <section anchor="perf-guidance">
        <name>Deployment Guidance</name>
        <t>Implementers should select the EPOP deployment profile that best matches their
token format:</t>
        <ul spacing="normal">
          <li>
            <t><strong>Opaque AT deployments</strong> gain a measurable wire-size reduction (4–9%) and
simplified transport with no increase in computational cost. EPOP is the
preferred choice.</t>
          </li>
          <li>
            <t><strong>JWT AT deployments</strong> should weigh the modest size increase (6–14%) against
the reduced parsing complexity and unified validation logic. For deployments
where header size is a significant constraint (e.g., HTTP/1.1 without
compression, constrained-device networks), issuers may consider switching to
opaque access tokens or choosing compact proof algorithms (Ed25519 over RSA)
to limit overhead.</t>
          </li>
          <li>
            <t><strong>Algorithm selection</strong> has a larger impact on total token size than the
choice between AT+DPoP and EPOP. RSA-based algorithms produce tokens
2–3× larger than elliptic-curve equivalents regardless of the token
binding mechanism used.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="security">
      <name>Security Considerations</name>
      <section anchor="sec-token-lifetime">
        <name>Token Lifetime</name>
        <t>EPOP tokens <bcp14>MUST</bcp14> be short-lived, per-request credentials. The server defines the maximum acceptable age of the <tt>iat</tt> claim; when <tt>cnonce</tt> is required, <tt>epop_cnonce_step_seconds</tt> imposes an additional validity bound enforced independently by both the AS and RS. Short lifetimes limit the window during which a captured token remains usable and reduce the cost of maintaining the <tt>jti</tt> replay cache.</t>
      </section>
      <section anchor="sec-replay-prevention">
        <name>Replay Prevention</name>
        <t>Each EPOP token <bcp14>MUST</bcp14> include a <tt>jti</tt> value of at least 128 bits of entropy (e.g., a UUID v4 or CSPRNG-generated value) to make collisions computationally infeasible. Servers <bcp14>MUST</bcp14> maintain a replay cache keyed on <tt>jti</tt> with a TTL of at least <tt>max_epop_lifetime + clock_skew</tt>; any token whose <tt>jti</tt> appears in the cache <bcp14>MUST</bcp14> be rejected. When <tt>cnonce</tt> is also required, the time-step window narrows the effective validity period further but does not replace the cache.</t>
      </section>
      <section anchor="token-substitution">
        <name>Token Substitution</name>
        <t>The key binding check — <tt>sha256(outer jwk) == cnf.jkt</tt> from the nested credential — is the primary defense against token substitution. An attacker who captures an access token and wraps it in an EPOP envelope signed with their own key will produce a thumbprint that does not match the <tt>cnf.jkt</tt> embedded by the AS; the RS <bcp14>MUST</bcp14> reject the mismatch.</t>
        <t>For opaque access tokens, the RS <bcp14>MUST NOT</bcp14> cache introspection results beyond the EPOP token's validity window. When a client performs key rotation (<xref target="key-rotation-refresh"/>), the AS <bcp14>MUST</bcp14> atomically update its server-side key binding before issuing new tokens; a stale cached result could cause the RS to validate a post-rotation request against the pre-rotation key.</t>
      </section>
      <section anchor="cross-protocol-replay">
        <name>Cross-Protocol Replay</name>
        <t>Without <tt>rctx</tt> validation, an EPOP token captured from one protocol or endpoint could be replayed at another within the token's validity window. Servers <bcp14>MUST</bcp14> validate <tt>rctx.res</tt> and <tt>rctx.method</tt> when those claims are present. Clients <bcp14>SHOULD</bcp14> always include <tt>rctx</tt> to maximize replay resistance.</t>
      </section>
      <section anchor="sec-credential-confidentiality">
        <name>Credential Confidentiality</name>
        <t>The <tt>ntk</tt> claim embeds the full OAuth 2.0 credential inside the EPOP envelope. Unlike bearer token flows where only the token value is sensitive, the entire compact serialization carries sensitive material. TLS is <bcp14>REQUIRED</bcp14> for all EPOP token transmissions; JWE <bcp14>MAY</bcp14> be applied for additional confidentiality over transports that cannot guarantee channel security. Refresh tokens embedded in <tt>ntk</tt> are particularly sensitive. Servers and intermediaries <bcp14>MUST NOT</bcp14> log EPOP token values in plaintext; the <tt>jti</tt> claim <bcp14>SHOULD</bcp14> be used as the audit correlation identifier instead.</t>
      </section>
      <section anchor="key-rotation-security">
        <name>Key Rotation Security</name>
        <t>The AS <bcp14>MUST</bcp14> validate both the outer and inner EPOP envelopes completely before issuing new tokens or updating key bindings. Partial validation would allow an attacker who holds a captured refresh token to inject a new key by constructing a valid outer envelope while providing an invalid inner envelope.</t>
      </section>
      <section anchor="sec-pkce">
        <name>PKCE Requirement</name>
        <t>PKCE (<xref target="RFC7636"/>) is <bcp14>REQUIRED</bcp14> in all EPOP authorization code flows. Without PKCE, an attacker who intercepts the authorization code can generate their own key pair and wrap the code in a valid EPOP token signed with that key, bypassing key binding entirely. PKCE and EPOP protect complementary surfaces: PKCE binds the authorization request to the token request; EPOP binds the code to the client's key pair.</t>
      </section>
      <section anchor="sec-auth-request-binding">
        <name>Authorization Request Key Binding</name>
        <t>Binding a public key thumbprint inside the authorization request URL (as defined for DPoP in <xref target="RFC9449"/> Section 10) is not supported by this specification. Authorization requests travel through the browser redirect — an untrusted channel where a parameter can be silently replaced before the AS sees it. EPOP establishes key binding exclusively at endpoints where the client communicates directly with the AS over TLS: the token endpoint and, optionally, the PAR endpoint (<xref target="par"/>).</t>
      </section>
      <section anchor="sec-algorithm-selection">
        <name>Algorithm Selection</name>
        <t>EPOP tokens are generated per-request at high frequency; algorithm choice directly affects signing latency, token size, and security posture. The <tt>jwk</tt> embedded in every EPOP header makes key footprint particularly significant for constrained transports. Edwards curve algorithms are <bcp14>RECOMMENDED</bcp14>. Ed25519 is the primary choice — smallest public key, fastest deterministic signing, and 128-bit security adequate for short-lived credentials. Ed448 is appropriate for high-assurance environments requiring a larger security margin. <tt>ES256</tt> is acceptable where Edwards curves are unavailable. RSA algorithms <bcp14>SHOULD NOT</bcp14> be used in new implementations. Implementations <bcp14>MUST</bcp14> follow <xref target="RFC8725"/>.</t>
      </section>
      <section anchor="sec-intermediary-transparency">
        <name>Intermediary Transparency</name>
        <t>Because the EPOP proof is embedded within the token rather than transmitted as a separate header, EPOP tokens are transparent to intermediaries that forward the <tt>Authorization</tt> header without modification. Unlike DPoP, where loss of the <tt>DPoP</tt> header at any hop silently breaks proof-of-possession, EPOP's enveloped structure ensures that the proof travels with the credential through every layer of a distributed system. Resource servers <bcp14>MUST NOT</bcp14> accept EPOP tokens from which the outer envelope signature has been stripped or replaced by an intermediary; the full compact-serialized EPOP token <bcp14>MUST</bcp14> be forwarded unchanged.</t>
      </section>
      <section anchor="private-key-protection">
        <name>Private Key Protection</name>
        <t>The security of EPOP depends entirely on the client's private key remaining secret. Private key material <bcp14>MUST</bcp14> never be logged, serialized into application state, or transmitted over any channel. Implementations <bcp14>MUST</bcp14> verify that no private key fields (<tt>d</tt>, <tt>p</tt>, <tt>q</tt>, <tt>dp</tt>, <tt>dq</tt>, <tt>qi</tt>) are present in the <tt>jwk</tt> header parameter before accepting or forwarding an EPOP token.</t>
        <t>On native and mobile platforms, clients <bcp14>MUST</bcp14> use platform secure storage (e.g., Android Keystore, iOS Secure Enclave), with private key operations performed inside the secure element where available so that key material never enters application memory.</t>
        <t>In browser environments, private keys <bcp14>MUST</bcp14> be generated as non-extractable <tt>CryptoKey</tt> objects via the Web Crypto API (<tt>extractable: false</tt>). Clients <bcp14>MUST NOT</bcp14> store private keys in <tt>localStorage</tt>, <tt>sessionStorage</tt>, <tt>IndexedDB</tt>, or any JavaScript-readable store; this prevents exfiltration by XSS or injected scripts running in the same origin.</t>
        <t>EPOP tokens <bcp14>MUST</bcp14> use asymmetric signature algorithms. Symmetric algorithms such as <tt>HS256</tt> require the verifier to hold the same secret as the signer, making independent third-party verification impossible and introducing shared-secret distribution risk.</t>
      </section>
    </section>
    <section anchor="privacy">
      <name>Privacy Considerations</name>
      <section anchor="credential-visibility-in-logs">
        <name>Credential Visibility in Logs</name>
        <t>Because the <tt>ntk</tt> claim embeds the full OAuth 2.0 credential, an EPOP token is more privacy-sensitive than a typical bearer token: its compact serialization reveals the credential type, issuer, audience, and scope to any party that receives or stores it. Servers <bcp14>SHOULD</bcp14> apply data-minimization practices to audit logs — retaining only the <tt>jti</tt> and <tt>iat</tt> claims rather than the full token value. See <xref target="sec-credential-confidentiality"/> for the normative logging and TLS requirements.</t>
      </section>
      <section anchor="key-identifier-as-tracking-vector">
        <name>Key Identifier as Tracking Vector</name>
        <t>The <tt>cnf.jkt</tt> claim is a stable, long-lived public key thumbprint. If the same key pair is used across multiple authorization server or resource server deployments, the thumbprint functions as a cross-context tracking identifier. Clients <bcp14>SHOULD</bcp14> use distinct key pairs per authorization server to limit cross-context correlation. Key rotation (<xref target="key-rotation-refresh"/>) provides a mechanism for periodic key refresh independent of active sessions.</t>
      </section>
      <section anchor="resource-uri-disclosure">
        <name>Resource URI Disclosure</name>
        <t>The <tt>rctx.res</tt> field encodes the target resource URI or URN and is part of the signed EPOP envelope, visible to any party that receives or logs the token. Clients <bcp14>MUST</bcp14> use TLS for all EPOP token transmissions to limit exposure to on-path observers. Resource identifiers that encode sensitive information (e.g., user identifiers embedded in path parameters) <bcp14>SHOULD</bcp14> be avoided in <tt>rctx.res</tt>.</t>
      </section>
      <section anchor="minimal-disclosure">
        <name>Minimal Disclosure</name>
        <t>This profile does not require the EPOP envelope to carry user identity claims. User identity information belongs in the nested access token (<tt>ntk</tt>), not in the outer EPOP envelope. Implementations <bcp14>MUST NOT</bcp14> add user identity claims to the EPOP token header or payload unless required by a specific profile extension.</t>
      </section>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <section anchor="iana-http-scheme">
        <name>HTTP Authentication Scheme Registration</name>
        <t>This specification requests registration of the following entry in the "Hypertext Transfer Protocol (HTTP) Authentication Scheme Registry" (<xref target="RFC7235"/>):</t>
        <dl>
          <dt>Authentication Scheme Name:</dt>
          <dd>
            <t><tt>EPOP</tt></t>
          </dd>
          <dt>Pointer to specification text:</dt>
          <dd>
            <t><xref target="resource-access"/> and <xref target="token-profile"/> of this document.</t>
          </dd>
        </dl>
      </section>
      <section anchor="iana-grant-types">
        <name>OAuth Grant Type Registration</name>
        <t>This specification requests registration of the following entries in the "OAuth Parameters" registry (grant type sub-table) established by <xref target="RFC6749"/> Section 11.3:</t>
        <dl>
          <dt>Grant Type Name:</dt>
          <dd>
            <t><tt>urn:ietf:params:oauth:grant-type:epop_code_grant</tt></t>
          </dd>
          <dt>Change Controller:</dt>
          <dd>
            <t>IETF</t>
          </dd>
          <dt>Specification Document(s):</dt>
          <dd>
            <t><xref target="auth-code-flow"/> of this document</t>
          </dd>
          <dt>Grant Type Name:</dt>
          <dd>
            <t><tt>urn:ietf:params:oauth:grant-type:epop_refresh_token</tt></t>
          </dd>
          <dt>Change Controller:</dt>
          <dd>
            <t>IETF</t>
          </dd>
          <dt>Specification Document(s):</dt>
          <dd>
            <t><xref target="refresh-flow"/> of this document</t>
          </dd>
        </dl>
      </section>
      <section anchor="iana-oauth-params">
        <name>OAuth Parameters Registration</name>
        <t>This specification requests registration of the following entry in the "OAuth Parameters" registry established by <xref target="RFC6749"/> Section 11.2:</t>
        <dl>
          <dt>Parameter Name:</dt>
          <dd>
            <t><tt>epop</tt></t>
          </dd>
          <dt>Parameter Usage Location:</dt>
          <dd>
            <t>token request, pushed authorization request</t>
          </dd>
          <dt>Change Controller:</dt>
          <dd>
            <t>IETF</t>
          </dd>
          <dt>Specification Document(s):</dt>
          <dd>
            <t><xref target="creating-epop"/>, <xref target="auth-code-flow"/>, <xref target="refresh-flow"/>, and <xref target="par"/> of this document</t>
          </dd>
        </dl>
      </section>
      <section anchor="iana-token-type-value">
        <name>OAuth Token Type Registration</name>
        <t>This specification requests registration of the following value in the "OAuth Access Token Types" registry established by <xref target="RFC6749"/> Section 11.1:</t>
        <dl>
          <dt>Type Name:</dt>
          <dd>
            <t><tt>EPOP</tt></t>
          </dd>
          <dt>Additional Token Endpoint Response Parameters:</dt>
          <dd>
            <t>(none)</t>
          </dd>
          <dt>HTTP Authentication Scheme(s):</dt>
          <dd>
            <t><tt>EPOP</tt></t>
          </dd>
          <dt>Change Controller:</dt>
          <dd>
            <t>IETF</t>
          </dd>
          <dt>Specification Document(s):</dt>
          <dd>
            <t><xref target="creating-epop"/> and <xref target="resource-access"/> of this document</t>
          </dd>
        </dl>
      </section>
      <section anchor="iana-token-types">
        <name>OAuth Token Type Identifiers</name>
        <t>This specification requests registration of the following entries in the "OAuth URI" subregistry of the "OAuth Parameters" registry established by <xref target="RFC8693"/> Section 7.1:</t>
        <dl>
          <dt>URI:</dt>
          <dd>
            <t><tt>urn:ietf:params:oauth:token-type:epop_access_token</tt></t>
          </dd>
          <dt>Change Controller:</dt>
          <dd>
            <t>IETF</t>
          </dd>
          <dt>Specification Document(s):</dt>
          <dd>
            <t><xref target="token-exchange"/> of this document</t>
          </dd>
          <dt>URI:</dt>
          <dd>
            <t><tt>urn:ietf:params:oauth:token-type:epop_refresh_token</tt></t>
          </dd>
          <dt>Change Controller:</dt>
          <dd>
            <t>IETF</t>
          </dd>
          <dt>Specification Document(s):</dt>
          <dd>
            <t><xref target="token-exchange"/> of this document</t>
          </dd>
        </dl>
      </section>
      <section anchor="iana-token-type-hint">
        <name>OAuth Token Type Hint Registration</name>
        <t>This specification requests registration of the following value in the "OAuth Token Type Hints" registry established by <xref target="RFC7009"/> Section 4.1:</t>
        <dl>
          <dt>Token Type Hint Name:</dt>
          <dd>
            <t><tt>epop_token</tt></t>
          </dd>
          <dt>Change Controller:</dt>
          <dd>
            <t>IETF</t>
          </dd>
          <dt>Specification Document(s):</dt>
          <dd>
            <t><xref target="token-introspection"/>, <xref target="token-revocation"/>, and <xref target="rs-opaque-tokens"/> of this document</t>
          </dd>
        </dl>
      </section>
      <section anchor="iana-jwt-claims">
        <name>JWT Claims Registration</name>
        <t>This specification requests registration of the following JWT claims in the "JSON Web Token Claims" registry established by <xref target="RFC7519"/>:</t>
        <dl>
          <dt>Claim Name: <tt>ntk</tt></dt>
          <dd>
            <t>Claim Description: Nested Token — the OAuth 2.0 credential embedded inside the EPOP envelope.</t>
          </dd>
          <dt/>
          <dd>
            <t>Change Controller: IETF</t>
          </dd>
          <dt/>
          <dd>
            <t>Specification Document(s): <xref target="token-payload"/> of this document</t>
          </dd>
          <dt>Claim Name: <tt>rctx</tt></dt>
          <dd>
            <t>Claim Description: Request Context — a JSON object identifying the target resource and protocol action.</t>
          </dd>
          <dt/>
          <dd>
            <t>Change Controller: IETF</t>
          </dd>
          <dt/>
          <dd>
            <t>Specification Document(s): <xref target="token-payload"/> of this document</t>
          </dd>
          <dt>Claim Name: <tt>cnonce</tt></dt>
          <dd>
            <t>Claim Description: Client Nonce — offline-derived HMAC value for replay resistance without server-issued nonce state.</t>
          </dd>
          <dt/>
          <dd>
            <t>Change Controller: IETF</t>
          </dd>
          <dt/>
          <dd>
            <t>Specification Document(s): <xref target="cnonce"/> of this document</t>
          </dd>
        </dl>
      </section>
      <section anchor="iana-media-type">
        <name>Media Type Registration</name>
        <t>This specification requests registration of the following media type in the "Media Types" registry (<xref target="RFC6838"/>), following the convention established by <xref target="RFC9068"/> for explicitly typed JWTs and the recommendation in <xref target="RFC8725"/> Section 3.11:</t>
        <dl>
          <dt>Type name:</dt>
          <dd>
            <t><tt>application</tt></t>
          </dd>
          <dt>Subtype name:</dt>
          <dd>
            <t><tt>epop+jwt</tt></t>
          </dd>
          <dt>Required parameters:</dt>
          <dd>
            <t>n/a</t>
          </dd>
          <dt>Optional parameters:</dt>
          <dd>
            <t>n/a</t>
          </dd>
          <dt>Encoding considerations:</dt>
          <dd>
            <t>binary; see <xref target="RFC7519"/>, Section 3.1</t>
          </dd>
          <dt>Security considerations:</dt>
          <dd>
            <t>See <xref target="security"/> of this document</t>
          </dd>
          <dt>Interoperability considerations:</dt>
          <dd>
            <t>n/a</t>
          </dd>
          <dt>Published specification:</dt>
          <dd>
            <t>This document</t>
          </dd>
          <dt>Applications that use this media type:</dt>
          <dd>
            <t>OAuth 2.0 authorization servers, resource servers, and clients implementing EPOP</t>
          </dd>
          <dt>Fragment identifier considerations:</dt>
          <dd>
            <t>n/a</t>
          </dd>
          <dt>Additional information:</dt>
          <dd>
            <t>Deprecated alias names for this type: n/a</t>
          </dd>
          <dt/>
          <dd>
            <t>Magic number(s): n/a</t>
          </dd>
          <dt/>
          <dd>
            <t>File extension(s): n/a</t>
          </dd>
          <dt/>
          <dd>
            <t>Macintosh file type code(s): n/a</t>
          </dd>
          <dt>Person and email address to contact for further information:</dt>
          <dd>
            <t>Ashwin Ambekar, <eref target="mailto:ambekar@gmail.com">ambekar@gmail.com</eref></t>
          </dd>
          <dt>Intended usage:</dt>
          <dd>
            <t>COMMON</t>
          </dd>
          <dt>Restrictions on usage:</dt>
          <dd>
            <t>none</t>
          </dd>
          <dt>Author:</dt>
          <dd>
            <t>Ashwin Ambekar</t>
          </dd>
          <dt>Change controller:</dt>
          <dd>
            <t>IETF</t>
          </dd>
          <dt>Provisional registration:</dt>
          <dd>
            <t>no</t>
          </dd>
        </dl>
        <t>As specified in <xref target="token-header"/>, the value of the <tt>typ</tt> header parameter for EPOP tokens is <tt>epop+jwt</tt>, per the convention of omitting the <tt>application/</tt> prefix described in <xref target="RFC7515"/> Section 4.1.9.</t>
      </section>
      <section anchor="iana-as-metadata">
        <name>OAuth Authorization Server Metadata</name>
        <t>This specification requests registration of the following names in the "OAuth Authorization Server Metadata" registry (<xref target="RFC8414"/>):</t>
        <dl>
          <dt><tt>epop_supported</tt></dt>
          <dd>
            <t>Metadata Description: Indicates the authorization server's EPOP support posture: <tt>"disabled"</tt>, <tt>"recommended"</tt>, or <tt>"required"</tt>.</t>
          </dd>
          <dt><tt>epop_ntk_types_supported</tt></dt>
          <dd>
            <t>Metadata Description: JSON array of nested credential (<tt>ntk</tt>) formats accepted by the server: <tt>"jwt"</tt> and/or <tt>"opaque"</tt>.</t>
          </dd>
          <dt><tt>epop_key_rotation_supported</tt></dt>
          <dd>
            <t>Metadata Description: Boolean indicating whether the authorization server supports EPOP atomic key rotation (<xref target="key-rotation-refresh"/>).</t>
          </dd>
          <dt><tt>epop_cnonce_seed</tt></dt>
          <dd>
            <t>Metadata Description: Base64url-encoded 32-byte deployment seed used to scope offline client nonce (<tt>cnonce</tt>) derivation.</t>
          </dd>
          <dt><tt>epop_cnonce_step_seconds</tt></dt>
          <dd>
            <t>Metadata Description: Integer time-step duration, in seconds, used in client nonce (<tt>cnonce</tt>) computation and verification.</t>
          </dd>
          <dt><tt>epop_cnonce_seed_id</tt></dt>
          <dd>
            <t>Metadata Description: Opaque identifier for the current value of <tt>epop_cnonce_seed</tt>.</t>
          </dd>
          <dt><tt>epop_cnonce_required</tt></dt>
          <dd>
            <t>Metadata Description: Boolean indicating whether EPOP tokens presented to this server must include a <tt>cnonce</tt> claim.</t>
          </dd>
          <dt>Change Controller:</dt>
          <dd>
            <t>IETF</t>
          </dd>
          <dt>Specification Document(s):</dt>
          <dd>
            <t><xref target="epop-metadata-fields"/> of this document</t>
          </dd>
        </dl>
      </section>
      <section anchor="iana-rs-metadata">
        <name>OAuth Protected Resource Metadata</name>
        <t>This specification requests registration of the following names in the "OAuth Protected Resource Metadata" registry (<xref target="RFC9728"/>):</t>
        <dl>
          <dt><tt>epop_supported</tt></dt>
          <dd>
            <t>Metadata Description: Indicates the resource server's EPOP support posture: <tt>"disabled"</tt>, <tt>"recommended"</tt>, or <tt>"required"</tt>.</t>
          </dd>
          <dt><tt>epop_ntk_types_supported</tt></dt>
          <dd>
            <t>Metadata Description: JSON array of nested credential (<tt>ntk</tt>) formats accepted by the server: <tt>"jwt"</tt> and/or <tt>"opaque"</tt>.</t>
          </dd>
          <dt><tt>epop_cnonce_seed</tt></dt>
          <dd>
            <t>Metadata Description: Base64url-encoded 32-byte deployment seed used to scope offline client nonce (<tt>cnonce</tt>) derivation.</t>
          </dd>
          <dt><tt>epop_cnonce_step_seconds</tt></dt>
          <dd>
            <t>Metadata Description: Integer time-step duration, in seconds, used in client nonce (<tt>cnonce</tt>) computation and verification.</t>
          </dd>
          <dt><tt>epop_cnonce_seed_id</tt></dt>
          <dd>
            <t>Metadata Description: Opaque identifier for the current value of <tt>epop_cnonce_seed</tt>.</t>
          </dd>
          <dt><tt>epop_cnonce_required</tt></dt>
          <dd>
            <t>Metadata Description: Boolean indicating whether EPOP tokens presented to this server must include a <tt>cnonce</tt> claim.</t>
          </dd>
          <dt>Change Controller:</dt>
          <dd>
            <t>IETF</t>
          </dd>
          <dt>Specification Document(s):</dt>
          <dd>
            <t><xref target="epop-metadata-fields"/> of this document</t>
          </dd>
        </dl>
      </section>
      <section anchor="iana-rctx">
        <name>EPOP Request Context Members Registry</name>
        <t>This specification requests creation of a new registry, "EPOP Request Context Members", under the "OAuth Parameters" registry group. The registry is to be maintained as Specification Required per <xref target="RFC8126"/>.</t>
        <t>Initial registrations:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Member Name</th>
              <th align="left">Type</th>
              <th align="left">Description</th>
              <th align="left">Specification</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>res</tt></td>
              <td align="left">String</td>
              <td align="left">URI or URN of the target resource or endpoint</td>
              <td align="left">
                <xref target="token-payload"/> of this document</td>
            </tr>
            <tr>
              <td align="left">
                <tt>method</tt></td>
              <td align="left">String</td>
              <td align="left">Protocol action string</td>
              <td align="left">
                <xref target="token-payload"/> of this document</td>
            </tr>
            <tr>
              <td align="left">
                <tt>id</tt></td>
              <td align="left">String</td>
              <td align="left">Client-generated correlation ID</td>
              <td align="left">
                <xref target="token-payload"/> of this document</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="iana-sasl">
        <name>SASL Mechanism Registration</name>
        <t>This specification requests registration of the following entry in the "SASL Mechanisms" registry established by <xref target="RFC4422"/>:</t>
        <dl>
          <dt>Mechanism Name:</dt>
          <dd>
            <t><tt>OAUTHEPOP</tt></t>
          </dd>
          <dt>Security Considerations:</dt>
          <dd>
            <t>See <xref target="sasl"/> of this document.</t>
          </dd>
          <dt>Published Specification:</dt>
          <dd>
            <t>This document.</t>
          </dd>
          <dt>Intended Usage:</dt>
          <dd>
            <t>COMMON</t>
          </dd>
          <dt>Owner/Change Controller:</dt>
          <dd>
            <t>IETF</t>
          </dd>
        </dl>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC2104">
          <front>
            <title>HMAC: Keyed-Hashing for Message Authentication</title>
            <author fullname="H. Krawczyk" initials="H." surname="Krawczyk"/>
            <author fullname="M. Bellare" initials="M." surname="Bellare"/>
            <author fullname="R. Canetti" initials="R." surname="Canetti"/>
            <date month="February" year="1997"/>
            <abstract>
              <t>This document describes HMAC, a mechanism for message authentication using cryptographic hash functions. HMAC can be used with any iterative cryptographic hash function, e.g., MD5, SHA-1, in combination with a secret shared key. The cryptographic strength of HMAC depends on the properties of the underlying hash function. This memo provides information for the Internet community. This memo does not specify an Internet standard of any kind</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2104"/>
          <seriesInfo name="DOI" value="10.17487/RFC2104"/>
        </reference>
        <reference anchor="RFC3629">
          <front>
            <title>UTF-8, a transformation format of ISO 10646</title>
            <author fullname="F. Yergeau" initials="F." surname="Yergeau"/>
            <date month="November" year="2003"/>
            <abstract>
              <t>ISO/IEC 10646-1 defines a large character set called the Universal Character Set (UCS) which encompasses most of the world's writing systems. The originally proposed encodings of the UCS, however, were not compatible with many current applications and protocols, and this has led to the development of UTF-8, the object of this memo. UTF-8 has the characteristic of preserving the full US-ASCII range, providing compatibility with file systems, parsers and other software that rely on US-ASCII values but are transparent to other values. This memo obsoletes and replaces RFC 2279.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="63"/>
          <seriesInfo name="RFC" value="3629"/>
          <seriesInfo name="DOI" value="10.17487/RFC3629"/>
        </reference>
        <reference anchor="RFC4422">
          <front>
            <title>Simple Authentication and Security Layer (SASL)</title>
            <author fullname="A. Melnikov" initials="A." role="editor" surname="Melnikov"/>
            <author fullname="K. Zeilenga" initials="K." role="editor" surname="Zeilenga"/>
            <date month="June" year="2006"/>
            <abstract>
              <t>The Simple Authentication and Security Layer (SASL) is a framework for providing authentication and data security services in connection-oriented protocols via replaceable mechanisms. It provides a structured interface between protocols and mechanisms. The resulting framework allows new protocols to reuse existing mechanisms and allows old protocols to make use of new mechanisms. The framework also provides a protocol for securing subsequent protocol exchanges within a data security layer.</t>
              <t>This document describes how a SASL mechanism is structured, describes how protocols include support for SASL, and defines the protocol for carrying a data security layer over a connection. In addition, this document defines one SASL mechanism, the EXTERNAL mechanism.</t>
              <t>This document obsoletes RFC 2222. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4422"/>
          <seriesInfo name="DOI" value="10.17487/RFC4422"/>
        </reference>
        <reference anchor="RFC4648">
          <front>
            <title>The Base16, Base32, and Base64 Data Encodings</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <date month="October" year="2006"/>
            <abstract>
              <t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes. It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4648"/>
          <seriesInfo name="DOI" value="10.17487/RFC4648"/>
        </reference>
        <reference anchor="RFC5801">
          <front>
            <title>Using Generic Security Service Application Program Interface (GSS-API) Mechanisms in Simple Authentication and Security Layer (SASL): The GS2 Mechanism Family</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <author fullname="N. Williams" initials="N." surname="Williams"/>
            <date month="July" year="2010"/>
            <abstract>
              <t>This document describes how to use a Generic Security Service Application Program Interface (GSS-API) mechanism in the Simple Authentication and Security Layer (SASL) framework. This is done by defining a new SASL mechanism family, called GS2. This mechanism family offers a number of improvements over the previous "SASL/ GSSAPI" mechanism: it is more general, uses fewer messages for the authentication phase in some cases, and supports negotiable use of channel binding. Only GSS-API mechanisms that support channel binding and mutual authentication are supported. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5801"/>
          <seriesInfo name="DOI" value="10.17487/RFC5801"/>
        </reference>
        <reference anchor="RFC5869">
          <front>
            <title>HMAC-based Extract-and-Expand Key Derivation Function (HKDF)</title>
            <author fullname="H. Krawczyk" initials="H." surname="Krawczyk"/>
            <author fullname="P. Eronen" initials="P." surname="Eronen"/>
            <date month="May" year="2010"/>
            <abstract>
              <t>This document specifies a simple Hashed Message Authentication Code (HMAC)-based key derivation function (HKDF), which can be used as a building block in various protocols and applications. The key derivation function (KDF) is intended to support a wide range of applications and requirements, and is conservative in its use of cryptographic hash functions. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5869"/>
          <seriesInfo name="DOI" value="10.17487/RFC5869"/>
        </reference>
        <reference anchor="RFC6838">
          <front>
            <title>Media Type Specifications and Registration Procedures</title>
            <author fullname="N. Freed" initials="N." surname="Freed"/>
            <author fullname="J. Klensin" initials="J." surname="Klensin"/>
            <author fullname="T. Hansen" initials="T." surname="Hansen"/>
            <date month="January" year="2013"/>
            <abstract>
              <t>This document defines procedures for the specification and registration of media types for use in HTTP, MIME, and other Internet protocols. This memo documents an Internet Best Current Practice.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="13"/>
          <seriesInfo name="RFC" value="6838"/>
          <seriesInfo name="DOI" value="10.17487/RFC6838"/>
        </reference>
        <reference anchor="RFC6749">
          <front>
            <title>The OAuth 2.0 Authorization Framework</title>
            <author fullname="D. Hardt" initials="D." role="editor" surname="Hardt"/>
            <date month="October" year="2012"/>
            <abstract>
              <t>The OAuth 2.0 authorization framework enables a third-party application to obtain limited access to an HTTP service, either on behalf of a resource owner by orchestrating an approval interaction between the resource owner and the HTTP service, or by allowing the third-party application to obtain access on its own behalf. This specification replaces and obsoletes the OAuth 1.0 protocol described in RFC 5849. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6749"/>
          <seriesInfo name="DOI" value="10.17487/RFC6749"/>
        </reference>
        <reference anchor="RFC7009">
          <front>
            <title>OAuth 2.0 Token Revocation</title>
            <author fullname="T. Lodderstedt" initials="T." role="editor" surname="Lodderstedt"/>
            <author fullname="S. Dronia" initials="S." surname="Dronia"/>
            <author fullname="M. Scurtescu" initials="M." surname="Scurtescu"/>
            <date month="August" year="2013"/>
            <abstract>
              <t>This document proposes an additional endpoint for OAuth authorization servers, which allows clients to notify the authorization server that a previously obtained refresh or access token is no longer needed. This allows the authorization server to clean up security credentials. A revocation request will invalidate the actual token and, if applicable, other tokens based on the same authorization grant.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7009"/>
          <seriesInfo name="DOI" value="10.17487/RFC7009"/>
        </reference>
        <reference anchor="RFC7235">
          <front>
            <title>Hypertext Transfer Protocol (HTTP/1.1): Authentication</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2014"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application- level protocol for distributed, collaborative, hypermedia information systems. This document defines the HTTP Authentication framework.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7235"/>
          <seriesInfo name="DOI" value="10.17487/RFC7235"/>
        </reference>
        <reference anchor="RFC7515">
          <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>
        <reference anchor="RFC7517">
          <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="RFC7519">
          <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="RFC7628">
          <front>
            <title>A Set of Simple Authentication and Security Layer (SASL) Mechanisms for OAuth</title>
            <author fullname="W. Mills" initials="W." surname="Mills"/>
            <author fullname="T. Showalter" initials="T." surname="Showalter"/>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
            <date month="August" year="2015"/>
            <abstract>
              <t>OAuth enables a third-party application to obtain limited access to a protected resource, either on behalf of a resource owner by orchestrating an approval interaction or by allowing the third-party application to obtain access on its own behalf.</t>
              <t>This document defines how an application client uses credentials obtained via OAuth over the Simple Authentication and Security Layer (SASL) to access a protected resource at a resource server. Thereby, it enables schemes defined within the OAuth framework for non-HTTP-based application protocols.</t>
              <t>Clients typically store the user's long-term credential. This does, however, lead to significant security vulnerabilities, for example, when such a credential leaks. A significant benefit of OAuth for usage in those clients is that the password is replaced by a shared secret with higher entropy, i.e., the token. Tokens typically provide limited access rights and can be managed and revoked separately from the user's long-term password.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7628"/>
          <seriesInfo name="DOI" value="10.17487/RFC7628"/>
        </reference>
        <reference anchor="RFC7636">
          <front>
            <title>Proof Key for Code Exchange by OAuth Public Clients</title>
            <author fullname="N. Sakimura" initials="N." role="editor" surname="Sakimura"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="N. Agarwal" initials="N." surname="Agarwal"/>
            <date month="September" year="2015"/>
            <abstract>
              <t>OAuth 2.0 public clients utilizing the Authorization Code Grant are susceptible to the authorization code interception attack. This specification describes the attack as well as a technique to mitigate against the threat through the use of Proof Key for Code Exchange (PKCE, pronounced "pixy").</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7636"/>
          <seriesInfo name="DOI" value="10.17487/RFC7636"/>
        </reference>
        <reference anchor="RFC7638">
          <front>
            <title>JSON Web Key (JWK) Thumbprint</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <date month="September" year="2015"/>
            <abstract>
              <t>This specification defines a method for computing a hash value over a JSON Web Key (JWK). It defines which fields in a JWK are used in the hash computation, the method of creating a canonical form for those fields, and how to convert the resulting Unicode string into a byte sequence to be hashed. The resulting hash value can be used for identifying or selecting the key represented by the JWK that is the subject of the thumbprint.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7638"/>
          <seriesInfo name="DOI" value="10.17487/RFC7638"/>
        </reference>
        <reference anchor="RFC7662">
          <front>
            <title>OAuth 2.0 Token Introspection</title>
            <author fullname="J. Richer" initials="J." role="editor" surname="Richer"/>
            <date month="October" year="2015"/>
            <abstract>
              <t>This specification defines a method for a protected resource to query an OAuth 2.0 authorization server to determine the active state of an OAuth 2.0 token and to determine meta-information about this token. OAuth 2.0 deployments can use this method to convey information about the authorization context of the token from the authorization server to the protected resource.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7662"/>
          <seriesInfo name="DOI" value="10.17487/RFC7662"/>
        </reference>
        <reference anchor="RFC8414">
          <front>
            <title>OAuth 2.0 Authorization Server Metadata</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <date month="June" year="2018"/>
            <abstract>
              <t>This specification defines a metadata format that an OAuth 2.0 client can use to obtain the information needed to interact with an OAuth 2.0 authorization server, including its endpoint locations and authorization server capabilities.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8414"/>
          <seriesInfo name="DOI" value="10.17487/RFC8414"/>
        </reference>
        <reference anchor="RFC8693">
          <front>
            <title>OAuth 2.0 Token Exchange</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="A. Nadalin" initials="A." surname="Nadalin"/>
            <author fullname="B. Campbell" initials="B." role="editor" surname="Campbell"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="C. Mortimore" initials="C." surname="Mortimore"/>
            <date month="January" year="2020"/>
            <abstract>
              <t>This specification defines a protocol for an HTTP- and JSON-based Security Token Service (STS) by defining how to request and obtain security tokens from OAuth 2.0 authorization servers, including security tokens employing impersonation and delegation.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8693"/>
          <seriesInfo name="DOI" value="10.17487/RFC8693"/>
        </reference>
        <reference anchor="RFC8725">
          <front>
            <title>JSON Web Token Best Current Practices</title>
            <author fullname="Y. Sheffer" initials="Y." surname="Sheffer"/>
            <author fullname="D. Hardt" initials="D." surname="Hardt"/>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <date month="February" year="2020"/>
            <abstract>
              <t>JSON Web Tokens, also known as JWTs, are URL-safe JSON-based security tokens that contain a set of claims that can be signed and/or encrypted. JWTs are being widely used and deployed as a simple security token format in numerous protocols and applications, both in the area of digital identity and in other application areas. This Best Current Practices document updates RFC 7519 to provide actionable guidance leading to secure implementation and deployment of JWTs.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="225"/>
          <seriesInfo name="RFC" value="8725"/>
          <seriesInfo name="DOI" value="10.17487/RFC8725"/>
        </reference>
        <reference anchor="RFC9126">
          <front>
            <title>OAuth 2.0 Pushed Authorization Requests</title>
            <author fullname="T. Lodderstedt" initials="T." surname="Lodderstedt"/>
            <author fullname="B. Campbell" initials="B." surname="Campbell"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <author fullname="D. Tonge" initials="D." surname="Tonge"/>
            <author fullname="F. Skokan" initials="F." surname="Skokan"/>
            <date month="September" year="2021"/>
            <abstract>
              <t>This document defines the pushed authorization request (PAR) endpoint, which allows clients to push the payload of an OAuth 2.0 authorization request to the authorization server via a direct request and provides them with a request URI that is used as reference to the data in a subsequent call to the authorization endpoint.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9126"/>
          <seriesInfo name="DOI" value="10.17487/RFC9126"/>
        </reference>
        <reference anchor="RFC9449">
          <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="RFC9728">
          <front>
            <title>OAuth 2.0 Protected Resource Metadata</title>
            <author fullname="M.B. Jones" initials="M.B." surname="Jones"/>
            <author fullname="P. Hunt" initials="P." surname="Hunt"/>
            <author fullname="A. Parecki" initials="A." surname="Parecki"/>
            <date month="April" year="2025"/>
            <abstract>
              <t>This specification defines a metadata format that an OAuth 2.0 client or authorization server can use to obtain the information needed to interact with an OAuth 2.0 protected resource.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9728"/>
          <seriesInfo name="DOI" value="10.17487/RFC9728"/>
        </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>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC8126">
          <front>
            <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
            <author fullname="M. Cotton" initials="M." surname="Cotton"/>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <author fullname="T. Narten" initials="T." surname="Narten"/>
            <date month="June" year="2017"/>
            <abstract>
              <t>Many protocols make use of points of extensibility that use constants to identify various protocol parameters. To ensure that the values in these fields do not have conflicting uses and to promote interoperability, their allocations are often coordinated by a central record keeper. For IETF protocols, that role is filled by the Internet Assigned Numbers Authority (IANA).</t>
              <t>To make assignments in a given registry prudently, guidance describing the conditions under which new values should be assigned, as well as when and how modifications to existing values can be made, is needed. This document defines a framework for the documentation of these guidelines by specification authors, in order to assure that the provided guidance for the IANA Considerations is clear and addresses the various issues that are likely in the operation of a registry.</t>
              <t>This is the third edition of this document; it obsoletes RFC 5226.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="26"/>
          <seriesInfo name="RFC" value="8126"/>
          <seriesInfo name="DOI" value="10.17487/RFC8126"/>
        </reference>
        <reference anchor="RFC8792">
          <front>
            <title>Handling Long Lines in Content of Internet-Drafts and RFCs</title>
            <author fullname="K. Watsen" initials="K." surname="Watsen"/>
            <author fullname="E. Auerswald" initials="E." surname="Auerswald"/>
            <author fullname="A. Farrel" initials="A." surname="Farrel"/>
            <author fullname="Q. Wu" initials="Q." surname="Wu"/>
            <date month="June" year="2020"/>
            <abstract>
              <t>This document defines two strategies for handling long lines in width-bounded text content. One strategy, called the "single backslash" strategy, is based on the historical use of a single backslash ('\') character to indicate where line-folding has occurred, with the continuation occurring with the first character that is not a space character (' ') on the next line. The second strategy, called the "double backslash" strategy, extends the first strategy by adding a second backslash character to identify where the continuation begins and is thereby able to handle cases not supported by the first strategy. Both strategies use a self-describing header enabling automated reconstitution of the original content.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8792"/>
          <seriesInfo name="DOI" value="10.17487/RFC8792"/>
        </reference>
        <reference anchor="RFC9068">
          <front>
            <title>JSON Web Token (JWT) Profile for OAuth 2.0 Access Tokens</title>
            <author fullname="V. Bertocci" initials="V." surname="Bertocci"/>
            <date month="October" year="2021"/>
            <abstract>
              <t>This specification defines a profile for issuing OAuth 2.0 access tokens in JSON Web Token (JWT) format. Authorization servers and resource servers from different vendors can leverage this profile to issue and consume access tokens in an interoperable manner.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9068"/>
          <seriesInfo name="DOI" value="10.17487/RFC9068"/>
        </reference>
        <reference anchor="RFC9901">
          <front>
            <title>Selective Disclosure for JSON Web Tokens</title>
            <author fullname="D. Fett" initials="D." surname="Fett"/>
            <author fullname="K. Yasuda" initials="K." surname="Yasuda"/>
            <author fullname="B. Campbell" initials="B." surname="Campbell"/>
            <date month="November" year="2025"/>
            <abstract>
              <t>This specification defines a mechanism for the selective disclosure
of individual elements of a JSON data structure used as the payload
of a JSON Web Signature (JWS). The primary use case is the selective
disclosure of JSON Web Token (JWT) claims.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9901"/>
          <seriesInfo name="DOI" value="10.17487/RFC9901"/>
        </reference>
      </references>
    </references>
    <?line 1345?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The author thanks the OAuth Working Group for their foundational work on DPoP (<xref target="RFC9449"/>), PKCE (<xref target="RFC7636"/>), and the related specifications that this document extends.</t>
      <t>The author thanks Joe DeCock (Duende Software) for observations on token size implications across access token formats and algorithm combinations.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
Zu3/AQIj04TQFAEA

-->

</rfc>
