<?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.6.17 (Ruby 3.1.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-oauth-browser-based-apps-10" category="bcp" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.14.2 -->
  <front>
    <title>OAuth 2.0 for Browser-Based Apps</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-oauth-browser-based-apps-10"/>
    <author initials="A." surname="Parecki" fullname="Aaron Parecki">
      <organization>Okta</organization>
      <address>
        <email>aaron@parecki.com</email>
        <uri>https://aaronparecki.com</uri>
      </address>
    </author>
    <author initials="D." surname="Waite" fullname="David Waite">
      <organization>Ping Identity</organization>
      <address>
        <email>david@alkaline-solutions.com</email>
      </address>
    </author>
    <date year="2022" month="September" day="06"/>
    <area>Security</area>
    <workgroup>Web Authorization Protocol</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>This specification details the security considerations and best practices that must be
taken into account when developing browser-based applications that use OAuth 2.0.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Discussion of this document takes place on the
    Web Authorization Protocol Working Group mailing list (oauth@ietf.org),
    which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/oauth/"/>.</t>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/oauth-wg/oauth-browser-based-apps"/>.</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>This specification describes the current best practices for implementing OAuth 2.0
authorization flows in applications executing in a browser.</t>
      <t>For native application developers using OAuth 2.0 and OpenID Connect, an IETF BCP
(best current practice) was published that guides integration of these technologies.
This document is formally known as <xref target="RFC8252"/> or BCP 212, but nicknamed "AppAuth" after
the OpenID Foundation-sponsored set of libraries that assist developers in adopting
these practices. <xref target="RFC8252"/> makes specific recommendations for how to securely implement OAuth in native
applications, including incorporating additional OAuth extensions where needed.</t>
      <t>OAuth 2.0 for Browser-Based Apps addresses the similarities between implementing
OAuth for native apps and browser-based apps, and includes additional
considerations when running in a browser. This is primarily focused on OAuth,
except where OpenID Connect provides additional considerations.</t>
      <t>Many of these recommendations are derived from the OAuth 2.0 Security Best Current Practice
<xref target="oauth-security-topics"/> and browser-based apps are expected to follow those recommendations
as well. This draft expands on and further restricts various recommendations in <xref target="oauth-security-topics"/>.</t>
    </section>
    <section anchor="notational-conventions">
      <name>Notational Conventions</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
"OPTIONAL" in this document are to be interpreted as described in <xref target="RFC2119"/>.</t>
    </section>
    <section anchor="terminology">
      <name>Terminology</name>
      <t>In addition to the terms defined in referenced specifications, this document uses
the following terms:</t>
      <dl>
        <dt>"OAuth":</dt>
        <dd>
          <t>In this document, "OAuth" refers to OAuth 2.0, <xref target="RFC6749"/> and <xref target="RFC6750"/>.</t>
        </dd>
        <dt>"Browser-based application":</dt>
        <dd>
          <t>An application that is dynamically downloaded and executed in a web browser,
usually written in JavaScript. Also sometimes referred to as a "single-page application", or "SPA".</t>
        </dd>
      </dl>
    </section>
    <section anchor="overview">
      <name>Overview</name>
      <t>At the time that OAuth 2.0 <xref target="RFC6749"/> and <xref target="RFC6750"/> were created, browser-based JavaScript applications needed a solution that strictly complied with the same-origin policy. Common deployments of OAuth 2.0 involved an application running on a different domain than the authorization server, so it was historically not possible to use the Authorization Code flow which would require a cross-origin POST request. This was one of the motivations for the definition of the Implicit flow, which returns the access token in the front channel via the fragment part of the URL, bypassing the need for a cross-origin POST request.</t>
      <t>However, there are several drawbacks to the Implicit flow, generally involving vulnerabilities associated with the exposure of the access token in the URL. See <xref target="implicit_flow"/> for an analysis of these attacks and the drawbacks of using the Implicit flow in browsers. Additional attacks and security considerations can be found in <xref target="oauth-security-topics"/>.</t>
      <t>In recent years, widespread adoption of Cross-Origin Resource Sharing (CORS), which enables exceptions to the same-origin policy, allows browser-based apps to use the OAuth 2.0 Authorization Code flow and make a POST request to exchange the authorization code for an access token at the token endpoint. In this flow, the access token is never exposed in the less-secure front channel. Furthermore, adding PKCE to the flow ensures that even if an authorization code is intercepted, it is unusable by an attacker.</t>
      <t>For this reason, and from other lessons learned, the current best practice for browser-based applications is to use the OAuth 2.0 Authorization Code flow with PKCE.</t>
      <t>Browser-based applications:</t>
      <ul spacing="normal">
        <li>MUST use the OAuth 2.0 Authorization Code flow with the PKCE extension when obtaining an access token</li>
        <li>
          <t>MUST Protect themselves against CSRF attacks by either:
          </t>
          <ul spacing="normal">
            <li>ensuring the authorization server supports PKCE, or</li>
            <li>by using the OAuth 2.0 "state" parameter or the OpenID Connect "nonce" parameter to carry one-time use CSRF tokens</li>
          </ul>
        </li>
        <li>MUST Register one or more redirect URIs, and use only exact registered redirect URIs in authorization requests</li>
      </ul>
      <t>OAuth 2.0 authorization servers supporting browser-based applications:</t>
      <ul spacing="normal">
        <li>MUST Require exact matching of registered redirect URIs</li>
        <li>MUST Support the PKCE extension</li>
        <li>MUST NOT issue access tokens in the authorization response</li>
        <li>
          <t>If issuing refresh tokens to browser-based applications, then:
          </t>
          <ul spacing="normal">
            <li>MUST rotate refresh tokens on each use or use sender-constrained refresh tokens, and</li>
            <li>MUST set a maximum lifetime on refresh tokens or expire if they are not used in some amount of time</li>
          </ul>
        </li>
      </ul>
    </section>
    <section anchor="first-party-applications">
      <name>First-Party Applications</name>
      <t>While OAuth was initially created to allow third-party
applications to access an API on behalf of a user, it has proven to be
useful in a first-party scenario as well. First-party apps are applications where
the same organization provides both the API and the application.</t>
      <t>Examples of first-party applications are a web email client provided by the operator of the email account,
or a mobile banking application created by bank itself. (Note that there is no
requirement that the application actually be developed by the same company; a mobile
banking application developed by a contractor that is branded as the bank's
application is still considered a first-party application.) The first-party app
consideration is about the user's relationship to the application and the service.</t>
      <t>To conform to this best practice, first-party applications using OAuth or OpenID
Connect MUST use a redirect-based flow (such as the OAuth Authorization Code flow)
as described later in this document.</t>
      <t>The resource owner password credentials grant MUST NOT be used, as described in
<xref target="oauth-security-topics"/> Section 2.4. Instead, by using the Authorization Code flow
and redirecting the user to the authorization server,
this provides the authorization server the opportunity to prompt the user for
multi-factor authentication options, take advantage of single sign-on sessions,
or use third-party identity providers. In contrast, the resource owner password credentials grant does not
provide any built-in mechanism for these, and would instead be extended with custom code.</t>
    </section>
    <section anchor="application-architecture-patterns">
      <name>Application Architecture Patterns</name>
      <t>Here are the main architectural patterns available when building browser-based
applications.</t>
      <ul spacing="normal">
        <li>single-domain, not using OAuth</li>
        <li>
          <t>a JavaScript application accessing resource servers
          </t>
          <ul spacing="normal">
            <li>either directly</li>
            <li>or through a service worker</li>
          </ul>
        </li>
        <li>a JavaScript application with a stateful backend component for storing tokens and handling all authentication flows (BFF proxy)</li>
      </ul>
      <t>These architectures have different use cases and considerations.</t>
      <section anchor="single-domain-browser-based-apps-not-using-oauth">
        <name>Single-Domain Browser-Based Apps (not using OAuth)</name>
        <t>For simple system architectures, such as when the JavaScript application is served
from a domain that can share cookies with the domain of the API (resource server) and the authorization server,
OAuth adds additional attack vectors that could be avoided with a different solution.</t>
        <t>In particular, using any redirect-based mechanism of obtaining an access token
enables the redirect-based attacks described in <xref target="oauth-security-topics"/> Section 4, but if
the application, authorization server and resource server share a domain, then it is
unnecessary to use a redirect mechanism to communicate between them.</t>
        <t>An additional concern with handling access tokens in a browser is that
in case of successful XSS attack, tokens could be read and further used or transmitted by the injected code if no
secure storage mechanism is in place.</t>
        <t>As such, it could be considered to use an HTTP-only cookie between the JavaScript application
and API so that the JavaScript code can't access the cookie value itself. The <tt>Secure</tt> cookie attribute should be used to ensure the cookie is not included in unencrypted HTTP requests. Additionally, the <tt>SameSite</tt> cookie attribute can be used to counter some CSRF attacks,
but should not be considered the extent of the CSRF protection, as described in <xref target="draft-ietf-httpbis-rfc6265bis"/></t>
        <t>OAuth was originally created for third-party or federated access to APIs, so it may not be
the best solution in a common-domain deployment. That said, there are still some advantages
in using OAuth even in a common-domain architecture:</t>
        <ul spacing="normal">
          <li>Allows more flexibility in the future, such as if you were to later add a new domain to the system. With OAuth already in place, adding a new domain wouldn't require any additional rearchitecting.</li>
          <li>Being able to take advantage of existing library support rather than writing bespoke code for the integration.</li>
          <li>Centralizing login and multifactor support, account management, and recovery at the OAuth server, rather than making it part of the application logic.</li>
          <li>Splitting of responsibilities between authenticating a user and serving resources</li>
        </ul>
        <t>Using OAuth for browser-based apps in a first-party same-domain scenario provides these advantages, and can be accomplished by any of the architectural patterns described below.</t>
      </section>
      <section anchor="backend-for-frontend-bff-proxy">
        <name>Backend For Frontend (BFF) Proxy</name>
        <artwork><![CDATA[
+-------------+  +--------------+ +---------------+
|             |  |              | |               |
|Authorization|  |    Token     | |   Resource    |
|  Endpoint   |  |   Endpoint   | |    Server     |
|             |  |              | |               |
+-------------+  +--------------+ +---------------+

       ^                ^                   ^
       |             (D)|                (G)|
       |                v                   v
       |
       |         +--------------------------------------+
       |         |                                      |
       |         |   Backend for Frontend Proxy (BFF)   |
    (B)|         |                                      |
       |         +--------------------------------------+
       |
       |           ^     ^     +          ^    +
       |        (A)|  (C)|  (E)|       (F)|    |(H)
       v           v     +     v          +    v

+-------------------------------------------------+
|                                                 |
|                   Browser                       |
|                                                 |
+-------------------------------------------------+
]]></artwork>
        <t>In this architecture, commonly referred to as "backend for frontend" or "BFF", the JavaScript code is loaded from a dynamic Application Server (A) that has the ability to execute code and handle the full authentication flow itself. This enables the ability to keep
the call to actually get an access token outside the JavaScript
application.</t>
        <t>Note that this BFF is not the Resource Server, it is the OAuth client and would be accessing data at a separate resource server.</t>
        <t>In this case, the BFF initiates the OAuth flow itself, by redirecting the browser to the authorization endpoint (B). When the user is redirected back, the browser delivers the authorization code to the application server (C), where it can then exchange it for an access token at the token endpoint (D) using its client secret and PKCE code verifier.
The application server then keeps the access token and refresh token stored internally, and creates a separate session with the browser-based app via a
traditional browser cookie (E).</t>
        <t>When the JavaScript application in the browser wants to make a request to the Resource Server,
it instead makes the request to the Application Server (F), and the Application Server will
make the request with the access token to the Resource Server (G), and forward the response (H)
back to the browser.</t>
        <t>(Common examples of this architecture are an Angular front-end with a .NET backend, or
a React front-end with a Spring Boot backend.)</t>
        <t>The Application Server SHOULD be considered a confidential client, and issued its own client secret. The Application Server SHOULD use the OAuth 2.0 Authorization Code grant with PKCE to initiate a request for an access token. Detailed recommendations for confidential clients can be found in <xref target="oauth-security-topics"/> Section 2.1.1.</t>
        <t>In this scenario, the connection between the browser and Application Server SHOULD be a
session cookie provided by the Application Server.</t>
        <section anchor="security-considerations">
          <name>Security considerations</name>
          <t>Security of the connection between code running in the browser and this Application Server is
assumed to utilize browser-level protection mechanisms. Details are out of scope of
this document, but many recommendations can be found in the OWASP Cheat Sheet series (https://cheatsheetseries.owasp.org/),
such as setting an HTTP-only and <tt>Secure</tt> cookie to authenticate the session between the
browser and Application Server.</t>
          <t>Additionally, cookies MUST be protected from leakage by other means, such as logs.</t>
          <t>This architecture protects against tokens leakage from the browser, but creates a CSRF attack vector:
once the user is authenticated, the BFF proxy will automatically add tokens to calls to the resource server.</t>
          <!--
TODO: Add another description of the alternative architecture where access tokens are passed to JS and the JS app makes API calls directly. https://mailarchive.ietf.org/arch/msg/oauth/sl-g6zYSpJW3sYqrR0peadUw54U/
-->

</section>
      </section>
      <section anchor="javascript-applications-accessing-resource-servers-directly">
        <name>JavaScript Applications accessing resource servers directly</name>
        <artwork><![CDATA[
                      +---------------+           +--------------+
                      |               |           |              |
                      | Authorization |           |   Resource   |
                      |    Server     |           |    Server    |
                      |               |           |              |
                      +---------------+           +--------------+

                             ^     ^                 ^     +
                             |     |                 |     |
                             |(B)  |(C)              |(D)  |(E)
                             |     |                 |     |
                             |     |                 |     |
                             +     v                 +     v

+-----------------+         +-------------------------------+
|                 |   (A)   |                               |
| Static Web Host | +-----> |           Browser             |
|                 |         |                               |
+-----------------+         +-------------------------------+
]]></artwork>
        <t>In this architecture, the JavaScript code is first loaded from a static web host into
the browser (A), and the application then runs in the browser. This application is considered a public
client, since there is no way to issue it a client secret in this model.</t>
        <t>The code in the browser initiates the Authorization Code flow with the PKCE
extension (described in <xref target="authorization_code_flow"/>) (B) above, and obtains an
access token via a POST request (C).</t>
        <t>The application is then responsible for storing
the access token (and optional refresh token) as securely as possible using appropriate browser APIs.</t>
        <t>When the JavaScript application in the browser wants to make a request to the Resource Server,
it can interact with the Resource Server directly. It includes the access token in the request (D)
and receives the Resource Server's response (E).</t>
        <t>In this scenario, the Authorization Server and Resource Server MUST support
the necessary CORS headers to enable the JavaScript code to make these POST requests
from the domain on which the script is executing. (See <xref target="cors"/> for additional details.)</t>
        <section anchor="tokens-in-local-or-session-storage">
          <name>Tokens in Local or Session Storage</name>
          <t>In case of successful XSS attack, the injected code has full access to stored tokens and can leak them to the attacker.</t>
          <t>Remarks and mitigations:
* As a general rule, XSS will lead to full compromise of the application and all precautions MUST be taken against it.
* The application SHOULD be designed to restrict access tokens to strictly needed resources, to avoid escalating the scope of the attack.
* To avoid information disclosure from ID Tokens, the application SHOULD be designed to not have any claim that isn't used by the frontend.
* The application designer SHOULD consider not having refresh tokens at all to avoid the risk of giving prolonged access to the attacker.</t>
        </section>
        <section anchor="tokens-securely-handled-by-a-service-worker">
          <name>Tokens Securely Handled by a Service worker</name>
          <t>In this scenario, a <eref target="https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API">Service Worker</eref> is responsible for obtaining tokens from the authorization server and making requests to the resource server.</t>
          <t>Service workers are run in a separate context from the DOM, have no access to the DOM, and the DOM has no access to the service worker. This makes service workers inherently safe from XSS, thus they can be used as a safe store for tokens.</t>
          <t>In this architecture, a service worker intercepts calls from the frontend to the resource server. As such, it completely isolates calls to the authorization server from XSS attack surface, as all tokens are safely kept in the service worker context without any access from other JavaScript contexts. The service worker is then solely responsible for adding the token in the authorization header to calls to the resource server.</t>
          <artwork><![CDATA[
                                                                 Resource               Authorization
  User       Application        Service Worker                    server                   server
   |   browse     |                   |                              |                        |
   | ------------>|                   |                              |                        |
   |              |------------------->                              |           /authorize   |
   |              |                   -------------------------------------------------------->
   |              |                   |                 redirect w/ authorization code        |
   |              |                   < - - - - - - - - - - - - - - - - - - - - - - - - - - - |
   |              |                   |                              |                        |
   |              |                   |  token request w/ auth code  |               /token   |
   |              |                   | ------------------------------------------------------>
   |              |                   | <- - - - - - - - - - - - - - - - - - - - - - - - - - -|
   |              |                   |                              |                        |
   |              | resource request  |                              |                        |
   |              |-------------------> resource request with token  |                        |
   |              |                   | ---------------------------->|                        |
   |              |                   |                              |                        |
  User       Application        Service Worker                   Resource               Authorization
                                                                  server                   server
]]></artwork>
          <section anchor="security-considerations-1">
            <name>Security Considerations</name>
            <ul spacing="normal">
              <li>The service worker MUST initiate the OAuth 2.0 Authorization Code grant with PKCE itself.</li>
              <li>The service worker MUST intercept the authorization code when the <em>authorization server</em> redirects to the application. This makes this architecture completely safe from token or session leaks in case of XSS.</li>
              <li>The service worker implementation MUST then initiate the token request itself.</li>
              <li>The service worker MUST not transmit tokens, authorization codes or PKCE secrets (e.g. code verifier) to the frontend application.</li>
              <li>The service worker MUST block /token or /authorize calls initiating from the frontend application in order to avoid any front-end side-channel for getting credentials: the only way of starting the authorization flow is through the service worker. This protects against re-authorization from XSS-injected code.</li>
            </ul>
          </section>
        </section>
      </section>
    </section>
    <section anchor="authorization_code_flow">
      <name>Authorization Code Flow</name>
      <t>Browser-based applications that are public clients and use the Authorization Code grant type described in
Section 4.1 of OAuth 2.0 <xref target="RFC6749"/> MUST also follow these additional requirements
described in this section.</t>
      <section anchor="auth_code_request">
        <name>Initiating the Authorization Request from a Browser-Based Application</name>
        <t>Browser-based applications that are public clients MUST implement the Proof Key for Code Exchange
(PKCE <xref target="RFC7636"/>) extension when obtaining an access token, and authorization servers MUST support and enforce
PKCE for such clients.</t>
        <t>The PKCE extension prevents an attack where the authorization code is intercepted
and exchanged for an access token by a malicious client, by providing the
authorization server with a way to verify the client instance that exchanges
the authorization code is the same one that initiated the flow.</t>
        <t>Browser-based applications MUST prevent CSRF attacks against their redirect URI. This can be
accomplished by any of the below:</t>
        <ul spacing="normal">
          <li>using PKCE, and confirming that the authorization server supports PKCE</li>
          <li>using a unique value for the OAuth 2.0 "state" parameter</li>
          <li>if the application is using OpenID Connect, by using the OpenID Connect "nonce" parameter</li>
        </ul>
      </section>
      <section anchor="auth_code_redirect">
        <name>Handling the Authorization Code Redirect</name>
        <t>Authorization servers MUST require an exact match of a registered redirect URI.
As described in <xref target="oauth-security-topics"/> Section 4.1.1. this helps to prevent attacks targeting the authorization code.</t>
      </section>
    </section>
    <section anchor="refresh_tokens">
      <name>Refresh Tokens</name>
      <t>Refresh tokens provide a way for applications to obtain a new access token when the
initial access token expires. With public clients, the risk of a leaked refresh token
is greater than leaked access tokens, since an attacker may be able to
continue using the stolen refresh token to obtain new access tokens potentially without being
detectable by the authorization server.</t>
      <t>Javascript-accessible storage mechanisms like <em>Local Storage</em> provide an attacker with several opportunities by which a
refresh token can be leaked, just as with access tokens. As such, these mechanisms
are considered a higher risk for handling refresh tokens.</t>
      <t>Authorization servers may choose whether or not to issue refresh tokens to browser-based
applications. <xref target="oauth-security-topics"/> describes some additional requirements around refresh tokens
on top of the recommendations of <xref target="RFC6749"/>. Applications and authorization servers
conforming to this BCP MUST also follow the recommendations in <xref target="oauth-security-topics"/>
around refresh tokens if refresh tokens are issued to browser-based applications.</t>
      <t>In particular, authorization servers:</t>
      <ul spacing="normal">
        <li>MUST either rotate refresh tokens on each use OR use sender-constrained refresh tokens as described in <xref target="oauth-security-topics"/> Section 4.13.2</li>
        <li>MUST either set a maximum lifetime on refresh tokens OR expire if the refresh token has not been used within some amount of time</li>
        <li>MUST NOT extend the lifetime of the new refresh token beyond the lifetime of the initial refresh token</li>
        <li>upon issuing a rotated refresh token, MUST NOT extend the lifetime of the new refresh token beyond the lifetime of the initial refresh token if the refresh token has a preestablished expiration time</li>
      </ul>
      <t>For example:</t>
      <ul spacing="normal">
        <li>A user authorizes an application, issuing an access token that lasts 1 hour, and a refresh token that lasts 24 hours</li>
        <li>After 1 hour, the initial access token expires, so the application uses the refresh token to get a new access token</li>
        <li>The authorization server returns a new access token that lasts 1 hour, and a new refresh token that lasts 23 hours</li>
        <li>This continues until 24 hours pass from the initial authorization</li>
        <li>At this point, when the application attempts to use the refresh token after 24 hours, the request will fail and the application will have to involve the user in a new authorization request</li>
      </ul>
      <t>By limiting the overall refresh token lifetime to the lifetime of the initial refresh token, this ensures a stolen refresh token cannot be used indefinitely.</t>
      <t>Authorization servers MAY set different policies around refresh token issuance, lifetime and expiration for browser-based applications compared to other public clients.</t>
    </section>
    <section anchor="security-considerations-2">
      <name>Security Considerations</name>
      <section anchor="client_registration">
        <name>Registration of Browser-Based Apps</name>
        <t>Browser-based applications are considered public clients as defined by Section 2.1
of OAuth 2.0 <xref target="RFC6749"/>, and MUST be registered with the authorization server as
such. Authorization servers MUST record the client type in the client registration
details in order to identify and process requests accordingly.</t>
        <t>Authorization servers MUST require that browser-based applications register
one or more redirect URIs.</t>
      </section>
      <section anchor="client_authentication">
        <name>Client Authentication</name>
        <t>Since a browser-based application's source code is delivered to the end-user's
browser, it cannot contain provisioned secrets. As such, a browser-based app
with native OAuth support is considered a public client as defined by Section 2.1
of OAuth 2.0 <xref target="RFC6749"/>.</t>
        <t>Secrets that are statically included as part of an app distributed to
multiple users should not be treated as confidential secrets, as one
user may inspect their copy and learn the shared secret.  For this
reason, and those stated in Section 5.3.1 of <xref target="RFC6819"/>, it is NOT RECOMMENDED
for authorization servers to require client authentication of browser-based
applications using a shared secret, as this serves little value beyond
client identification which is already provided by the client_id request parameter.</t>
        <t>Authorization servers that still require a statically included shared
secret for SPA clients MUST treat the client as a public
client, and not accept the secret as proof of the client's identity. Without
additional measures, such clients are subject to client impersonation
(see <xref target="client_impersonation"/> below).</t>
      </section>
      <section anchor="client_impersonation">
        <name>Client Impersonation</name>
        <t>As stated in Section 10.2 of OAuth 2.0 <xref target="RFC6749"/>, the authorization
server SHOULD NOT process authorization requests automatically
without user consent or interaction, except when the identity of the
client can be assured.</t>
        <t>If authorization servers restrict redirect URIs to a fixed set of absolute
HTTPS URIs, preventing the use of wildcard domains, wildcard paths, or wildcard query string components,
this exact match of registered absolute HTTPS URIs MAY be accepted by authorization servers as
proof of identity of the client for the purpose of deciding whether to automatically
process an authorization request when a previous request for the client_id
has already been approved.</t>
      </section>
      <section anchor="csrf_protection">
        <name>Cross-Site Request Forgery Protections</name>
        <t>Clients MUST prevent Cross-Site Request Forgery (CSRF) attacks against their redirect URI.
Clients can accomplish this by either ensuring the authorization server supports
PKCE and relying on the CSRF protection that PKCE provides, or if the client is also an
OpenID Connect client, using the OpenID Connect "nonce" parameter, or by using the
"state" parameter to carry one-time-use CSRF tokens as described in <xref target="auth_code_request"/>.</t>
        <t>See Section 2.1 of <xref target="oauth-security-topics"/> for additional details.</t>
      </section>
      <section anchor="auth_server_mixup">
        <name>Authorization Server Mix-Up Mitigation</name>
        <t>Authorization server mix-up attacks mark a severe threat to every client that supports
at least two authorization servers. To conform to this BCP such clients MUST apply
countermeasures to defend against mix-up attacks.</t>
        <t>It is RECOMMENDED to defend against mix-up attacks by identifying and validating the issuer
of the authorization response. This can be achieved either by using the "iss" response
parameter, as defined in <xref target="oauth-iss-auth-resp"/>, or by using the "iss" Claim of the ID token
when OpenID Connect is used.</t>
        <t>Alternative countermeasures, such as using distinct redirect URIs for each issuer, SHOULD
only be used if identifying the issuer as described is not possible.</t>
        <t>Section 4.4 of <xref target="oauth-security-topics"/> provides additional details about mix-up attacks
and the countermeasures mentioned above.</t>
      </section>
      <section anchor="cors">
        <name>Cross-Domain Requests</name>
        <t>To complete the Authorization Code flow, the browser-based application will
need to exchange the authorization code for an access token at the token endpoint.
If the authorization server provides additional endpoints to the application, such
as metadata URLs, dynamic client registration, revocation, introspection, discovery or
user info endpoints, these endpoints may also be accessed by the browser-based app.
Since these requests will be made from a browser, authorization servers MUST support
the necessary CORS headers (defined in <xref target="Fetch"/>) to allow the browser to make the
request.</t>
        <t>This specification does not include guidelines for deciding whether a CORS policy
for the token endpoint should be a wildcard origin or more restrictive. Note,
however, that the browser will attempt to GET or POST to the API endpoint before
knowing any CORS policy; it simply hides the succeeding or failing result from
JavaScript if the policy does not allow sharing.</t>
      </section>
      <section anchor="csp">
        <name>Content Security Policy</name>
        <t>A browser-based application that wishes to use either long-lived refresh tokens or
privileged scopes SHOULD restrict its JavaScript execution to a set of statically
hosted scripts via a Content Security Policy (<xref target="CSP2"/>) or similar mechanism. A
strong Content Security Policy can limit the potential attack vectors for malicious
JavaScript to be executed on the page.</t>
      </section>
      <section anchor="implicit_flow">
        <name>OAuth Implicit Flow</name>
        <t>The OAuth 2.0 Implicit flow (defined in Section 4.2 of
OAuth 2.0 <xref target="RFC6749"/>) works by the authorization server issuing an access token in the
authorization response (front channel) without the code exchange step. In this case, the access
token is returned in the fragment part of the redirect URI, providing an attacker
with several opportunities to intercept and steal the access token.</t>
        <t>Authorization servers MUST NOT issue access tokens in the authorization response, and MUST issue
access tokens only from the token endpoint.</t>
        <section anchor="attacks-on-the-implicit-flow">
          <name>Attacks on the Implicit Flow</name>
          <t>Many attacks on the Implicit flow described by <xref target="RFC6819"/> and Section 4.1.2 of <xref target="oauth-security-topics"/>
do not have sufficient mitigation strategies. The following sections describe the specific
attacks that cannot be mitigated while continuing to use the Implicit flow.</t>
          <section anchor="threat-manipulation-of-the-redirect-uri">
            <name>Threat: Manipulation of the Redirect URI</name>
            <t>If an attacker is able to cause the authorization response to be sent to a URI under
their control, they will directly get access to the authorization response including the access token.
Several methods of performing this attack are described in detail in <xref target="oauth-security-topics"/>.</t>
          </section>
          <section anchor="threat-access-token-leak-in-browser-history">
            <name>Threat: Access Token Leak in Browser History</name>
            <t>An attacker could obtain the access token from the browser's history.
The countermeasures recommended by <xref target="RFC6819"/> are limited to using short expiration
times for tokens, and indicating that browsers should not cache the response.
Neither of these fully prevent this attack, they only reduce the potential damage.</t>
            <t>Additionally, many browsers now also sync browser history to cloud services and to
multiple devices, providing an even wider attack surface to extract access tokens
out of the URL.</t>
            <t>This is discussed in more detail in Section 4.3.2 of <xref target="oauth-security-topics"/>.</t>
          </section>
          <section anchor="threat-manipulation-of-scripts">
            <name>Threat: Manipulation of Scripts</name>
            <t>An attacker could modify the page or inject scripts into the browser through various
means, including when the browser's HTTPS connection is being intercepted by, for
example, a corporate network. While man-in-the-middle attacks are typically out of scope
of basic security recommendations to prevent, in the case of browser-based apps they are
much easier to perform. An injected script can enable an attacker to have access to everything
on the page.</t>
            <t>The risk of a malicious script running on the page may be amplified when the application
uses a known standard way of obtaining access tokens, namely that the attacker can
always look at the <tt>window.location</tt> variable to find an access token. This threat profile
is different from an attacker specifically targeting an individual application
by knowing where or how an access token obtained via the Authorization Code flow may
end up being stored.</t>
          </section>
          <section anchor="threat-access-token-leak-to-third-party-scripts">
            <name>Threat: Access Token Leak to Third-Party Scripts</name>
            <t>It is relatively common to use third-party scripts in browser-based apps, such as
analytics tools, crash reporting, and even things like a Facebook or Twitter "like" button.
In these situations, the author of the application may not be able to be fully aware
of the entirety of the code running in the application. When an access token is
returned in the fragment, it is visible to any third-party scripts on the page.</t>
          </section>
        </section>
        <section anchor="countermeasures">
          <name>Countermeasures</name>
          <t>In addition to the countermeasures described by <xref target="RFC6819"/> and <xref target="oauth-security-topics"/>,
using the Authorization Code flow with PKCE extension prevents the attacks described above by
avoiding returning the access token in the redirect response at all.</t>
          <t>When PKCE is used, if an authorization code is stolen in transport, the attacker is
unable to do anything with the authorization code.</t>
        </section>
        <section anchor="disadvantages-of-the-implicit-flow">
          <name>Disadvantages of the Implicit Flow</name>
          <t>There are several additional reasons the Implicit flow is disadvantageous compared to
using the standard Authorization Code flow.</t>
          <ul spacing="normal">
            <li>OAuth 2.0 provides no mechanism for a client to verify that a particular access token was
intended for that client, which could lead to misuse and possible impersonation attacks if
a malicious party hands off an access token it retrieved through some other means
to the client.</li>
            <li>Returning an access token in the front-channel redirect gives the authorization
server no assurance that the access token will actually end up at the
application, since there are many ways this redirect may fail or be intercepted.</li>
            <li>Supporting the Implicit flow requires additional code, more upkeep and
understanding of the related security considerations, while limiting the
authorization server to just the Authorization Code flow reduces the attack surface
of the implementation.</li>
            <li>If the JavaScript application gets wrapped into a native app, then <xref target="RFC8252"/>
also requires the use of the Authorization Code flow with PKCE anyway.</li>
          </ul>
          <t>In OpenID Connect, the ID Token is sent in a known format (as a JWT), and digitally
signed. Returning an ID token using the Implicit flow (<tt>response_type=id_token</tt>) requires the client
validate the JWT signature, as malicious parties could otherwise craft and supply
fraudulent ID tokens. Performing OpenID Connect using the Authorization Code flow provides
the benefit of the client not needing to verify the JWT signature, as the ID token will
have been fetched over an HTTPS connection directly from the authorization server. Additionally,
in many cases an application will request both an ID token and an access token, so it is
simplier and provides fewer attack vectors to obtain both via the Authorization Code flow.</t>
        </section>
        <section anchor="historic-note">
          <name>Historic Note</name>
          <t>Historically, the Implicit flow provided an advantage to browser-based apps since
JavaScript could always arbitrarily read and manipulate the fragment portion of the
URL without triggering a page reload. This was necessary in order to remove the
access token from the URL after it was obtained by the app.</t>
          <t>Modern browsers now have the Session History API (described in "Session history and
navigation" of <xref target="HTML"/>), which provides a mechanism to modify the path and query string
component of the URL without triggering a page reload. This means modern browser-based apps can
use the unmodified OAuth 2.0 Authorization Code flow, since they have the ability to
remove the authorization code from the query string without triggering a page reload
thanks to the Session History API.</t>
        </section>
      </section>
      <section anchor="additional-security-considerations">
        <name>Additional Security Considerations</name>
        <t>The OWASP Foundation (https://www.owasp.org/) maintains a set of security
recommendations and best practices for web applications, and it is RECOMMENDED
to follow these best practices when creating an OAuth 2.0 Browser-Based application.</t>
      </section>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document does not require any IANA actions.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
          <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="RFC6749" target="https://www.rfc-editor.org/info/rfc6749" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6749.xml">
          <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="RFC6750" target="https://www.rfc-editor.org/info/rfc6750" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6750.xml">
          <front>
            <title>The OAuth 2.0 Authorization Framework: Bearer Token Usage</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="D. Hardt" initials="D." surname="Hardt"/>
            <date month="October" year="2012"/>
            <abstract>
              <t>This specification describes how to use bearer tokens in HTTP requests to access OAuth 2.0 protected resources.  Any party in possession of a bearer token (a "bearer") can use it to get access to the associated resources (without demonstrating possession of a cryptographic key).  To prevent misuse, bearer tokens need to be protected from disclosure in storage and in transport. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6750"/>
          <seriesInfo name="DOI" value="10.17487/RFC6750"/>
        </reference>
        <reference anchor="RFC6819" target="https://www.rfc-editor.org/info/rfc6819" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6819.xml">
          <front>
            <title>OAuth 2.0 Threat Model and Security Considerations</title>
            <author fullname="T. Lodderstedt" initials="T." role="editor" surname="Lodderstedt"/>
            <author fullname="M. McGloin" initials="M." surname="McGloin"/>
            <author fullname="P. Hunt" initials="P." surname="Hunt"/>
            <date month="January" year="2013"/>
            <abstract>
              <t>This document gives additional security considerations for OAuth, beyond those in the OAuth 2.0 specification, based on a comprehensive threat model for the OAuth 2.0 protocol.  This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6819"/>
          <seriesInfo name="DOI" value="10.17487/RFC6819"/>
        </reference>
        <reference anchor="RFC7636" target="https://www.rfc-editor.org/info/rfc7636" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7636.xml">
          <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="RFC8252" target="https://www.rfc-editor.org/info/rfc8252" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8252.xml">
          <front>
            <title>OAuth 2.0 for Native Apps</title>
            <author fullname="W. Denniss" initials="W." surname="Denniss"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <date month="October" year="2017"/>
            <abstract>
              <t>OAuth 2.0 authorization requests from native apps should only be made through external user-agents, primarily the user's browser.  This specification details the security and usability reasons why this is the case and how native apps and authorization servers can implement this best practice.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="212"/>
          <seriesInfo name="RFC" value="8252"/>
          <seriesInfo name="DOI" value="10.17487/RFC8252"/>
        </reference>
        <reference anchor="draft-ietf-httpbis-rfc6265bis">
          <front>
            <title>Cookies: HTTP State Management Mechanism</title>
            <author initials="L." surname="Chen" fullname="L. Chen">
              <organization>Google LLC</organization>
            </author>
            <author initials="S." surname="Englehardt" fullname="S. Englehardt">
              <organization>Mozilla</organization>
            </author>
            <author initials="M." surname="West" fullname="M. West">
              <organization>Google LLC</organization>
            </author>
            <author initials="J." surname="Wilander" fullname="J. Wilander">
              <organization>Apple, Inc</organization>
            </author>
            <date year="2021" month="October"/>
          </front>
        </reference>
        <reference anchor="CSP2">
          <front>
            <title>Content Security Policy</title>
            <author initials="M." surname="West" fullname="Mike West">
              <organization>Google, Inc</organization>
            </author>
            <date year="2018" month="October"/>
          </front>
        </reference>
        <reference anchor="Fetch">
          <front>
            <title>Fetch</title>
            <author initials="" surname="whatwg" fullname="whatwg">
              <organization/>
            </author>
            <date year="2018"/>
          </front>
        </reference>
        <reference anchor="oauth-security-topics">
          <front>
            <title>OAuth 2.0 Security Best Current Practice</title>
            <author initials="T." surname="Lodderstedt" fullname="Torsten Lodderstedt">
              <organization>yes.com</organization>
            </author>
            <author initials="J." surname="Bradley" fullname="John Bradley">
              <organization>Yubico</organization>
            </author>
            <author initials="A." surname="Labunets" fullname="Andrey Labunets">
              <organization>Facebook</organization>
            </author>
            <author initials="D." surname="Fett" fullname="Daniel Fett">
              <organization>yes.com</organization>
            </author>
            <date year="2021" month="April"/>
          </front>
        </reference>
        <reference anchor="oauth-iss-auth-resp">
          <front>
            <title>OAuth 2.0 Authorization Server Issuer Identifier in Authorization Response</title>
            <author initials="K." surname="Meyer zu Selhausen" fullname="Karsten Meyer zu Selhausen">
              <organization>Hackmanit</organization>
            </author>
            <author initials="D." surname="Fett" fullname="Daniel Fett">
              <organization>yes.com</organization>
            </author>
            <date year="2021" month="January"/>
          </front>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="HTML">
          <front>
            <title>HTML</title>
            <author initials="" surname="whatwg" fullname="whatwg">
              <organization/>
            </author>
            <date year="2020"/>
          </front>
        </reference>
      </references>
    </references>
    <section anchor="server-support-checklist">
      <name>Server Support Checklist</name>
      <t>OAuth authorization servers that support browser-based apps MUST:</t>
      <ol spacing="normal" type="1"><li>Require "https" scheme redirect URIs.</li>
        <li>Require exact matching of registered redirect URIs.</li>
        <li>Support PKCE <xref target="RFC7636"/>. Required to protect authorization code
grants sent to public clients. See <xref target="auth_code_request"/></li>
        <li>Support cross-domain requests at the token endpoint in order to allow browsers
to make the authorization code exchange request. See <xref target="cors"/></li>
        <li>Not assume that browser-based clients can keep a secret, and SHOULD NOT issue
secrets to applications of this type.</li>
        <li>Not support the Resource Owner Password grant for browser-based clients.</li>
        <li>Follow the <xref target="oauth-security-topics"/> recommendations on refresh tokens, as well
as the additional requirements described in <xref target="refresh_tokens"/>.</li>
      </ol>
    </section>
    <section anchor="document-history">
      <name>Document History</name>
      <t>[[ To be removed from the final specification ]]</t>
      <t>-10</t>
      <ul spacing="normal">
        <li>Revised the names of the architectural patterns</li>
        <li>Added a new pattern using a service worker as the OAuth client to manage tokens</li>
        <li>Added some considerations when storing tokens in Local or Session Storage</li>
      </ul>
      <t>-09</t>
      <ul spacing="normal">
        <li>Provide additional context for the same-domain architecture pattern</li>
        <li>Added reference to draft-ietf-httpbis-rfc6265bis to clarify that SameSite is not the only CSRF protection measure needed</li>
        <li>Editorial improvements</li>
      </ul>
      <t>-08</t>
      <ul spacing="normal">
        <li>Added a note to use the "Secure" cookie attribute in addition to SameSite etc</li>
        <li>Updates to bring this draft in sync with the latest Security BCP</li>
        <li>Updated text for mix-up countermeasures to reference the new "iss" extension</li>
        <li>Changed "SHOULD" for refresh token rotation to MUST either use rotation or sender-constraining to match the Security BCP</li>
        <li>Fixed references to other specs and extensions</li>
        <li>Editorial improvements in descriptions of the different architectures</li>
      </ul>
      <t>-07</t>
      <ul spacing="normal">
        <li>Clarify PKCE requirements apply only to issuing access tokens</li>
        <li>Change "MUST" to "SHOULD" for refresh token rotation</li>
        <li>Editorial clarifications</li>
      </ul>
      <t>-06</t>
      <ul spacing="normal">
        <li>Added refresh token requirements to AS summary</li>
        <li>Editorial clarifications</li>
      </ul>
      <t>-05</t>
      <ul spacing="normal">
        <li>Incorporated editorial and substantive feedback from Mike Jones</li>
        <li>Added references to "nonce" as another way to prevent CSRF attacks</li>
        <li>Updated headers in the Implicit Flow section to better represent the relationship between the paragraphs</li>
      </ul>
      <t>-04</t>
      <ul spacing="normal">
        <li>Disallow the use of the Password Grant</li>
        <li>Add PKCE support to summary list for authorization server requirements</li>
        <li>Rewrote refresh token section to allow refresh tokens if they are time-limited, rotated on each use, and requiring that the rotated refresh token lifetimes do not extend past the lifetime of the initial refresh token, and to bring it in line with the Security BCP</li>
        <li>Updated recommendations on using state to reflect the Security BCP</li>
        <li>Updated server support checklist to reflect latest changes</li>
        <li>Updated the same-domain JS architecture section to emphasize the architecture rather than domain</li>
        <li>Editorial clarifications in the section that talks about OpenID Connect ID tokens</li>
      </ul>
      <t>-03</t>
      <ul spacing="normal">
        <li>Updated the historic note about the fragment URL clarifying that the Session History API means browsers can use the unmodified authorization code flow</li>
        <li>Rephrased "Authorization Code Flow" intro paragraph to better lead into the next two sections</li>
        <li>Softened "is likely a better decision to avoid using OAuth entirely" to "it may be..." for common-domain deployments</li>
        <li>Updated abstract to not be limited to public clients, since the later sections talk about confidential clients</li>
        <li>Removed references to avoiding OpenID Connect for same-domain architectures</li>
        <li>Updated headers to better describe architectures (Apps Served from a Static Web Server -&gt; JavaScript Applications without a Backend)</li>
        <li>Expanded "same-domain architecture" section to better explain the problems that OAuth has in this scenario</li>
        <li>Referenced Security BCP in implicit flow attacks where possible</li>
        <li>Minor typo corrections</li>
      </ul>
      <t>-02</t>
      <ul spacing="normal">
        <li>Rewrote overview section incorporating feedback from Leo Tohill</li>
        <li>Updated summary recommendation bullet points to split out application and server requirements</li>
        <li>Removed the allowance on hostname-only redirect URI matching, now requiring exact redirect URI matching</li>
        <li>Updated Section 6.2 to drop reference of SPA with a backend component being a public client</li>
        <li>Expanded the architecture section to explicitly mention three architectural patterns available to JS apps</li>
      </ul>
      <t>-01</t>
      <ul spacing="normal">
        <li>Incorporated feedback from Torsten Lodderstedt</li>
        <li>Updated abstract</li>
        <li>Clarified the definition of browser-based apps to not exclude applications cached in the browser, e.g. via Service Workers</li>
        <li>Clarified use of the state parameter for CSRF protection</li>
        <li>Added background information about the original reason the implicit flow was created due to lack of CORS support</li>
        <li>Clarified the same-domain use case where the SPA and API share a cookie domain</li>
        <li>Moved historic note about the fragment URL into the Overview</li>
      </ul>
    </section>
    <section anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>The authors would like to acknowledge the work of William Denniss and John Bradley,
whose recommendation for native apps informed many of the best practices for
browser-based applications. The authors would also like to thank Hannes Tschofenig
and Torsten Lodderstedt, the attendees of the Internet Identity Workshop 27
session at which this BCP was originally proposed, and the following individuals
who contributed ideas, feedback, and wording that shaped and formed the final specification:</t>
      <t>Annabelle Backman, Brian Campbell, Brock Allen, Christian Mainka, Daniel Fett,
George Fletcher, Hannes Tschofenig, Janak Amarasena, John Bradley, Joseph Heenan,
Justin Richer, Karl McGuinness, Karsten Meyer zu Selhausen, Leo Tohill, Mike Jones,
Tomek Stojecki, Torsten Lodderstedt, Vittorio Bertocci and Yannick Majoros.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
x3n6r7qpnbF6UW4WC/U/1DJrHq2vAAA=

-->

</rfc>
