<?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-parecki-oauth-refresh-token-scope-response-00" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.0 -->
  <front>
    <title abbrev="OAuth RT Scope">OAuth 2.0 Refresh Token Scope</title>
    <seriesInfo name="Internet-Draft" value="draft-parecki-oauth-refresh-token-scope-response-00"/>
    <author fullname="Aaron Parecki">
      <organization>Okta</organization>
      <address>
        <email>aaron@parecki.com</email>
      </address>
    </author>
    <date year="2026" month="July" day="24"/>
    <area>Security</area>
    <workgroup>Web Authorization Protocol</workgroup>
    <keyword>refresh-token</keyword>
    <keyword>scope</keyword>
    <abstract>
      <?line 41?>

<t>This specification defines a new OAuth 2.0 token response parameter,
<tt>refresh_token_scope</tt>, that indicates the scope authorized for a
refresh token when it differs from the scope of the access token
issued alongside it. This allows clients to discover that a refresh
token carries broader authorization than the initial access token,
enabling just-in-time requests for elevated access without requiring
a new authorization flow.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://aaronpk.github.io/draft-parecki-oauth-refresh-token-scope-response/draft-parecki-oauth-refresh-token-scope-response.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-parecki-oauth-refresh-token-scope-response/"/>.
      </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/aaronpk/draft-parecki-oauth-refresh-token-scope-response"/>.</t>
    </note>
  </front>
  <middle>
    <?line 52?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The OAuth 2.0 Authorization Framework <xref target="I-D.ietf-oauth-v2-1"/> defines a token
endpoint response that includes a <tt>scope</tt> parameter indicating the
scope of the issued access token. When an authorization server issues
a refresh token alongside an access token, the refresh token may be
authorized for a broader set of scopes than the initial access token.
<xref target="I-D.ietf-oauth-v2-1"/> does not define a mechanism for the authorization server
to communicate this broader authorization to the client.</t>
      <t>This gap creates a practical problem: a client that receives a refresh
token has no reliable way to determine whether that refresh token can
be used to obtain access tokens with scopes beyond those reflected in
the initial access token's <tt>scope</tt> parameter. Without this
information, a client that needs elevated access must either
speculatively attempt a refresh with a larger scope (and handle
potential failure), or initiate an entirely new authorization flow,
even when the user or policy has already approved the broader scope.</t>
      <t>Consider the following scenarios:</t>
      <ul spacing="normal">
        <li>
          <t>In an authorization code flow, a user may approve a broad set of
scopes during the initial authorization. The authorization server
issues a minimal access token for the immediate operation but
includes a refresh token authorized for the full approved scope.
The client has no way to know that it may request additional scopes
via the refresh token grant without attempting it.</t>
        </li>
        <li>
          <t>In a client credentials flow, an authorization server may issue a
refresh token pre-authorized for a range of operations, while the
initial access token is scoped only to a particular operation. The
client service may need to perform higher-privilege operations later
and could use the refresh token to obtain the appropriate access
token on demand.</t>
        </li>
      </ul>
      <t>This specification defines a new token response parameter,
<tt>refresh_token_scope</tt>, that the authorization server includes when it
issues a refresh token. The parameter communicates the scope
authorized for the refresh token, enabling clients to make informed
decisions about when and how to request elevated access using the
refresh token grant.</t>
      <t>This mechanism provides a simpler alternative to dynamic
challenge-response protocols for many just-in-time authorization use
cases. Rather than defining new error codes, roundtrips, and challenge
sessions, an authorization server can pre-authorize a refresh token
with elevated scope and rely on the existing refresh token grant flow,
extended by this specification, to deliver the right access token at
the right time.</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>This document uses the terms "access token", "authorization server",
"client", "refresh token", "scope", "token endpoint", and "token
response" as defined by <xref target="I-D.ietf-oauth-v2-1"/>.</t>
    </section>
    <section anchor="the-refreshtokenscope-response-parameter">
      <name>The refresh_token_scope Response Parameter</name>
      <t>This specification defines the following token response parameter for
use in OAuth 2.0 token endpoint responses.</t>
      <dl>
        <dt><tt>refresh_token_scope</tt>:</dt>
        <dd>
          <t><bcp14>OPTIONAL</bcp14>. The scope authorized for the issued refresh token,
expressed as a space-separated list of scope values as described in
Section 1.4.1 of <xref target="I-D.ietf-oauth-v2-1"/>. This parameter <bcp14>MUST</bcp14> be included in the
token response when a refresh token is issued and its authorized
scope differs from the access token scope indicated by the <tt>scope</tt>
parameter. This parameter <bcp14>MAY</bcp14> be included even when the refresh
token scope is identical to the access token scope.</t>
        </dd>
      </dl>
      <t>When this parameter is present, it indicates the set of scopes that
