<?xml version='1.0' encoding='UTF-8'?>

<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>

<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-scim-cursor-pagination-11" number="9865" category="std" consensus="true" submissionType="IETF" updates="7643, 7644" obsoletes="" xml:lang="en" tocInclude="true" sortRefs="true" symRefs="true" version="3">

  <front>
    <title abbrev="SCIM Cursor Pagination">Cursor-Based Pagination of System of Cross-domain Identity Management (SCIM) Resources</title>
    <seriesInfo name="RFC" value="9865"/>
    <author initials="M." surname="Peterson" fullname="Matt Peterson" role="editor">
      <organization>Entrust</organization>
      <address>
        <email>matt.peterson@entrust.com</email>
      </address>
    </author>
    <author initials="D." surname="Zollner" fullname="Danny Zollner">
      <organization>Independent</organization>
      <address>
        <email>danny@zollnerd.com</email>
      </address>
    </author>
    <author initials="A." surname="Sehgal" fullname="Anjali Sehgal">
      <organization>Amazon Web Services</organization>
      <address>
        <email>anjalisg@amazon.com</email>
      </address>
    </author>
    <date year="2025" month="October"/>
    <area>SEC</area>
    <workgroup>scim</workgroup>

    <abstract>
<t>This document updates RFCs 7643 and 7644 by defining additional System for Cross-Domain Identity Management (SCIM) query parameters and result attributes to allow use of cursor-based pagination in SCIM
service providers that are implemented with existing codebases, databases, or APIs where cursor-based pagination is already well established.</t>
    </abstract>

  </front>
  <middle>


    <section anchor="introduction">
      <name>Introduction</name>
      <t>The two common patterns for result pagination are index-based pagination
and cursor-based pagination.  Rather than
attempt to compare and contrast the advantages and disadvantages of
competing pagination patterns, this document simply recognizes that
System for Cross-Domain Identity Management (SCIM) service providers are commonly implemented as an
interoperability layer on top of already existing application
codebases, databases, and/or APIs that already have a well established pagination pattern.</t>
      <t>Translating from an underlying cursor-based pagination pattern to the
index-based pagination defined in <xref target="RFC7644" section="3.4.2.4"/>
ultimately requires the SCIM service provider to fully iterate the
underlying cursor, store the results, and then serve indexed pages
from the stored results.  This task of "pagination translation"
increases complexity and memory requirements for
implementing a SCIM service provider, and may be an impediment to
SCIM adoption for some applications and identity systems.</t>
      <t>This document defines a simple addition to the SCIM protocol that
allows SCIM service providers to reuse underlying cursors without
expensive translation.  Support for cursor-based pagination in SCIM
encourages broader cross-application identity management
interoperability by encouraging SCIM service provider implementations
for applications and identity systems where cursor-based pagination
is already well established.</t>
      <t>This document updates RFCs 7643 and 7644 because it adds attributes to