the client <bcp14>MAY</bcp14> request when using the refresh token at the token
endpoint. The authorization server is not obligated to grant all
scopes listed in <tt>refresh_token_scope</tt> on any individual refresh
request; it <bcp14>MAY</bcp14> apply additional policy, credentials requirements, or
other conditions when deciding whether to honor a particular scope
request.</t>
    </section>
    <section anchor="authorization-server-behavior">
      <name>Authorization Server Behavior</name>
      <t>An authorization server that issues a refresh token with an authorized
scope that differs from the issued access token scope <bcp14>MUST</bcp14> include the
<tt>refresh_token_scope</tt> parameter in the token response.</t>
      <t>An authorization server that issues a refresh token with the same
authorized scope as the issued access token <bcp14>SHOULD</bcp14> include the
<tt>refresh_token_scope</tt> parameter in the token response for clarity, but
<bcp14>MAY</bcp14> omit it.</t>
      <t>The value of <tt>refresh_token_scope</tt> <bcp14>MUST</bcp14> accurately reflect the full
set of scopes for which the refresh token is authorized. The
authorization server <bcp14>MUST NOT</bcp14> include scope values in
<tt>refresh_token_scope</tt> that are not authorized for the refresh token.</t>
      <t>When the authorization server receives a refresh token grant request
that includes a <tt>scope</tt> parameter, it <bcp14>MUST</bcp14> verify that all requested
scope values are within the authorized scope of the presented refresh
token. If the requested scope exceeds the refresh token's authorized
scope, the authorization server <bcp14>MUST</bcp14> return an <tt>invalid_scope</tt> error
as defined in Section 3.2.4 of <xref target="I-D.ietf-oauth-v2-1"/>.</t>
    </section>
    <section anchor="client-behavior">
      <name>Client Behavior</name>
      <t>A client that receives a token response containing both a
<tt>refresh_token</tt> and a <tt>refresh_token_scope</tt> parameter <bcp14>MUST</bcp14> treat the
<tt>refresh_token_scope</tt> value as the authoritative indicator of the
scopes available via the refresh token grant.</t>
      <t>A client that needs an access token with a scope that is listed in
<tt>refresh_token_scope</tt> but not in the current access token's scope
<bcp14>SHOULD</bcp14> use the refresh token grant to request an access token with
the desired scope, rather than initiating a new authorization flow.</t>
      <t>A client <bcp14>MUST NOT</bcp14> request scopes via the refresh token grant that are
not listed in the <tt>refresh_token_scope</tt> parameter. Doing so will
result in an <tt>invalid_scope</tt> error from the authorization server.</t>
      <t>A client that does not receive a <tt>refresh_token_scope</tt> parameter in
the token response <bcp14>MUST</bcp14> assume that the refresh token is authorized
only for the scope indicated by the <tt>scope</tt> parameter (or, if the
<tt>scope</tt> parameter is also absent, the scope originally requested by
the client per Section 3.2.3 of <xref target="I-D.ietf-oauth-v2-1"/>).</t>
    </section>
    <section anchor="use-in-the-authorization-code-flow">
      <name>Use in the Authorization Code Flow</name>
      <t>In the authorization code flow, the resource owner authorizes a set
of scopes during the authorization request. As required by
<xref target="I-D.ietf-oauth-v2-1"/>, clients <bcp14>MUST</bcp14> use PKCE with the authorization
code flow. The authorization server may issue an initial access token
scoped to only what the client immediately requires, while issuing a
refresh token authorized for the full set of scopes approved by the
resource owner.</t>
      <t>This pattern is useful when:</t>
      <ul spacing="normal">
        <li>
          <t>The client performs an initial low-privilege operation (e.g.,
reading a user profile) and may later need higher-privilege access
(e.g., modifying account settings).</t>
        </li>
        <li>
          <t>The authorization server wishes to minimize the privilege of tokens
in active circulation while preserving the user's broad approval for
later use via the refresh token.</t>
        </li>
        <li>
          <t>Policies require that certain high-privilege access tokens be
short-lived and obtained fresh via the refresh token grant at the
time of use.</t>
        </li>
      </ul>
      <section anchor="example">
        <name>Example</name>
        <t>The client initiates an authorization request for a broad set of
scopes:</t>
        <sourcecode type="http"><![CDATA[
GET /authorize?response_type=code
  &client_id=s6BhdRkqt3
  &scope=profile%20payments%3Aread%20payments%3Awrite
  &redirect_uri=https%3A%2F%2Fclient.example.com%2Fcb
  &code_challenge=E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM
  &code_challenge_method=S256 HTTP/1.1
Host: authorization-server.example
]]></sourcecode>
        <t>After the user approves the request, the client exchanges the
authorization code for tokens:</t>
        <sourcecode type="http"><![CDATA[
POST /token HTTP/1.1
Host: authorization-server.example
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code
&code=SplxlOBeZQQYbYS6WxSbIA
&redirect_uri=https%3A%2F%2Fclient.example.com%2Fcb
&code_verifier=dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk
]]></sourcecode>
        <t>The authorization server issues an access token scoped to <tt>profile</tt>