existing structures from those documents, as described in <xref target="section2"/>. These changes are invoked when using the "cursor" parameter when making SCIM search requests using GET or POST methods.</t>
      <section anchor="notational-conventions">
        <name>Notational Conventions</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&nbsp;14 <xref target="RFC2119"/> <xref
    target="RFC8174"/> when, and only when, they appear in all capitals, as
    shown here.
        </t>
      </section>
      <section anchor="definitions">
        <name>Definitions</name>
        <t>This document uses the terms defined in <xref target="RFC7643" section="1.2"/>.</t>
      </section>
    </section>
    <section anchor="section2">
      <name>Query Parameters and Response Attributes</name>
      <t>The following table describes the URL pagination query parameters for requesting cursor-based pagination:</t>
      <table>
        <name>Query Parameters</name>
        <thead>
          <tr>
            <th align="left">Parameter</th>
            <th align="left">Description</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">
              <tt>cursor</tt></td>
            <td align="left">The string value of the nextCursor attribute from a previous result page. The cursor value <bcp14>MUST</bcp14> be empty or omitted for the first request of a cursor-paginated query. This value may only contain characters from the unreserved character set defined in <xref target="RFC3986" section="2.3"/>.</td>
          </tr>
          <tr>
            <td align="left">
              <tt>count</tt></td>
            <td align="left">Specifies the desired maximum number of query results per page, e.g., 10.  A negative value <bcp14>SHALL</bcp14> be interpreted as "0".  A value of "0" indicates that no resource results are to be returned except for "totalResults". When specified, the service provider <bcp14>MUST NOT</bcp14> return more, although it <bcp14>MAY</bcp14> return fewer, results. If unspecified, the maximum number returned is set by the service provider.</td>
          </tr>
        </tbody>
      </table>
      <t>The following table describes cursor-based pagination attributes returned in a paged query response:</t>
      <table>
        <name>Response Attributes</name>
        <thead>
          <tr>
            <th align="left">Element</th>
            <th align="left">Description</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">
              <tt>nextCursor</tt></td>
            <td align="left">A cursor value string that <bcp14>MAY</bcp14> be used in a subsequent request to obtain the next page of results. Service providers supporting cursor-based pagination <bcp14>MUST</bcp14> include <tt>nextCursor</tt> in all paged query responses except when returning the last page. <tt>nextCursor</tt> <bcp14>MUST</bcp14> be omitted from a response only to indicate that there are no more result pages.</td>
          </tr>
          <tr>
            <td align="left">
              <tt>previousCursor</tt></td>
            <td align="left">A cursor value string that <bcp14>MAY</bcp14> be used in a subsequent request to obtain the previous page of results. Returning <tt>previousCursor</tt> is <bcp14>OPTIONAL</bcp14>.  <tt>previousCursor</tt> <bcp14>MUST NOT</bcp14> be returned with the first page.</td>
          </tr>
        </tbody>
      </table>
      <t>Cursor values are URL-safe strings that are opaque to the client.
To retrieve another result page for a query, the client <bcp14>MUST</bcp14> query the same service
provider endpoint with all query parameters and values being
identical to the initial query with the exception of the <tt>cursor</tt> value,
which <bcp14>SHOULD</bcp14> be set to a <tt>nextCursor</tt> (or <tt>previousCursor</tt>) value that
was returned by the service provider in a previous response.</t>
      <t>For example, to retrieve the first 10 users with <tt>userName</tt> starting
with <tt>J</tt>, use an empty cursor and set the count to 10:</t>
      <sourcecode type=""><![CDATA[
GET /Users?filter=userName%20sw%20J&cursor&count=10
Host: example.com
Accept: application/scim+json
Authorization: Bearer U8YJcYYRMjbGeepD]]></sourcecode>
      <t>The SCIM service provider in response to the query above returns metadata regarding pagination similar
to the following example (Resources omitted for brevity):</t>
      <sourcecode type=""><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/scim+json

{
   "totalResults":100,
   "itemsPerPage":10,
   "nextCursor":"VZUTiyhEQJ94IR",
   "schemas":["urn:ietf:params:scim:api:messages:2.0:ListResponse"],
   "Resources":[{
      ...
   }]
}]]></sourcecode>
      <t>Given the example above, to request the next page of results, use the
same query parameters and values except set the cursor to the value
of <tt>nextCursor</tt> (<tt>VZUTiyhEQJ94IR</tt>):</t>
      <sourcecode type=""><![CDATA[
GET /Users?filter=username%20sw%20J&cursor=VZUTiyhEQJ94IR&count=10
Host: example.com
Accept: application/scim+json
Authorization: Bearer U8YJcYYRMjbGeepD]]></sourcecode>

      <t>The service provider responds with:</t>
      <sourcecode type=""><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/scim+json

{
   "totalResults": 100,
   "itemsPerPage": 10,
   "previousCursor: "ze7L30kMiiLX6x",
   "nextCursor": "YkU3OF86Pz0rGv",
   "schemas": ["urn:ietf:params:scim:api:messages:2.0:ListResponse"],
   "Resources":[{
      ...
   }]
}]]></sourcecode>
      <t>In the example above, the response includes the optional
previousCursor indicating that the service provider supports forward
and reverse traversal of result pages.</t>
      <t>As described in <xref target="RFC7644" section="3.4.1"/>, service providers should
return an accurate value for totalResults, which is the total number
of resources for all pages.  Service providers implementing cursor
pagination that are unable to estimate totalResults <bcp14>MAY</bcp14> choose to omit the totalResults attribute.</t>
      <section anchor="section2.1">
        <name>Pagination Errors</name>
        <t>If a service provider encounters invalid pagination query
parameters (invalid cursor value, count value, etc) or other error
conditions, the service provider <bcp14>SHOULD</bcp14> return the appropriate HTTP
response status code and detailed JSON error response as defined in
<xref target="RFC7644" section="3.12"/>.</t>
        <t>For HTTP status code 400 (Bad Request) responses, the following detail error types are defined. These error types extend the list defined in Table 9 ("SCIM Detail Error Keyword Values") of <xref target="RFC7644" section="3.12"/></t>
        <table>
          <name>Pagination Errors</name>
          <thead>
            <tr>
              <th align="left">scimType</th>
              <th align="left">Description</th>
              <th align="left">Applicability</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>invalidCursor</tt></td>
              <td align="left">Cursor value is invalid. Cursor value <bcp14>SHOULD</bcp14> be empty to request the first page and set to the <tt>nextCursor</tt> or <tt>previousCursor</tt> value for subsequent queries.</td>
              <td align="left">
                <tt>GET</tt> (<xref target="RFC7644" section="3.4.2"/>)</td>
            </tr>
            <tr>
              <td align="left">
                <tt>expiredCursor</tt></td>
              <td align="left">Cursor has expired. Do not wait longer than service provider's <tt>cursorTimeout</tt> to request additional pages.</td>
              <td align="left">
                <tt>GET</tt> (<xref target="RFC7644" section="3.4.2"/>)</td>
            </tr>
            <tr>
              <td align="left">
                <tt>invalidCount</tt></td>
              <td align="left">Count value is invalid. Count value must be between 0 and service provider's maxPageSize and must be equal to the count value of the initial query.</td>
              <td align="left">
                <tt>GET</tt> (<xref target="RFC7644" section="3.4.2"/>)</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="sorting">
        <name>Sorting</name>
        <t>If sorting is implemented as described <xref target="RFC7644" section="3.4.2.3"/>,
then cursor-paged results should be sorted.</t>
      </section>
      <section anchor="implementing-cursors-as-the-only-pagination-method">
        <name>Implementing Cursors as the Only Pagination Method</name>
        <t>A service provider <bcp14>MAY</bcp14> require cursor-based pagination to
retrieve all results for a query by including a <tt>nextCursor</tt> value in
the response, even when the query does not include the <tt>cursor</tt>
parameter.</t>
        <t>For example:</t>
        <sourcecode type=""><![CDATA[
GET /Users
Host: example.com
Accept: application/scim+json]]></sourcecode>

        <t>The service provider may respond to the above query with a page
containing defaultPageSize results and a <tt>nextCursor</tt> value as shown
in the below example (Resources omitted for brevity):</t>
        <sourcecode type=""><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/scim+json