only, alongside a refresh token authorized for all approved scopes:</t>
        <sourcecode type="http"><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store

{
  "access_token": "2YotnFZFEjr1zCsicMWpAA",
  "token_type": "Bearer",
  "expires_in": 3600,
  "scope": "profile",
  "refresh_token": "tGzv3JOkF0XG5Qx2TlKWIA",
  "refresh_token_scope": "profile payments:read payments:write"
}
]]></sourcecode>
        <t>The client now knows that when it later needs to initiate a payment,
it can obtain a suitable access token using the refresh token grant:</t>
        <sourcecode type="http"><![CDATA[
POST /token HTTP/1.1
Host: authorization-server.example
Content-Type: application/x-www-form-urlencoded

grant_type=refresh_token
&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA
&scope=payments%3Awrite
]]></sourcecode>
        <t>The authorization server issues an access token for the requested
scope, as it is within the refresh token's authorized scope:</t>
        <sourcecode type="http"><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store

{
  "access_token": "8xLOxBtZp8",
  "token_type": "Bearer",
  "expires_in": 300,
  "scope": "payments:write",
  "refresh_token": "tGzv3JOkF0XG5Qx2TlKWIA",
  "refresh_token_scope": "profile payments:read payments:write"
}
]]></sourcecode>
      </section>
    </section>
    <section anchor="use-in-the-client-credentials-flow">
      <name>Use in the Client Credentials Flow</name>
      <t>Section 4.2 of <xref target="I-D.ietf-oauth-v2-1"/> states that a refresh token
<bcp14>SHOULD NOT</bcp14> be included in the response to a client credentials grant.
This guidance reflects the typical case where the client can simply
re-authenticate to obtain a new access token. However,
<xref target="I-D.ietf-oauth-v2-1"/> does not prohibit issuing a refresh token for
a client credentials grant, and there are deployment scenarios where
doing so is appropriate.</t>
      <t>In machine-to-machine contexts, a client may be pre-authorized for a
range of operations that span different privilege levels. Rather than
issuing a single long-lived, high-privilege access token, the
authorization server can issue:</t>
      <ul spacing="normal">
        <li>
          <t>A minimal-privilege access token for the current operation, and</t>
        </li>
        <li>
          <t>A refresh token authorized for the broader set of operations the
client may need to perform.</t>
        </li>
      </ul>
      <t>The <tt>refresh_token_scope</tt> parameter enables this pattern by informing
the client of what it may request later. The client requests only the
scope it needs for the current operation and uses the refresh token to
obtain higher-privilege access tokens on demand, without
re-authenticating to the token endpoint from scratch.</t>
      <t>This pattern provides meaningful security benefits in environments
where access token leakage is a concern: high-privilege tokens are
only obtained and circulated when needed, and their lifetimes can be
kept short relative to the refresh token's lifetime.</t>
      <t>Authorization servers that choose to issue refresh tokens in client
credentials responses <bcp14>SHOULD</bcp14> apply the same refresh token security
requirements described in Section 7 of <xref target="I-D.ietf-oauth-v2-1"/> and in
<xref target="I-D.ietf-oauth-security-topics"/>. In particular, refresh token
rotation <bcp14>SHOULD</bcp14> be applied, and the refresh token <bcp14>SHOULD</bcp14> be bound to
the client using mTLS <xref target="RFC8705"/> or DPoP <xref target="RFC9449"/>.</t>
      <section anchor="example-1">
        <name>Example</name>
        <t>A client service requests an access token for a read operation:</t>
        <sourcecode type="http"><![CDATA[
POST /token HTTP/1.1
Host: authorization-server.example
Content-Type: application/x-www-form-urlencoded
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW

grant_type=client_credentials
&scope=records%3Aread
]]></sourcecode>
        <t>The authorization server issues an access token for the requested
scope and a refresh token authorized for a broader set of scopes:</t>
        <sourcecode type="http"><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store

{
  "access_token": "2YotnFZFEjr1zCsicMWpAA",
  "token_type": "Bearer",
  "expires_in": 3600,
  "scope": "records:read",
  "refresh_token": "tGzv3JOkF0XG5Qx2TlKWIA",
  "refresh_token_scope": "records:read records:write records:delete"
}
]]></sourcecode>
        <t>When the client later needs to perform a write operation, it uses the
refresh token to obtain a suitable access token:</t>
        <sourcecode type="http"><![CDATA[
POST /token HTTP/1.1
Host: authorization-server.example
Content-Type: application/x-www-form-urlencoded
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW

grant_type=refresh_token
&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA
&scope=records%3Awrite
]]></sourcecode>
        <sourcecode type="http"><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store

{
  "access_token": "9dEJolkQr2",
  "token_type": "Bearer",
  "expires_in": 300,
  "scope": "records:write",
  "refresh_token": "9tCvLOkF0XG5Qx2pE7iWIA",
  "refresh_token_scope": "records:read records:write records:delete"
}
]]></sourcecode>
      </section>
    </section>
    <section anchor="refresh-token-grant-behavior">
      <name>Refresh Token Grant Behavior</name>
      <t>When a client uses a refresh token to request a new access token, the