{
   "totalResults": 5000,
   "itemsPerPage": 100,
   "nextCursor": "HPq72Pax3JUaNa",
   "schemas": ["urn:ietf:params:scim:api:messages:2.0:ListResponse"],
   "Resources": [{
      ...
   }]
}]]></sourcecode>
      </section>
      <section anchor="implementing-both-cursors-and-index-pagination">
        <name>Implementing Both Cursors and Index Pagination</name>
        <t>When a service provider supports both index-based and cursor-based pagination, clients can use the 'startIndex' or 'cursor' query parameters to request a specific method.  Additionally, service providers supporting both pagination methods <bcp14>MUST</bcp14> choose a default pagination method to use when responding to requests that have not specified a pagination query parameter.</t>
        <t>Implementers of SCIM service providers that previously supported only index-based pagination and are adding support for cursor-based pagination should use index as the default pagination method to avoid incompatibility with clients that expect index-based pagination behaviors when no pagination query parameters are specified.</t>
        <t>SCIM clients can query the <xref target="section4">Service Provider Configuration</xref> endpoint to determine if index-based, cursor-based, or both types of pagination are supported and which of these is the default.</t>
      </section>
    </section>
    <section anchor="querying-resources-using-http-post">
      <name>Querying Resources Using HTTP POST</name>
      <t><xref target="RFC7644" section="3.4.3"/> defines how clients may execute queries without passing parameters on the URL by using the <tt>POST</tt> verb combined with the <tt>/.search</tt> path extension execute. When posting to <tt>/.search</tt>, the client would pass the parameters defined in <xref target="section2"/> in the body of the POST request. For example:</t>

      <sourcecode type=""><![CDATA[
POST /User/.search
Host: example.com
Accept: application/scim+json
Authorization: Bearer U8YJcYYRMjbGeepD

{
   "schemas": [
     "urn:ietf:params:scim:api:messages:2.0:SearchRequest"],
   "attributes": ["displayName", "userName"],
   "filter": "displayName sw \"smith\"",
   "cursor": "",
   "count": 10
}]]></sourcecode>

      <t>Which would return a result containing a <tt>nextCursor</tt> value that may
be used by the client in a subsequent call to return the next page of
resources:</t>

      <sourcecode type=""><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/scim+json

{
   "totalResults": 100,
   "itemsPerPage": 10,
   "nextCursor": "VZUTiyhEQJ94IR",
   "schemas": ["urn:ietf:params:scim:api:messages:2.0:ListResponse"],
   "Resources": [{
      ...
   }]
}]]></sourcecode>
    </section>
    <section anchor="section4">
      <name>Service Provider Configuration</name>
      <t>The <tt>/ServiceProviderConfig</tt> resource defined in <xref target="RFC7644" section="4"/>
facilitates discovery of SCIM service provider features.  A SCIM
service provider implementing cursor-based pagination <bcp14>SHOULD</bcp14> include
the following additional attribute in a JSON document returned by the
<tt>/ServiceProviderConfig</tt> endpoint:</t>
      <dl spacing="normal" newline="false">
        <dt>pagination</dt>
        <dd>A complex type that indicates pagination configuration options. <bcp14>OPTIONAL</bcp14>.</dd>
      </dl>
      
      <t>The following sub-attributes are defined:</t>
          <dl spacing="normal" newline="false">
            <dt>cursor</dt>
            <dd>
              <t>A Boolean value specifying support of cursor-based pagination. <bcp14>REQUIRED</bcp14>.</t>
            </dd>
            <dt>index</dt>
            <dd>
              <t>A Boolean value specifying support of index-based pagination. <bcp14>REQUIRED</bcp14>.</t>
            </dd>
            <dt>defaultPaginationMethod</dt>
            <dd>
              <t>A string value specifying the type of pagination that the service provider defaults to when the client has not specified which method it wishes to use. Possible values are "cursor" and "index".  <bcp14>OPTIONAL</bcp14>.</t>
            </dd>
            <dt>defaultPageSize</dt>
            <dd>
              <t>Positive integer value specifying the default number of results returned in a page when a count is not specified in the query. <bcp14>OPTIONAL</bcp14>.</t>
            </dd>
            <dt>maxPageSize</dt>
            <dd>
              <t>Positive integer specifying the maximum number of results returned in a page regardless of what is specified for the count in a query. The maximum number of results returned may be further restricted by other criteria. <bcp14>OPTIONAL</bcp14>.</t>
            </dd>
            <dt>cursorTimeout</dt>
            <dd>
              <t>Positive integer specifying the minimum number of seconds that a cursor is valid between page requests. Clients waiting too long between cursor pagination requests may receive an invalid cursor error response. No value being specified may mean that there is no cursor timeout or that the cursor timeout is not a static duration.  <bcp14>OPTIONAL</bcp14>.</t>
            </dd>
          </dl>

      <t>Service providers may choose not to advertise Service Provider Configuration information regarding default pagination method, page size, or cursor validity. Clients <bcp14>MUST NOT</bcp14> interpret the lack of published Service Provider Configuration values to mean that no defaults or limits on page sizes or cursor lifetimes exist, or that there is no default pagination method. Service providers may choose not to publish values for the pagination sub-attributes for many reasons. Examples include:</t>
      <ul spacing="normal">
        <li>
          <t>Service providers containing multiple resource types may have different values set for each resource type.</t>
        </li>
        <li>
          <t>Default and maximum page size may be determined by factors besides or in addition to the number of resources returned, such as the size of each resource on the page.</t>
        </li>
      </ul>
      <t>Before using cursor-based pagination, a SCIM client <bcp14>MAY</bcp14> fetch the