response <bcp14>MUST</bcp14> include a <tt>refresh_token_scope</tt> parameter if a new
refresh token is issued and its authorized scope differs from the
newly issued access token scope. The authorized scope of the new
refresh token <bcp14>MUST NOT</bcp14> exceed the authorized scope of the presented
refresh token.</t>
      <t>If the client omits the <tt>scope</tt> parameter from the refresh token grant
request, the authorization server issues an access token with the same
scope as the previously issued access token for that refresh token,
consistent with Section 4.3 of <xref target="I-D.ietf-oauth-v2-1"/>.</t>
      <t>If the client includes a <tt>scope</tt> parameter in the refresh token grant
request, the authorization server <bcp14>MUST</bcp14> verify the requested scope is
within the authorized scope of the presented refresh token. If the
requested scope is valid, the authorization server issues an access
token for the requested scope. The authorization server <bcp14>MAY</bcp14> also issue
a new refresh token; if it does, the <tt>refresh_token_scope</tt> of the new
token <bcp14>MUST NOT</bcp14> exceed the <tt>refresh_token_scope</tt> of the presented
token.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="scope-escalation">
        <name>Scope Escalation</name>
        <t>The <tt>refresh_token_scope</tt> parameter informs the client of available
scopes but does not by itself grant those scopes. The authorization
server retains full authority to deny any refresh token grant request
based on current policy, the state of the client's authentication
credentials, risk signals, or any other factor. The presence of a
scope value in <tt>refresh_token_scope</tt> is not a guarantee that the
authorization server will issue an access token for that scope on
demand.</t>
        <t>Implementors <bcp14>SHOULD NOT</bcp14> treat <tt>refresh_token_scope</tt> as an irrevocable
commitment. Authorization servers <bcp14>MAY</bcp14> narrow or revoke refresh token
scope at any time in response to policy changes or security events.</t>
      </section>
      <section anchor="refresh-token-protection">
        <name>Refresh Token Protection</name>
        <t>Because a refresh token carrying broad scope authorization is a
high-value credential, implementors <bcp14>MUST</bcp14> follow the refresh token
security requirements in Section 10 of
<xref target="I-D.ietf-oauth-security-topics"/>. Sender-constraining the refresh
token using mTLS <xref target="RFC8705"/> or DPoP <xref target="RFC9449"/> is strongly
<bcp14>RECOMMENDED</bcp14>, particularly in deployments where the refresh token is
authorized for elevated or sensitive scopes.</t>
        <t>Refresh token rotation (issuing a new refresh token on each use and
invalidating the previous one) limits the window of exposure if a
refresh token is compromised.</t>
      </section>
      <section anchor="client-credentials-and-refresh-tokens">
        <name>Client Credentials and Refresh Tokens</name>
        <t>When an authorization server issues a refresh token in response to a
client credentials grant, it <bcp14>MUST</bcp14> ensure that the client is
confidential and capable of maintaining the confidentiality of the
refresh token. Refresh tokens <bcp14>MUST NOT</bcp14> be issued for public clients
using the client credentials grant.</t>
        <t>The authorization server <bcp14>SHOULD</bcp14> bind the refresh token to the
client's authentication credential (e.g., via DPoP key binding or
mTLS) to prevent use of the refresh token by a party other than the
authenticated client.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document defines the following value for the IANA "OAuth
Parameters" registry established by <xref target="RFC6749"/>.</t>
      <dl>
        <dt>Parameter Name:</dt>
        <dd>
          <t><tt>refresh_token_scope</tt></t>
        </dd>
        <dt>Parameter Usage Location:</dt>
        <dd>
          <t>token response</t>
        </dd>
        <dt>Change Controller:</dt>
        <dd>
          <t>IETF</t>
        </dd>
        <dt>Specification Document:</dt>
        <dd>
          <t>This document, Section 3</t>
        </dd>
      </dl>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="I-D.ietf-oauth-v2-1">
          <front>
            <title>The OAuth 2.1 Authorization Framework</title>
            <author fullname="Dick Hardt" initials="D." surname="Hardt">
              <organization>Hellō</organization>
            </author>
            <author fullname="Aaron Parecki" initials="A." surname="Parecki">
              <organization>Okta</organization>
            </author>
            <author fullname="Torsten Lodderstedt" initials="T." surname="Lodderstedt">
              <organization>SPRIND</organization>
            </author>
            <date day="2" month="March" year="2026"/>
            <abstract>
              <t>   The OAuth 2.1 authorization framework enables an application to
   obtain limited access to a protected resource, either on behalf of a
   resource owner by orchestrating an approval interaction between the
   resource owner and an authorization service, or by allowing the
   application to obtain access on its own behalf.  This specification
   replaces and obsoletes the OAuth 2.0 Authorization Framework
   described in RFC 6749 and the Bearer Token Usage in RFC 6750.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-oauth-v2-1-15"/>
        </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="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="I-D.ietf-oauth-security-topics">
          <front>
            <title>OAuth 2.0 Security Best Current Practice</title>
            <author fullname="Torsten Lodderstedt" initials="T." surname="Lodderstedt">
              <organization>SPRIND</organization>
            </author>
            <author fullname="John Bradley" initials="J." surname="Bradley">
              <organization>Yubico</organization>
            </author>
            <author fullname="Andrey Labunets" initials="A." surname="Labunets">
              <organization>Independent Researcher</organization>
            </author>
            <author fullname="Daniel Fett" initials="D." surname="Fett">
              <organization>Authlete</organization>
            </author>
            <date day="3" month="June" year="2024"/>
            <abstract>
              <t>   This document describes best current security practice for OAuth 2.0.
   It updates and extends the threat model and security advice given in
   RFC 6749, RFC 6750, and RFC 6819 to incorporate practical experiences
   gathered since OAuth 2.0 was published and covers new threats
   relevant due to the broader application of OAuth 2.0.  Further, it
   deprecates some modes of operation that are deemed less secure or
   even insecure.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-oauth-security-topics-29"/>
        </reference>
        <reference anchor="RFC8705">
          <front>
            <title>OAuth 2.0 Mutual-TLS Client Authentication and Certificate-Bound Access Tokens</title>
            <author fullname="B. Campbell" initials="B." surname="Campbell"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <author fullname="T. Lodderstedt" initials="T." surname="Lodderstedt"/>
            <date month="February" year="2020"/>
            <abstract>
              <t>This document describes OAuth client authentication and certificate-bound access and refresh tokens using mutual Transport Layer Security (TLS) authentication with X.509 certificates. OAuth clients are provided a mechanism for authentication to the authorization server using mutual TLS, based on either self-signed certificates or public key infrastructure (PKI). OAuth authorization servers are provided a mechanism for binding access tokens to a client's mutual-TLS certificate, and OAuth protected resources are provided a method for ensuring that such an access token presented to it was issued to the client presenting the token.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8705"/>
          <seriesInfo name="DOI" value="10.17487/RFC8705"/>
        </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>
      </references>
    </references>
    <?line 492?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA9U8a3PbNrbf8Stw3eltsyMptpPm4d1s13bsvGPHdtab3Lnj