Service Provider Configuration document from the SCIM service
provider and verify that cursor-based pagination is supported.</t>
      <t>For example:</t>
      <sourcecode type=""><![CDATA[
GET /ServiceProviderConfig
Host: example.com
Accept: application/scim+json]]></sourcecode>

      <t>A service provider supporting both cursor-based pagination and index-
based pagination would return a document similar to the following
(full <tt>ServiceProviderConfig</tt> schema defined in <xref target="RFC7643" section="5"/>
has been omitted for brevity):</t>

      <sourcecode type=""><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/scim+json

{
   "schemas": [
      "urn:ietf:params:scim:schemas:core:2.0:ServiceProviderConfig"],
      ...

   "pagination": {
      "cursor": true,
      "index": true,
      "defaultPaginationMethod": "cursor",
      "defaultPageSize": 100,
      "maxPageSize": 250,
      "cursorTimeout": 3600
   },

   ...
}]]></sourcecode>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>This section elaborates on the security considerations associated with the implementation of cursor pagination in SCIM. This document is under the same security and privacy considerations of those described in <xref target="RFC7644"/>. It is imperative that implementers additionally consider the following security aspects to safeguard against both deliberate attacks and inadvertent misuse that may compromise the system's security posture.</t>
      <section anchor="threat-model-and-security-environment">
        <name>Threat Model and Security Environment</name>
        <t>The threat landscape is characterized by two primary types of actors:</t>
        <ol spacing="normal" type="1"><li>
            <t>Unauthenticated and Authenticated Malicious Actors: These individuals or entities represent a malevolent threat. Their objectives include unauthorized access to data, alteration, or deletion through cursor-enabled queries. They may also seek to deplete service provider resources deliberately, aiming to cause a denial-of-service state, thereby reducing service availability.</t>
          </li>
          <li>
            <t>Authenticated Benign Users: This category includes legitimate users who, due to confusion or a lack of understanding, inadvertently engage in actions that consume service-provider resources excessively. Such actions, while not ill intended, can lead to unintended denial of service by overwhelming the service provider's capacity.</t>
          </li>
        </ol>
      </section>
      <section anchor="confidentiality">
        <name>Confidentiality</name>
        <t>To ensure that confidential data remains appropriately secured:</t>
        <ul spacing="normal">
          <li>
            <t>Implementers <bcp14>MUST</bcp14> ensure that pagination through results sets is strictly confined to the data that the actor's current identity has been authorized to access. This holds true even in cases where the actor has obtained a cursor pertaining to a result set that was generated by a different actor.</t>
          </li>
          <li>
            <t>Authorization checks <bcp14>MUST</bcp14> be continuously applied as an actor navigates through the result set associated with a cursor. Under no circumstances should possession of a cursor be interpreted as granting any supplementary access privileges to the actor.</t>
          </li>
          <li>
            <t>When possible, service providers <bcp14>SHOULD</bcp14> invalidate all cursors corresponding to an actor immediately following a change in permissions. This ensures that any queries executed post-permission change, utilizing old cursors, will be denied. As an alternative approach, service providers may opt to retain the existing cursors but must ensure that any metadata tied to the result set, such as record counts, is updated to reflect the new permissions accurately.</t>
          </li>
          <li>
            <t>In alignment with <xref target="section2"/>, cursor values are URL-safe strings that are opaque to clients.  Service providers should obfuscate cursors