QCQkIaYILUFKVjrtb7m/5f6yPecAIAGKUpK2s52d6aQSBR4cnPcL7vf7rFRl
Jvf41sl+VU747mCbn8lRIc2EX+hrmfPzRM/kFhPDYSHn9bqzC/9DIko51sVy
j5syZSzVSS6mADAtxKjsz0Qhk2vV1wLe6hcWcr9EyH2DAOCZmencyP72NjPV
cKqMUTovlzOA8ezo4pjl1XQoiz2WwkZ7LMG1uanMHi+LSjJA6Q6DTQSgdi6T
qlDlcostdHE9LnQ1g6eXcsgRZ12oT6IE2Py00KVOdLbFruUSlqZ7jPd5hBw+
IPzYXOYV7Mv5l8Dj3CK+dQkIqHzMn+BL+HwqVAbPiQ5/U7IcDXQxxh/GqpxU
Q/hJiELns+vbX0s4BJIBbUwJQCZlOTN7t287YAMLfaD0V4P96hcGk3IKJGCC
aIMkBcQ4H1VZZiViH3HipxYg/QYkELmj4h4/uS4FPZaWWHSGvzkEBomeMpbr
Ygqr58SQZ/3HA6Skw22+29/Bx2fHh/fu3324x5jKRxvWGyctcJiZSox79cH9
7R/cx4d3CcpgMGCs3+9zMTRlIZKSsYuJMtzMZKJGKrEykMqRyqXhgudywRtl
IkpxTyMOpwFalLLosQ+OmFe05IqI+aHHy4koucpTBAzwyom0gsiFkzmZcjgW
F8y977ZYTOAfVfJUjUayMHxU6Gnwth7RF5Ek0hj7CgNVqwCayHQ+NiqV8PqA
09lElumF4UmmZF7icgALcOaysPgJry3Mbp6IolCA7bDQIoVFItIPeCWn3VWu
SiWyCIsek7kYZqgsHytT9lXeL9VUwgb/rECmDR1WZnIO5Ej9mwsQa12VtEgV
8C6zdI/3HcEhgHfEvKlK00wy9g1/lpeFTqsElyArZcCtWK+PkVdoSvhPP3UI
288/B1y3FJV5OtMqLxuGO3YmWZXSug+Wz40geF4jAYBGLGKX51BArwG/RE4D
RePDGlkge+gNw2oGOeloeIwvhuSnfeLFU7HkQ8naAldz18gSESRMzWbuDtha
0ml4N9eloyGAn8oEQCkzpe1IWjtOCBLHwRZMq5w0BNaptXKnCYqV4oFT27GY
8QT8RUnsmKFCA6AMPulhJqdgdtwLlnVgfCTYD7Mi8hOB6MPDTIH4Sr4AoqGe
IE+neCBQSNi98GBCAiciZ0PJKwOkhXf0sBQqZosVcU/ioVzqHJZOtCFeZTJB
ZVA5W0f378yqpIHkOLVBmjXWUYMQxIfOpUzNitJNQT25VHgohsavysi0Zksu
ylJOZ4FZsNgL8EvFGAWGZPp7AWcADqMeznQJuyHWI7D1VSFv9cAbuKOUJKX4
e4HQuxUb7Mbcmz2kAhCzQBAznalkSewRGfA5BfRmwNw50hrW1UKMOIFQHIKa
qlRagRtpNHyoiiYBs1QoDX6B/QlsxqrCJRq0iTCBg9LuqDduL68tTlfAoThW
plXhNL3hWwgWDfAawedOuVFV4N1pi+W11qjpVKZERdixsCCGVYnvN3aoZR5i
VSdSgN9uKOeoxQk7JypOA5zgX+d64axdSZRwBpyLNFWIA6BraQBQ5kp02J1x
IQCst+1OqJBaCrXXcsFvDiqcWgkynglrLCLiQoTjGF3EO84K2V8xc4DFmCxw
TT7TAzlTmSQDzTsVjmNEgMdLuc4zoohA1QPjAnpSNLCIwQDEnQORVIkkLFHt
8EVYiqrJJ2oMutafFWoOm48DfhqK+FAkUKcSXWUpimAHTRvzQgYV+QnwSMUI
ewxZaSHFMFMAN/iC+ObXRTXrTHojly6IYbWgR4exutF4zsANBIFS22+t0KTH
64gjCHCm4hpVEgkvU5bC2Q0RWgxRGBfW54L9QinXtXC3bWRlvB/vEG1P2cbR
oXYpq5BGTWcZurAMjpaTZSV/soTgWSUM3sgyCYLZb6ju0g4bIgHrlnEEFZMa
xANyNSPNgJ8J75gcXxFnZKssCl2QYQOJh8wlT8tCzUzPSpnHgAEQY7Vinc6B
g4t1q81KRg6ipp6LcGEXsvjaSqu8UYb0v8tMOB9wA34kBQjDpY0EIqntWY+c
qbmz7wVoVBnrrShZ8wvSDSPGbzi4hTnaFxIBwOsx0Ym+26ARUkeOuaPhW6/e
nl9s9ez/+esT+nx29Obts7Ojx/j5/On+y5f1B+ZWnD89efvycfOpefPw5NWr
o9eP7cvwlEeP2Nar/XdblidbJ6cXz05e77/c4qThQABIwKspWhbIm/D4Q5Rq
EClgB8mpAdk2SaGGFEDwg8PT//+/nbsQ4f4XpDy7OzsPITazXx7s3L8LX1D0
7W5k2OxXINmSgTWRArUX8wXg+UyVYI5hLbAB9ARiJFkgOf/0P0iZ/93jfxkm
s527f3UP8MDRQ0+z6CHRbPXJysuWiB2POrapqRk9b1E6xnf/XfTd0z14+Jcf
Mwz7+jsPfvwrc5peMwO0z5oojA5BZEIRRC53aRGy2hooXBHpAD4gncEPVo59
6uElw6pZXSRAplgbTrqyJiq3sn/RWMzQjPMzb3lOvQne6CrigGqdy0DjxdB3
gRi10+aVdMoAgp0eZo/tcc8T6yY6k+Ygp4pdArhBeQMqYgzpCNrjmUhk30hE
FBUnA1tUZz18LjJyUEjURpsAyrmkxJLvDO4OdnD9OkrbRLshA2kEKSv5wtQq
tKz9c00564paNhFA+VwRmK/ApTUn98HnamkgMoR2ja88OIsqfRoBQIJEoo37
/rsI9Tgy93kTjzcCjCmCw+TLZWqr+AC/Ly2caEP8AjDh9R6Gm61ySTs9tRbe
BVyIq/fehGLtstsxsQ1Y4sR+fXiOOGE6C1mkGhMB4VDWVYF1ZA4blCLL204x
Rs+HfhwPBIFBBaTx1HM4/xnPi2cA44uZVxNc28SnF0XGtj4i0QQZTLCYJs+f
QDZpfZklAUY7KVKhzlk1BDo5RcNBDGvDK4eINRVxweTcUuJATsRcwW5sf018
YPOEziDPpY5hTuJqIvTSigx3lEichJFGOZkkVeomeViJaThe69vgN5yCpBGA
hyGps0tmLfLOa/1mxMngJcA3VYJUYAKIYqOnqC82FHVmDJWleweiICBXoQnM
lr70UOeHLFY13BDypGTSoU0qtEg2B+qkqQ8M6vNH9hZMbDemtioJEQ+q4OcS
gMaorFHl1aJPFHo6DWCfre2RcaITAVQ1Wjo0s8yDqGXb+xM4AUqOipGrxcaV
BZ3ta7wYc/nRs5E7rYPuXpM3CVV0VijxnVlRs956stBJIIysCiqHfFA5oK1S
zwPKHlgQZ6i8dod3BruDu5vcoQ26rYkO7Me6WlxL1MGgYY6LJmyo0Xy0xOQD
uUWxRsxbTrjE6uAGvbNK4zTYEaq0CZtzRCB0llPe7Iu5UBmVCTdUPgbt89oy
XKtg60trgU1UgV9ZgzOoP6mGEyzQ6IJyhLhkaA28M0Dd9QSrAUEG3IUe+VvQ
CXA9TgQhnQySTlfmQ3ZtqNvXxKhtgt/TUXVTFckbBIanbrwuRTSbhWDAH2uq
AGo4C9g4WFplRLl1Mh8EVB1qs8LWuvLt5PkL5NJVeltSb80zuJCpbAosG8wu
owTOm8TN8V6w+fcaDZmV5472BdZZgVZiaMOxoOUEObWCyCRbBgZpuAyDsRkA
CE3EnQ0m4pa1EW9tqoBA4uDjEOuxxyA6jD3rsu1BvdbSyeiqSADNRR50Dmwt
RpascWtByTaG6CMhvl9HWnTANQfo1eUmYhzq1+mLw6MmVIigsxrfDTFnUNv0
WhWXJZmrSWIZ0GbvTkwcA+pasWMSHKEudiJgUtFWLWtdsTgOBurSsZUrFtPb
l8JmWOUtSE6BHgCGAlKquV9EYoJ1OROeEgjTVRnl38vBeNCjSq9IrYWh4jxg
M4K1t8gTIN2ogmprriuF1ro2aqHxqYa4c0nQkkRXVLct0X6ZWwOPayeDFspM
pK0vYskeK2HWgdeIj1zDh+rKHLtRYBESVdj2is4dM8jlF3MviHik71zfy5Ea
eym6cMMABYlXp4EkhE8xWcCOrWO6tR+JLKhUjPRYoYZvTA0xJzVw1LKPhTWb
cdoaM0oEbbTJMjvfyqnYhuevKMj+5ht+dCOwBmpDUy+griNkVmuN3hsEzUnf
brEyCGL0yy+/cJyJYE+OLvjtWnJ/9Db0Cuc1HqGqAUL/bfe8Uukjc+9gkp5d
/7O8g88J3CMnQd/ubs/EklKqb+/so5TFTxYQDRA0sAZA2aS8AvvxiAYz4Ndv
d4/hP9eSlPbAONuAD4eEA+ByVddaHx09fCWziRa7J4v5cXH06uL5uDp8KrR8
sVM+eHt2OayePD835aKfvFp9+wpM9ESnj853f7jHn15cnN7eGeywpxpHRSJa
9p2rcggh2cBrjUpXNiUFcgrto0iifS+0JRBlTrB1QitYl/FFa0FCFHLm9ASM
4W0rIV+D4yHEfLBt/4ImbjAddgWo2zf9xWLRR4vRrwogBG6eMkbiZxkeAb4i
9hPpHp3Pspvs5EC+f/Pm3fDd+b3Lm/Phs332a3hpeUGBv5LFo/Tg46h8Lt/f
Pfz7aX968HD3xe79ajJ8+/ztzmynuFpc7oyPL49Pjj7+49qSf0OhwWaceUfS
S5b+g5PUD+Twe2Hzf3PfT6y0/CJOee7w3e1tfvJiAwc+GnBghyKZyD4uKnS2
BxFP30BkDOr9E0iqq4DagGdrj2/tvtNlfvz++OhjsfPp0Kjk1eVsf38LLbmt
ZRLncOWBhLiusL/Imxm6rCuFMO7c296mp7Y0CksdIezaKMbCX8snn+Z3np9c
H2//48kPb252L7IXl8/2OxZftQFyr+97qP/NN9L9LfZzw0GnG9gcxQ6prUfV
wzqNDyIf0bS/Pcgeg1XYTfEzAhx8ckmZRMT8dUUskvk/WtsiWqIuBV8fdTOB
eZvbtqu/SjWaKkCUdVOnQlH+FCTd6xNkqxL/No14cPPy5OagfD978HVasKIE
sXT+MboQR+4u0T8MSpU2cvfJwN3B7oZUgJvSVXvDWTQX8TZdn45yejCYpbuH
CVwqbmeFKpWKPKlnblwLZzmjojV2U1GTCxl6QVRW6uUumWuA2iJ3KcNRH5v1
RmNdT/VCzrGF/tmJKSD8RA1V2UToLa3HOHD94WyDqCTEseCUylmmiWnN1Is9
F0t9JqxMODswoBRrCtIMMV+/1H33keow8gZrzfX2dpisc9KCdUxaWJ6aGbam
qdRL8X8dimZAoixuYbOGCmgEQSDR3dnYtLcplO11xClB/5psCWUi+37eZg2g
2r74skp9HCK1BfHZHKo1XReRJBgY6RgUccXczxURaOqBtCZIvIZLN/SAQ5SB
GAMGi45hHnJYgzA3q+c07dhLPcGofP1qLXFIDOvGaHtshTlVWZOb+WykHlvp
+cGhltrZ3mNQH6+bilS1MQkgk0za+Wg9mDGVAsuKmJn6gWEQ51yOsMemENpc
FTonk8esMYhEI5PiWoyp3SVQPSDFyvfaUunOguUqomKdTdHchcsF4SuFDUhV
lGynxKrgmRpJTKYMyS3kZ9dyVtoUDecp6lmSLu/m38UqVYcmOH1MJlpbm2mr
DREUooOVBhY3n1zT1rc0bMvKN0VaHPfUZWHPKuqu1pWi+5tcA/U/81Uj2hr3
xg4s2LCmu9VruZFCl66pZZEfSuvPA9K3TtAsHOLoDMpwoFA2QptevDwH1N2g
OaALyvH4VJ/aZzhxTrXwMBneb4+K1RrXFeYIqns0SvZHxH6RIO3xAwHRPE8+
vT8UT87OxZ3j7VefZvnl4+Ppmyl83n1+GUWLLgkPJMkHg5CA4cCNy7p/11DQ
9Qc2Z0fdA9D/2RmSoynFbr9faBhC5f4LBYT1t1RmMogP64acE/ZWZuRHIgW3
UAIPq5rpGtZ2Ip9Jm/7zlOM3pFKN9gSZ1L9Hch+mR891dv2m2P1tmUwkSWuk
9WF5OH/Z0GB2dF/9/tIK2Ux8S+4JlTabxqW9o9HY/o5ecthDW0kHer5mHnR6
fEf8C9pFIwuypQ+bhoTWjAgxgJIt1w9ZxL2Jdp96FYW6lWdb0l/W5Y5hYPIx
Ck0FjjSYNb2rujPXURZhURHza5xIPNwRTXQA0iABlVlDNOt+2hdCenStEZuU
bv6dN3nwppbYCik+c9HoN1AinmJYHTFQhv2awQWf/NpjsFWonNqtX8EitsbP
d8lrfEIcqsqMC3HdhbIIzT+jYinbwO1taCUH0r9e6je+2oi+F3mwOP56K/dX
VoQbR4ZokS7j8iOTCNs1+rKM0GZ+JlKmUTOs4KcXcHigLj5gwlgamY3qRjtm
BnZlB3VZPVKDjti4ayVuaMLdmMqXNPS2adRmKAzdrKizSD/tRlpY0mWXUBNc
3c7ngNhObeJJCPWVueZGjXP6hrEd7G9n40YiAU/mrhoQGxKCLcJJnfUDfG4K
UPBxJfAEsmnNd5cacMag6eF2GwunQzmrb2g8w9gDUyRd1OkVCpidXelGTdj+
KdBvrhPiL16gUCWCGfDu7A+VIhdFoRdIJXzzumVBvPkriYbU01PBjALGbvZG
lm8O6aLJpHFQtDQ24YkdKt6plu6O5oFMBLYz2x4Ub51SU9b1/qKJX3sOTLsZ
ZduWb40UQOAY0pBU1E4rr1pJViMcJadBSrqzjW3HL0k6z/G+QtFHg18WbmYp
2JCF9fwvyRbp4hFEYfk4W7JgfL0X5LbojPKgzmeCsmU7RGhfn6nvaBDfwPBQ
NcHpO2Nn0et10vx9U5RbMaOoxhLiR2pRY33MzdTUd2BrJwor5S2eqdrBL1Se
oiiOcFpbmwrOgLHOapwDkj0D16/Aaljp6qg4YxAUCZ3xcdvGu7Wrs9exuAu2
vvDqxwHxLxgUwdCOd98GA4GRcq/Z8o+YUd4CZ56CuJSByIRrUTi1d6KRa404
ZBpfNKzHT5HNs2qYYSJiJ1RY009aXyJfn3v7SojqrJPYShRbY6iDnfz0BU4T
kNjjnRsEirhBlI3qcYssTEGGhARKjzq2BKdlJ5m9lfeXlllYoE+bq8J4T3z/
9f6Kq41vdXTfdLCWxgcgBMb+1QxW35swW4DgGAK+AmygwcQU50TczQz3Bwwo
vKvf4K/xbyiwvW7bHi58a7De+FInrv6z1xobY+yQLDF32VuGf1zD/a0Ndh7d
5HjsDoq/RyfvNVNb7n79UCTXNBCeYJszk+nYlkR/2rN/v0Omj7ZGIDxy62eg
4snjE3B1fiVdufoXXL6Vu4xEAAA=

-->

</rfc>