values to prevent clients from interpreting cursors or forging new cursors.  Service providers should be able to easily detect forged cursor values and immediately return an <tt>invalidCursor</tt> as described in <xref target="section2.1"/>.</t>
          </li>
          <li>
            <t>The service provider <bcp14>MUST</bcp14> handle error scenarios without exposing sensitive data. For instance, if an actor attempts to access a page of results outside their authorized scope, or if a request is made for a non-existent page, the service provider should respond with identical error messages, so as not to disclose any details of the underlying data or the nature of the authorization failure. It is acceptable, however, for the service provider to log different messages to a log accessible by administrators or other authorized personnel.</t>
          </li>
        </ul>
      </section>
      <section anchor="availability">
        <name>Availability</name>
        <t>The concern for availability primarily stems from the potential for Denial-of-Service (DoS) attacks. If the service provider elects to retain substantial data or metadata for each cursor, numerous initial queries that allocate cursors could strain and eventually exhaust service-provider resources. Such an attack could be orchestrated by an attacker with malicious intent or could occur unintentionally as a result of client testing or bugs.</t>
        <t>To mitigate risks, the following strategies are recommended for service providers:</t>
        <ul spacing="normal">
          <li>
            <t>Clients should authenticate to retrieve large result sets.  Anonymous queries yielding numerous results may return an HTTP status code 400 (Bad Request) with the error type "tooMany," as outlined in <xref target="RFC7644" section="3.12"/>.</t>
          </li>
          <li>
            <t>Implement rate limiting to control the volume and cadence of cursor requests. This approach should adhere to established standards for rate limiting; details can be found in <xref target="RFC6585"/>.</t>
          </li>
          <li>
            <t>Allow administrator of the service provider to set a ceiling on the number of cursors permissible at any given time or to specify a maxPageSize value. Guidance on configuring such values should be documented in the implementation administrator/installation guide.</t>
          </li>
          <li>
            <t>Cursor invalidation mechanisms (including mechanisms triggered by permissions changes) must be designed to be resource-efficient to prevent them from being exploited for DoS attacks.</t>
          </li>
        </ul>
      </section>
      <section anchor="other-security-references">
        <name>Other Security References</name>
        <t>Using URIs to describe and locate resources has its own set of security considerations, as discussed in <xref target="RFC3986" section="7"/>.  Implementations should also refer to <xref target="BCP195"/> and <xref target="RFC9110"/> for additional security considerations that are relevant for underlying TLS and HTTP protocols.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>IANA has amended the "System for Cross-domain Identity Management (SCIM) Schema URIs" registry group established by <xref target="RFC7643"/> as described below.</t>
<t>IANA has updated the "SCIM Schema URIs for Data Resources" registry as follows:</t>
<ul>
      <li><t>For the <tt>urn:ietf:params:scim:api:messages:2.0:ListResponse</tt>, <xref target="section2"/> of this document has been added to the References column.</t></li>
      <li><t>For the <tt>urn:ietf:params:scim:api:messages:2.0:SearchRequest</tt>, <xref target="section2"/> of this document has been added to the References column.</t></li>
</ul>
<t>IANA has updated the "SCIM Server-Related Schema URIs" registry as follows: </t>
<ul>
      <li><t>For the <tt>urn:ietf:params:scim:schemas:core:2.0:ServiceProviderConfig</tt>, <xref target="section4"/> of this document has been added to the References column.</t></li>
</ul>
    </section>

  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3986.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6585.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7643.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7644.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml9/reference.BCP.0195.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9110.xml"/>
      </references>
    </references>


    <section anchor="acknowledgments" numbered="false">
      <name>Acknowledgments</name>
      <t>The authors would also like to acknowledge the following individuals
      who provided valuable feedback while reviewing the document: <contact fullname="Aaron Parecki"/>, <contact fullname="David Brossard"/>, <contact fullname="Dean H. Saxe"/>, and <contact fullname="Pamela Dingle"/>.</t>
    </section>

<section anchor="contributors" numbered="false">
<name>Contributors</name>
      <t>The authors would like to acknowledge the contribution of <contact
      fullname="Paul Lanzi"/> (IDenovate) in leading the writing of the Security
      Considerations section.</t>
</section>
  </back>
</rfc>
