<?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.21 (Ruby 3.3.6) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-grow-peering-api-00" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.25.0 -->
  <front>
    <title>Peering API</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-grow-peering-api-00"/>
    <author fullname="Carlos Aguado">
      <organization>Amazon</organization>
      <address>
        <email>crlsa@amazon.com</email>
      </address>
    </author>
    <author fullname="Matt Griswold">
      <organization>FullCtl</organization>
      <address>
        <email>grizz@20c.com</email>
      </address>
    </author>
    <author fullname="Jenny Ramseyer">
      <organization>Meta</organization>
      <address>
        <email>ramseyer@meta.com</email>
      </address>
    </author>
    <author fullname="Arturo Servin">
      <organization>Google</organization>
      <address>
        <email>arturolev@google.com</email>
      </address>
    </author>
    <author fullname="Tom Strickx">
      <organization>Cloudflare</organization>
      <address>
        <email>tstrickx@cloudflare.com</email>
      </address>
    </author>
    <date year="2024" month="December" day="07"/>
    <keyword>BGP</keyword>
    <keyword>peering</keyword>
    <keyword>configuration</keyword>
    <abstract>
      <?line 67?>

<t>We propose an API standard for BGP Peering, also known as interdomain interconnection through global Internet Routing.
This API offers a standard way to request public (settlement-free) peering, verify the status of a request or BGP session, and list potential connection locations.
The API is backed by PeeringDB OIDC, the industry standard for peering authentication.
We also propose future work to cover private peering, and alternative authentication methods.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://bgp.github.io/draft-ietf-peering-api/draft-peering-api-ramseyer-protocol.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-grow-peering-api/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/bgp/draft-ietf-peering-api"/>.</t>
    </note>
  </front>
  <middle>
    <?line 74?>

<section anchor="problems">
      <name>Introduction</name>
      <t>The Peering API is a mechanism that allows networks to automate interdomain interconnection  between two Autonomous Systems (AS) through the Border Gateway Protocol 4 (<xref target="RFC4271"/>).
Using the API, networks will be able to automatically request and accept peering interconnections between Autonomous Systems in public or private scenarios in a time faster than it would take to configure sessions manually.
By speeding up the peering turn-up process and removing the need for manual involvement in peering, the API and automation will ensure that networks can get interconnected as fast, reliably, cost-effectively, and efficiently as possible.
As a result, this improves end-user performance for all applications using networks interconnection supporting the Peering API.</t>
      <section anchor="justification">
        <name>Business Justification</name>
        <t>By using the Peering API, entities requesting and accepting peering can significantly improve the process to turn up interconnections by:</t>
        <ul spacing="normal">
          <li>
            <t>Reducing in person-hours spent configuring peering</t>
          </li>
          <li>
            <t>Reducing configuration mistakes by reducing human interaction</t>
          </li>
          <li>
            <t>And by peering, reducing network latency through expansion of interconnection relationships</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="conventions">
      <name>Conventions and Terminology</name>
      <t>All terms used in this document will be defined here:</t>
      <ul spacing="normal">
        <li>
          <t>Initiator: Network that wants to peer</t>
        </li>
        <li>
          <t>Receiver: Network that is receiving communications about peering</t>
        </li>
        <li>
          <t>Configured: peering session that is set up on one side</t>
        </li>
        <li>
          <t>Established: session is already defined as per BGP-4 specification  <xref section="8.2.2" sectionFormat="of" target="RFC4271"/></t>
        </li>
      </ul>
    </section>
    <section anchor="audience">
      <name>Audience</name>
      <t>The Peering API aims to simplify peering interconnection configuration.
To that end, the API can be called by either a human or some automation.
A network engineer can submit API requests through a client-side tool, and configure sessions by hand or through existing tooling.
Alternately, an automated service can request BGP sessions through some trigger or regularly scheduled request (for example, upon joining a new peering location, or through regular polling of potential peers).
That automated client can then configure the client sessions through its own tooling.
For ease of exchanging peering requests, the authors suggest peers to maintain both a client and a server for the API.
Toward the goal of streamlining peering configuration, the authors encourage peers to automate their network configuration wherever possible, but do not require full automation to use this API.</t>
    </section>
    <section anchor="protocol">
      <name>Protocol</name>
      <t>The Peering API follows the Representational State Transfer (<xref target="rest"/>) architecture where sessions, locations, and maintenance events are the resources the API represents and is modeled after the OpenAPI standard <xref target="openapi"/>.
Using the token bearer model (<xref target="RFC6750"/>), a client application can request to add or remove peering sessions, list potential interconnection locations, and query for upcoming maintenance events on behalf of the AS resource owner.</t>
      <section anchor="example-peering-request-negotiation">
        <name>Example Peering Request Negotiation</name>
        <t>Diagram of the Peering Request Process</t>
        <artwork><![CDATA[
+-------------------+                    +-------------------+
|     Step 1        |                    |     Step 2        |
|    Network 1      |------------------->|    Network 1      |
|  Identifies need  |                    |   Checks details  |
+-------------------+                    +-------------------+
                                                 |
                                                 v
+-------------------+                    +-------------------+
|      Step 4       |                    |      Step 3       |
|    Network 1      |<-------------------|    Network 1      |
|  gets approval    |                    |     Public or     |
|      token        |                    | Private Peering   |
+-------------------+                    +-------------------+
        |
        v
+-------------------+                    +-------------------+
|      Step 5       |                    |      Step 6       |
|  Network 1 finds  |------------------->|    Network 1      |
| common locations  |                    |  request peering  |
+-------------------+                    +-------------------+
                                                  |
                                                  v
+-------------------+                   +--------------------+
|      Step 8       |                   |       Step 7       |
|     Network 2     |<------------------|     Network 2      |
| accepts or reject |                   |      verifies      |
|    sessions       |                   |     credentials    |
+-------------------+                   +--------------------+
       /     \
      /       \
     /         \
(yes)           (no)
      \          |
       \         +-------------------------------|
        \                                        |
         \                                       |
          v                                      |
+---------------+          +----------------+    |
|    Step 9     |          |    Step 10     |    |
| Sessions are  |          | Network 1 or 2 |    |
|  provisioned  |--------->| checks session |    |
|     status    |          | until it is up |    |
+---------------+          +----------------+    |
                                   |             |
                      +------------+             |
                      |                          |
                      v                          |
            +-------------+                      |
            |   Step 11   |                      |
            |   Request   |<---------------------+
            |  Terminate  |
            +-------------+







Step 1 [Human]: Network 1 identifies that it would be useful to peer with Network 2 to interchange traffic more optimally


Step 2 [Human]: Network 1 checks technical and other peering details about Network 2 to check if peering is possible


Step 3 [Human]: Network 1 decides in type (Public or PNI) of peering and facility


Step 4 [API]: Network 1 gets approval/token that is authorized to ‘speak’ on behalf of Network 1’s ASN.


Step 5 [API]: Network 1 checks PeeringDB for common places between Network 1 and Network 2.
API: GET /locations


Step 6 [API]: Network 1 request peering with Network 2
API:      POST /add_sessions


Step 7 [API]: Network 2 verifies Network 1 credentials, check requirements for peering


Step 8 [API]: Network 2 accepts or rejects session(s)
API Server gives yes/no for request


Step 9 [API]: If yes, sessions are provisioned, Networks 1 or Network 2 can check status
API: /sessions Get session status


Step 10 [API]: API keeps polling until sessions are up


Step 11 [API]: Process Terminate
]]></artwork>
      </section>
      <section anchor="example-api-flow">
        <name>Example API Flow</name>
        <t>The diagram below outlines the proposed API flow.</t>
        <artwork><![CDATA[
OIDC Authentication

+-----------+                 +-------+                    +-----------+
| Initiator |                 | Peer  |                    | PeeringDB |
+-----------+                 +-------+                    +-----------+
      |                           |                              |
      | OIDC Authentication       |                              |
      |--------------------------------------------------------->|
      |                           |                              |
      |                                        Provide auth code |
      |<---------------------------------------------------------|
      |                           |                              |
      | Send auth code to Peer    |                              |
      |--------------------------------------------------------->|
      |                           |                              |
      |                           | Exchange auth code for token |
      |                           |----------------------------->|
      |                           |                              |
      |                           |                 Return token |
      |                           |<-----------------------------|
      |                           |
      | Peer determines permissions based on token
      |                           |
      | Send OK back to Initiator |
      |<--------------------------|

Operations, loop until peering is complete.

List Locations

+-----------+                                                  +-------+
| Initiator |                                                  | Peer  |
+-----------+                                                  +-------+
      |                                                            |
      | QUERY peering locations (peer type, ASN, auth code)        |
      |----------------------------------------------------------->|
      |                                                            |
      |                               Reply with peering locations |
      |                            or errors (401, 406, 451, etc.) |
      |<-----------------------------------------------------------|


Request session status

+-----------+                                                  +-------+
| Initiator |                                                  | Peer  |
+-----------+                                                  +-------+
      |                                                            |
      | QUERY request status using request ID & auth code          |
      |----------------------------------------------------------->|
      |                                                            |
      |                                  Reply with session status |
      |                                      (200, 404, 202, etc.) |
      |<-----------------------------------------------------------|
]]></artwork>
      </section>
      <section anchor="auth">
        <name>AUTH</name>
        <t>First, the initiating OAuth2 Client is also the Resource Owner (RO) so it can follow the OAuth2 client credentials grant <xref section="4.4" sectionFormat="of" target="RFC6749"/>.
In this example, the client will use PeeringDB OIDC credentials to acquire a JWT access token that is scoped for use with the receiving API.
On successful authentication, PeeringDB provides the Resource Server (RS) with the client's email (for potential manual discussion), along with the client's usage entitlements (known as OAuth2 scopes), to confirm the client is permitted to make API requests on behalf of the initiating AS.</t>
      </section>
      <section anchor="request">
        <name>REQUEST</name>
        <ol spacing="normal" type="1"><li>
            <t>ADD SESSION (CLIENT BATCHED REQUEST)</t>
          </li>
        </ol>
        <ul spacing="normal">
          <li>
            <t>The initiator's client provides a set of the following information, where local always refers to the receiver and peer always refers to the initiator:
            </t>
            <ul spacing="normal">
              <li>
                <t>Structure:
                </t>
                <ol spacing="normal" type="1"><li>
                    <t>Local ASN</t>
                  </li>
                  <li>
                    <t>Local IP</t>
                  </li>
                  <li>
                    <t>Peer ASN</t>
                  </li>
                  <li>
                    <t>Peer IP</t>
                  </li>
                  <li>
                    <t>Local BGP Role according to <xref target="RFC9234"/></t>
                  </li>
                  <li>
                    <t>Peer BGP Role according to <xref target="RFC9234"/></t>
                  </li>
                  <li>
                    <t>Local insert ASN (optional to support route servers)</t>
                  </li>
                  <li>
                    <t>Peer insert ASN (optional to support route servers)</t>
                  </li>
                  <li>
                    <t>Local monitoring session (optional to support monitoring systems)</t>
                  </li>
                  <li>
                    <t>Peer monitoring session (optional to support monitoring systems)</t>
                  </li>
                  <li>
                    <t>Peer Type (public or private)</t>
                  </li>
                  <li>
                    <t>Session Secret (optional with encoding agreed outside of this specification)</t>
                  </li>
                  <li>
                    <t>Location (Commonly agreed identifier of the BGP speaker, e.g. PeeringDB IX lan ID)</t>
                  </li>
                </ol>
              </li>
            </ul>
          </li>
          <li>
            <t>The receiver's expected actions:
            </t>
            <ul spacing="normal">
              <li>
                <t>The server confirms requested clientASN in list of authorized ASNs.</t>
              </li>
              <li>
                <t>Optional: checks traffic levels, prefix limit counters, other desired internal checks.</t>
              </li>
            </ul>
          </li>
        </ul>
        <ol spacing="normal" type="1"><li>
            <t>ADD SESSIONS (SERVER BATCHED RESPONSE)</t>
          </li>
        </ol>
        <ul spacing="normal">
          <li>
            <t>APPROVAL CASE
            </t>
            <ul spacing="normal">
              <li>
                <t>Server returns a list with the structure for each of the acceptable peering sessions. Note: this structure may also contain additional attributes such as the server generated session ID.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>PARTIAL APPROVAL CASE
            </t>
            <ul spacing="normal">
              <li>
                <t>Server returns a list with the structure for each of the acceptable peering sessions as in the approval case. The server also returns a list of sessions that have not deemed as validated or acceptable to be created. The set of sessions accepted and rejected is disjoint and the join of both sets matches the cardinality of the requested sessions.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>REJECTION CASE
            </t>
            <ul spacing="normal">
              <li>
                <t>Server returns an error message which indicates that all of the sessions requested have been rejected and the reason for it.</t>
              </li>
            </ul>
          </li>
        </ul>
      </section>
      <section anchor="clientconfig">
        <name>CLIENT CONFIGURATION</name>
        <t>The client then configures the chosen peering sessions asynchronously using their internal mechanisms.
The client SHOULD pull and use additional information on the new peering from public sources as required to ensure routing security, e.g., AS-SETs to configure appropriate filters.
For every session that the server rejected, the client removes that session from the list to be configured.</t>
      </section>
      <section anchor="serverconfig">
        <name>SERVER CONFIGURATION</name>
        <t>The server configures all sessions that are in its list of approved peering sessions from its reply to the client.
The server SHOULD pull and use additional information on the new peering from public sources to ensure routing security, e.g., AS-SETs to configure appropriate filters.</t>
      </section>
      <section anchor="monitoring">
        <name>MONITORING</name>
        <t>Both client and server wait for sessions to establish.
At any point, client may send a "GET STATUS" request to the server, to request the status of the session (by session ID).
The client will send a structure along with the request, as follows:</t>
        <ul spacing="normal">
          <li>
            <t>structure (where local refers to the server and peer refers to the client):
            </t>
            <ul spacing="normal">
              <li>
                <t>Session ID</t>
              </li>
              <li>
                <t>Local ASN</t>
              </li>
              <li>
                <t>Local IP</t>
              </li>
              <li>
                <t>Peer ASN</t>
              </li>
              <li>
                <t>Peer IP</t>
              </li>
              <li>
                <t>Local BGP Role (<xref target="RFC9234"/>)</t>
              </li>
              <li>
                <t>Peer BGP Role (<xref target="RFC9234"/>)</t>
              </li>
              <li>
                <t>Local insert ASN (optional, as defined above)</t>
              </li>
              <li>
                <t>Peer insert ASN (optional, as defined above)</t>
              </li>
              <li>
                <t>Local monitoring session (optional, as defined above)</t>
              </li>
              <li>
                <t>Peer monitoring session (optional, as defined above)</t>
              </li>
              <li>
                <t>Peer Type</t>
              </li>
              <li>
                <t>Session secret (optional, as defined above)</t>
              </li>
              <li>
                <t>Location</t>
              </li>
              <li>
                <t>Status</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>The server then responds with the same structure, with the information that it understands (status, etc).</t>
      </section>
      <section anchor="completion">
        <name>COMPLETION</name>
        <t>If both sides report that the session is established, then peering is complete.
If one side does not configure sessions within the server's acceptable configuration window (TimeWindow), then the server is entitled to remove the configured sessions and report "Unestablished" to the client.</t>
      </section>
    </section>
    <section anchor="endpoints_and_specs">
      <name>API Endpoints and Specifications</name>
      <t>Each peer needs a public API endpoint that will implement the API protocol.
This API should be publicly listed in peeringDB and also as a potential expansion of <xref target="RFC9092"/> which could provide endpoint integration to WHOIS (<xref target="RFC3912"/>).
Each API endpoint should be fuzz-tested and protected against abuse.  Attackers should not be able to access internal systems using the API.
Every single request should come in with a unique GUID called RequestID that maps to a peering request for later reference.
This GUID format should be standardized across all requests.
This GUID should be provided by the receiver once it receives the request and must be embedded in all communication.
If there is no RequestID present then that should be interpreted as a new request and the process starts again.
An email address is needed for communication if the API fails or is not implemented properly (can be obtained through PeeringDB).</t>
      <t>For a programmatic specification of the API, please see the public Github (<xref target="autopeer"/>).</t>
      <t>This initial draft fully specifies the Public Peering endpoints.
Private Peering and Maintenance are under discussion, and the authors invite collaboration and discussion from interested parties.</t>
      <section anchor="datatypes">
        <name>DATA TYPES</name>
        <t>Please see specification (<xref target="autopeer"/>) for OpenAPI format.</t>
        <t>Peering Location</t>
        <t>Contains string field listing the desired peering location in format <tt>pdb:ix:$IX_ID</tt>, and an enum specifying peering type (public or private).</t>
        <t>Session Status</t>
        <t>Status of BGP Session, both as connection status and approval status (Established, Pending, Approved, Rejected, Down, Unestablished, etc)</t>
        <t>Session Array</t>
        <t>Array of potential BGP sessions, with request UUID.
  Request UUID is optional for client, and required for server.
  Return URL is optional, and indicates the client's Peering API endpoint.
  The client's return URL is used by the server to request additional sessions.
  Client may provide initial UUID for client-side tracking, but the server UUID will be the final definitive ID.
  RequestID will not change across the request.</t>
        <t>BGP Session</t>
        <t>A structure that describes a BGP session and contains the following elements:</t>
        <ul spacing="normal">
          <li>
            <t>local_asn (ASN of requestor)</t>
          </li>
          <li>
            <t>local_ip (IP of requestor, v4 or v6)</t>
          </li>
          <li>
            <t>peer_asn (server ASN)</t>
          </li>
          <li>
            <t>peer_ip (server-side IP)</t>
          </li>
          <li>
            <t>local_bgp_role (BGP role according to <xref target="RFC9234"/>)</t>
          </li>
          <li>
            <t>peer_bgp_role (BGP role according to <xref target="RFC9234"/>)</t>
          </li>
          <li>
            <t>local_insert_asn (optional, to support route servers, defaults to true)</t>
          </li>
          <li>
            <t>peer_insert_asn (optional, to support route servers, defaults to true)</t>
          </li>
          <li>
            <t>local_monitoring_session (optional, to support monitoring systems, defaults to false)</t>
          </li>
          <li>
            <t>peer_monitoring_session (optional, to support monitoring systems, defaults to false)</t>
          </li>
          <li>
            <t>peer_type (public or private)</t>
          </li>
          <li>
            <t>session_secret (optional, as defined above)</t>
          </li>
          <li>
            <t>location (Peering Location, as defined above)</t>
          </li>
          <li>
            <t>status (Session Status, as defined above)</t>
          </li>
          <li>
            <t>session_id (of individual session and generated by the server)</t>
          </li>
        </ul>
        <t>As not all elements are reflected in the <xref target="autopeer"/> OpenAPI definition to date, we define the missing fields here to be reflected in <xref target="autopeer"/> in the future.</t>
        <ul spacing="normal">
          <li>
            <t>local_bgp_role and peer_bgp_role: these field describe the BGP roles of the local and peer side of the session according to <xref target="RFC9234"/> represented by an integer. The roles for both sides MUST be set in a way that does not violate role correctness as defined in Section 4.2 of <xref target="RFC9234"/>.</t>
          </li>
          <li>
            <t>local_insert_asn and peer_insert_asn: these fields define whether the local or peer side will insert their ASN into the AS path attribute of forwarded BGP routes. They are mostly relevant to route servers. The fields are boolean and optional. If not provided, they default to true.</t>
          </li>
          <li>
            <t>local_monitoring_session and peer_monitoring_session: these fields define whether the local or peer side of the session will forward routes to other ASes or not. As the role of monitoring systems is not defined in <xref target="RFC9234"/>, we add this role via a boolean, optional flag. If not provided, they default to false. local_monitoring_session and peer_monitoring_sessions MUST NOT be true at the same time for the same session to avoid a role mismatch.</t>
          </li>
        </ul>
        <t>Error</t>
        <t>API Errors, for field validation errors in requests, and request-level errors.</t>
        <t>The above is sourced largely from the linked OpenAPI specification.</t>
      </section>
      <section anchor="endpoints">
        <name>Endpoints</name>
        <t>(As defined in <xref target="autopeer"/>).
On each call, there should be rate limits, allowed senders, and other optional restrictions.</t>
        <section anchor="public_peering_ix">
          <name>Public Peering over an Internet Exchange (IX)</name>
          <ul spacing="normal">
            <li>
              <t><tt>/sessions</tt>: ADD/RETRIEVE sessions visible to the calling PEER
              </t>
              <ul spacing="normal">
                <li>
                  <t>Batch create new session resources
                  </t>
                  <ul spacing="normal">
                    <li>
                      <t>Establish new BGP sessions between peers, at the desired exchange.</t>
                    </li>
                    <li>
                      <t>Below is based on OpenAPI specification: <xref target="autopeer"/>.</t>
                    </li>
                    <li>
                      <t><tt>POST /sessions</tt>
                      </t>
                      <ul spacing="normal">
                        <li>
                          <t>Request body: Session Array</t>
                        </li>
                        <li>
                          <t>Responses:
                          </t>
                          <ul spacing="normal">
                            <li>
                              <t>200 OK:
                              </t>
                              <ul spacing="normal">
                                <li>
                                  <t>Contents: Session Array (all sessions in request accepted for configuration). Should not all the sessions be accepted, the response also contains a list of sessions and the respective errors.</t>
                                </li>
                              </ul>
                            </li>
                            <li>
                              <t>400:
                              </t>
                              <ul spacing="normal">
                                <li>
                                  <t>Error</t>
                                </li>
                              </ul>
                            </li>
                            <li>
                              <t>403:
                              </t>
                              <ul spacing="normal">
                                <li>
                                  <t>Unauthorized to perform the operation</t>
                                </li>
                              </ul>
                            </li>
                            <li>
                              <t>422:
                              </t>
                              <ul spacing="normal">
                                <li>
                                  <t>Please contact us, human intervention required</t>
                                </li>
                              </ul>
                            </li>
                          </ul>
                        </li>
                      </ul>
                    </li>
                  </ul>
                </li>
                <li>
                  <t>List all session resources. The response is paginated.
                  </t>
                  <ul spacing="normal">
                    <li>
                      <t>Given a request ID, query for the status of that request.</t>
                    </li>
                    <li>
                      <t>Given an ASN without request ID, query for status of all connections between client and server.</t>
                    </li>
                    <li>
                      <t>Below is based on OpenAPI specification: <xref target="autopeer"/>.</t>
                    </li>
                    <li>
                      <t><tt>GET /sessions</tt>
                      </t>
                      <ul spacing="normal">
                        <li>
                          <t>Request parameters:
                          </t>
                          <ul spacing="normal">
                            <li>
                              <t>asn (requesting client's asn)</t>
                            </li>
                            <li>
                              <t>request_id (optional, UUID of request)</t>
                            </li>
                            <li>
                              <t>max_results (integer to indicate an upper bound for a given response page)</t>
                            </li>
                            <li>
                              <t>next_token (opaque and optional string received on a previous response page and which allows the server to produce the next page of results. Its absence indicates to the server that the first page is expected)</t>
                            </li>
                          </ul>
                        </li>
                        <li>
                          <t>Response:
                          </t>
                          <ul spacing="normal">
                            <li>
                              <t>200: OK
                              </t>
                              <ul spacing="normal">
                                <li>
                                  <t>Contents: Session Array of sessions in request_id, if provided. Else, all existing and in-progress sessions between client ASN and server.
                                  </t>
                                  <ul spacing="normal">
                                    <li>
                                      <t>next_token (opaque and optional string the server expects to be passed back on the request for the next page. Its absence indicates to the client that no more pages are available)</t>
                                    </li>
                                  </ul>
                                </li>
                              </ul>
                            </li>
                            <li>
                              <t>400:
                              </t>
                              <ul spacing="normal">
                                <li>
                                  <t>Error (example: request_id is invalid)</t>
                                </li>
                              </ul>
                            </li>
                            <li>
                              <t>403:
                              </t>
                              <ul spacing="normal">
                                <li>
                                  <t>Unauthorized to perform the operation</t>
                                </li>
                              </ul>
                            </li>
                          </ul>
                        </li>
                      </ul>
                    </li>
                  </ul>
                </li>
              </ul>
            </li>
            <li>
              <t><tt>/sessions/{session_id}</tt>: Operate on individual sessions
              </t>
              <ul spacing="normal">
                <li>
                  <t>Retrieve an existing session resource
                  </t>
                  <ul spacing="normal">
                    <li>
                      <t>Below is based on OpenAPI specification: <xref target="autopeer"/>.</t>
                    </li>
                    <li>
                      <t><tt>GET /sessions/{session_id}</tt>
                      </t>
                      <ul spacing="normal">
                        <li>
                          <t>Request parameters:
                          </t>
                          <ul spacing="normal">
                            <li>
                              <t>session_id returned by the server on creation or through the session list operation.</t>
                            </li>
                          </ul>
                        </li>
                        <li>
                          <t>Responses:
                          </t>
                          <ul spacing="normal">
                            <li>
                              <t>200 OK:
                              </t>
                              <ul spacing="normal">
                                <li>
                                  <t>Contents: Session structure with current attributes</t>
                                </li>
                              </ul>
                            </li>
                            <li>
                              <t>400:
                              </t>
                              <ul spacing="normal">
                                <li>
                                  <t>Error (example: session_id is invalid)</t>
                                </li>
                              </ul>
                            </li>
                            <li>
                              <t>403:
                              </t>
                              <ul spacing="normal">
                                <li>
                                  <t>Unauthorized to perform the operation</t>
                                </li>
                              </ul>
                            </li>
                            <li>
                              <t>404:
                              </t>
                              <ul spacing="normal">
                                <li>
                                  <t>The session referred by the specified session_id does not exist or is not visible to the caller</t>
                                </li>
                              </ul>
                            </li>
                          </ul>
                        </li>
                      </ul>
                    </li>
                  </ul>
                </li>
                <li>
                  <t>Delete a session.
                  </t>
                  <ul spacing="normal">
                    <li>
                      <t>Given a session ID, delete it which effectively triggers an depeering from the initiator.</t>
                    </li>
                    <li>
                      <t>Below is based on OpenAPI specification: <xref target="autopeer"/>.</t>
                    </li>
                    <li>
                      <t><tt>DELETE /sessions/{session_id}</tt>
                      </t>
                      <ul spacing="normal">
                        <li>
                          <t>Request parameters:
                          </t>
                          <ul spacing="normal">
                            <li>
                              <t>session_id returned by the server on creation or through the session list operation.</t>
                            </li>
                          </ul>
                        </li>
                        <li>
                          <t>Response:
                          </t>
                          <ul spacing="normal">
                            <li>
                              <t>204: OK
                              </t>
                              <ul spacing="normal">
                                <li>
                                  <t>Contents: empty response as the session is processed and hard deleted</t>
                                </li>
                              </ul>
                            </li>
                            <li>
                              <t>400:
                              </t>
                              <ul spacing="normal">
                                <li>
                                  <t>Error (example: session_id is invalid)</t>
                                </li>
                              </ul>
                            </li>
                            <li>
                              <t>403:
                              </t>
                              <ul spacing="normal">
                                <li>
                                  <t>Unauthorized to perform the operation</t>
                                </li>
                              </ul>
                            </li>
                            <li>
                              <t>404:
                              </t>
                              <ul spacing="normal">
                                <li>
                                  <t>The session referred by the specified session_id does not exist or is not visible to the caller</t>
                                </li>
                              </ul>
                            </li>
                            <li>
                              <t>422:
                              </t>
                              <ul spacing="normal">
                                <li>
                                  <t>Please contact us, human intervention required</t>
                                </li>
                              </ul>
                            </li>
                          </ul>
                        </li>
                      </ul>
                    </li>
                  </ul>
                </li>
              </ul>
            </li>
          </ul>
        </section>
        <section anchor="utility_api">
          <name>UTILITY API CALLS</name>
          <t>Endpoints which provide useful information for potential interconnections.</t>
          <ul spacing="normal">
            <li>
              <t><tt>/locations</tt>: LIST POTENTIAL PEERING LOCATIONS
              </t>
              <ul spacing="normal">
                <li>
                  <t>List potential peering locations, both public and private. The response is paginated.
                  </t>
                  <ul spacing="normal">
                    <li>
                      <t>Below is based on OpenAPI specification: <xref target="autopeer"/>.</t>
                    </li>
                    <li>
                      <t><tt>GET /locations</tt>
                      </t>
                      <ul spacing="normal">
                        <li>
                          <t>Request parameters:
                          </t>
                          <ul spacing="normal">
                            <li>
                              <t>asn (Server ASN, with which to list potential connections)</t>
                            </li>
                            <li>
                              <t>location_type (Optional: Peering Location)</t>
                            </li>
                            <li>
                              <t>max_results (integer to indicate an upper bound for a given response page)</t>
                            </li>
                            <li>
                              <t>next_token (opaque and optional string received on a previous response page and which allows the server to produce the next page of results. Its absence indicates to the server that the first page is expected)</t>
                            </li>
                          </ul>
                        </li>
                        <li>
                          <t>Response:
                          </t>
                          <ul spacing="normal">
                            <li>
                              <t>200: OK
                              </t>
                              <ul spacing="normal">
                                <li>
                                  <t>Contents: List of Peering Locations.
                                  </t>
                                  <ul spacing="normal">
                                    <li>
                                      <t>next_token (opaque and optional string the server expects to be passed back on the request for the next page. Its absence indicates to the client that no more pages are available)</t>
                                    </li>
                                  </ul>
                                </li>
                              </ul>
                            </li>
                            <li>
                              <t>400:
                              </t>
                              <ul spacing="normal">
                                <li>
                                  <t>Error</t>
                                </li>
                              </ul>
                            </li>
                            <li>
                              <t>403:
                              </t>
                              <ul spacing="normal">
                                <li>
                                  <t>Unauthorized to perform the operation</t>
                                </li>
                              </ul>
                            </li>
                          </ul>
                        </li>
                      </ul>
                    </li>
                  </ul>
                </li>
              </ul>
            </li>
          </ul>
        </section>
        <section anchor="private-peering-draft">
          <name>Private Peering (DRAFT)</name>
          <ul spacing="normal">
            <li>
              <t>ADD/AUGMENT PNI</t>
            </li>
            <li>
              <t>Parameters:
              </t>
              <ul spacing="normal">
                <li>
                  <t>Peer ASN</t>
                </li>
                <li>
                  <t>Facility</t>
                </li>
                <li>
                  <t>email address (contact)</t>
                </li>
                <li>
                  <t>Action type: add/augment</t>
                </li>
                <li>
                  <t>LAG struct:
                  </t>
                  <ul spacing="normal">
                    <li>
                      <t>IPv4</t>
                    </li>
                    <li>
                      <t>IPv6</t>
                    </li>
                    <li>
                      <t>Circuit ID</t>
                    </li>
                  </ul>
                </li>
                <li>
                  <t>Who provides LOA? (and where to provide it).</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Response:
              </t>
              <ul spacing="normal">
                <li>
                  <t>200:
                  </t>
                  <ul spacing="normal">
                    <li>
                      <t>LAG struct, with server data populated</t>
                    </li>
                    <li>
                      <t>LOA or way to receive it</t>
                    </li>
                    <li>
                      <t>Request ID</t>
                    </li>
                  </ul>
                </li>
                <li>
                  <t>40x: rejections</t>
                </li>
              </ul>
            </li>
            <li>
              <t>REMOVE PNI
              </t>
              <ul spacing="normal">
                <li>
                  <t>As ADD/AUGMENT in parameters. Responses will include a requestID and status.</t>
                </li>
              </ul>
            </li>
          </ul>
        </section>
      </section>
    </section>
    <section anchor="session_negotiation">
      <name>Public Peering Session Negotiation</name>
      <t>As part of public peering configuration, this draft must consider how the client and server should handshake at which sessions to configure peering.
At first, a client will request sessions A, B, and C.
The server may choose to accept all sessions A, B, and C.
At this point, configuration proceeds as normal.
However, the server may choose to reject session B.
At that point, the server will reply back with A and C marked as "Accepted," and B as "Rejected."
The server will then configure A and C, and wait for the client to configure A and C.
If the client configured B as well, it will not come up.</t>
      <t>This draft encourages peers to set up garbage collection for unconfigured or down peering sessions, to remove stale configuration and maintain good router hygiene.</t>
      <t>Related to rejection, if the server would like to configure additional sessions with the client, the server may either reject all the session that do not meet the criteria caused by such absence in the client's request or approve the client's request and issue a separate request to the client's server requesting those additional peering sessions D and E.
The server will configure D and E on their side, and D and E will become part of the sessions requested in the UUID.
The client may choose whether or not to accept those additional sessions.
If they do, the client should configure D and E as well.
If they do not, the client will not configure D and E, and the server should garbage-collect those pending sessions.</t>
      <t>As part of the IETF discussion, the authors would like to discuss how to coordinate which side unfilters first.
Perhaps this information could be conveyed over a preferences vector.</t>
    </section>
    <section anchor="private_peering">
      <name>Private Peering</name>
      <t>Through future discussion with the IETF, the specification for private peering will be solidified.
Of interest for discussion includes Letter of Authorization (LOA) negotiation, and how to coordinate unfiltering and configuration checks.</t>
    </section>
    <section anchor="maintenance">
      <name>Maintenance</name>
      <t>This draft does not want to invent a new ticketing system.
However, there is an opportunity in this API to provide maintenance notifications to peering partners.
If there is interest, this draft would extend to propose a maintenance endpoint, where the server could broadcast upcoming and current maintenance windows.</t>
      <t>A maintenance message would follow a format like:</t>
      <ul spacing="normal">
        <li>
          <t>Title: string</t>
        </li>
        <li>
          <t>Start Date: date maintenance start(s/ed): UTC</t>
        </li>
        <li>
          <t>End Date: date maintenance ends: UTC</t>
        </li>
        <li>
          <t>Area: string or enum</t>
        </li>
        <li>
          <t>Details: freeform string</t>
        </li>
      </ul>
      <t>The "Area" field could be a freeform string, or could be a parseable ENUM, like (BGP, PublicPeering, PrivatePeering, Configuration, Caching, DNS, etc).</t>
      <t>Past maintenances will not be advertised.</t>
    </section>
    <section anchor="security">
      <name>Security Considerations</name>
      <t>This document describes a mechanism to standardize the discovery, creation and maintenance of peering relationships across autonomous systems (AS) using an out-of-band application programming interface (API). With it, AS operators take a step to operationalize their peering policy with new and existing peers in ways that improve or completely replace manual business validations, ultimately leading to the automation of the interconnection. However, this improvement can only be fully materialized when operators are certain that such API follows the operational trust and threat models they are comfortable with, some of which are documented in BGP operations and security best practices (<xref target="RFC7454"/>). To that extent, this document assumes the peering API will be deployed following a strategy of defense in-depth and proposes the following common baseline threat model below.</t>
      <section anchor="threats">
        <name>Threats</name>
        <t>Each of the following threats assume a scenario where an arbitrary actor is capable of reaching the peering API instance of a given operator, the client and the operator follow their own endpoint security and maintenance practices, and the trust anchors in use are already established following guidelines outside of the scope of this document.</t>
        <ul spacing="normal">
          <li>
            <t>T1: A malicious actor with physical access to the IX fabric and peering API of the receiver can use ASN or IP address information to impersonate a different IX member to discover, create, update or delete peering information which leads to loss of authenticity, confidentiality, and authorization of the spoofed IX member.</t>
          </li>
          <li>
            <t>T2: A malicious actor with physical access to the IX fabric can expose a peering API for an IX member different of its own to accept requests on behalf of such third party and supplant it, leading to a loss of authenticity, integrity, non-repudiability, and confidentiality between IX members.</t>
          </li>
          <li>
            <t>T3: A malicious actor without physical access to the IX fabric but with access the the peering API can use any ASN to impersonate any autonomous system and overload the receiver's peering API internal validations leading to a denial of service.</t>
          </li>
        </ul>
        <section anchor="mitigations">
          <name>Mitigations</name>
          <t>The following list of mitigations address different parts of the threats identified above:</t>
          <ul spacing="normal">
            <li>
              <t>M1: Authorization controls - A initiator using a client application is authorized using the claims presented in the request prior to any interaction with the peering API (addresses T1, T2).</t>
            </li>
            <li>
              <t>M2: Proof of holdership - The initiator of a request through a client can prove their holdership of an Internet Number Resource (addresses T1, T3).</t>
            </li>
            <li>
              <t>M3: Request integrity and proof of possession - The peering API can verify HTTP requests signed with a key that is cryptographically bound to the authorized initiator (addresses T1, T2).</t>
            </li>
          </ul>
          <t>The Peering API does not enforce any kind of peering policy on the incoming requests. It is left to the peering API instance implementation to enforce the AS-specific peering policy. This document encourages each peer to consider the needs of their peering policy and implement request validation as desired.</t>
        </section>
      </section>
      <section anchor="authorization">
        <name>Authorization controls</name>
        <t>The peering API instance receives HTTP requests from a client application from a peering initiator. Those requests can be authorized using the authorization model based on OAuth 2.0 (<xref target="RFC6749"/>) with the OpenID Connect <xref target="oidc"/> core attribute set. The choice of OpenID Connect is to use a standardized and widely adopted authorization exchange format based on JSON Web Tokens (<xref target="RFC7519"/>) which allows interoperation with existing web-based application flows. JWT tokens also supply sufficient claims to implement receiver-side authorization decisions by third parties when used as bearer access tokens (<xref target="RFC9068"/>). The peering API instance (a resource server in OAuth2 terms) should follow the bearer token usage (<xref target="RFC6750"/>) which describes the format and validation of an access token obtained from the Oauth 2.0 Authorization Server. The resource server should follow the best practices for JWT access validation (<xref target="RFC8725"/>) and in particular verify that the access token is constrained to the resource server via the audience claim. Upon successful access token validation, the resource server should decide whether to proceed with the request based on the presence of expected and matching claims in the access token or reject it altogether. The core identity and authorization claims present in the access token may be augmented with specific claims vended by the Authorization Service. This document proposes to use PeeringDB's access token claims as a baseline to use for authorization, however the specific matching of those claims to an authorization business decision is specific to each operator and outside of this specification. Resource servers may also use the claims in the access token to present the callers' identity to the application and for auditing purposes.</t>
      </section>
      <section anchor="resource-holdership">
        <name>Proof of holdership</name>
        <t>The peering API defined in this document uses ASNs as primary identifiers to identify each party on a peering session besides other resources such as IP addresses. ASNs are explicitly expected in some API payloads but are also implicitly expected when making authorization business decisions such as listing resources that belong to an operator. Given that ASNs are Internet Number Resources assigned by RIRs and that the OAuth2 Authorization Server in use may not be operated by any of those RIRs, as it is the case of PeeringDB or any other commercial OAuth2 service, JWT claims that contain an ASN need be proved to be legitimately used by the initiator. This document proposes to attest ASN resource holdership using a mechanism based on RPKI (<xref target="RFC6480"/>) and in particular with the use of RPKI Signed Checklists (RSCs) (<xref target="RFC9323"/>).</t>
        <t>JWT access tokens can be of two kinds, identifier-based tokens or self-contained tokens (<xref section="1.4" sectionFormat="of" target="RFC6749"/>). Resource servers must validate them for every request. AS operators can hint other operators to validate whether a caller holds ownership of the ASN their request represent by issuing a signed checklist that is specific to the different validation methods as described below.</t>
        <t>For Identifier-based access tokens, if the Authorization Server supports metadata, ASN holders must create a signed checklist that contains the well-known Authorization Server Metadata URI and a digest of the JSON document contained (Section 3 of <xref target="RFC8414"/>). If the authorization server does not support metadata, the signed checklist contains the token introspection URI and its digest.</t>
        <t>Self-contained access tokens are cryptographically signed by the token issuer using a JSON Web Signature (JWS) (<xref target="RFC7515"/>). The cryptographic keys used for signature validation is exposed as a JSON Web Key (JWK) (<xref target="RFC7517"/>). ASN holders must create a signed checklist for the "jwks_uri" field of the Authorization Server Metadata URI and a digest of the JSON document contained (<xref section="3.2" sectionFormat="of" target="RFC8414"/>).</t>
        <t>Resource servers must validate the JWT access token in the following manner:</t>
        <ul spacing="normal">
          <li>
            <t>If the access token is identifier-based, the resource server must resolve what introspection endpoint to use for the given access token, that is, either resolved through the Authorization Server Metadata URI (<xref section="3" sectionFormat="of" target="RFC8414"/>) or pre-configured upon registration in the absence of metadata support.
            </t>
            <ul spacing="normal">
              <li>
                <t>The resource server must verify the metadata URI and its content with a signed checklist issued by the ASN contained in the access token claims.</t>
              </li>
              <li>
                <t>If the Authorization Server does not support metadata, the resource server must validate the introspection endpoint URI matches exactly the URI contained in a signed checklist issued by the ASN contained in the access token claims.</t>
              </li>
              <li>
                <t>Upon successful signed checklist validation, resource servers must use the introspection endpoint for regular access token validation process (<xref target="RFC7662"/>).</t>
              </li>
            </ul>
          </li>
          <li>
            <t>If the access token is self-contained, the resource server must follow the regular validation process for signed access tokens (<xref section="5.2" sectionFormat="of" target="RFC7515"/>).
            </t>
            <ul spacing="normal">
              <li>
                <t>After discovering the valid public keys used to sign the token, the resource server must validate that the JWKS URI where the public keys have been discovered, and the content of such JSON document referred by it, match the signed checklist issued by the ASN contained in the access token claims.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Resource servers must reject the request if any of these validations fail.</t>
          </li>
        </ul>
      </section>
      <section anchor="integrity-and-possession">
        <name>Request integrity and proof of possession</name>
        <t>The API described in this document follows REST (<xref target="rest"/>) principles over an HTTP channel to model the transfer of requests and responses between peers. Implementations of this API should use the best common practices for the API transport (<xref target="RFC9325"/>) such as TLS. However, even in the presence of a TLS channel with OAuth2 bearer tokens alone, neither the client application nor the API can guarantee the end-to-end integrity of the message request or the authenticity of its content. One mechanism to add cryptographic integrity and authenticity validation can be the use a mutual authentication scheme to negotiate the parameters of the TLS channel. This requires the use of a web PKI (<xref target="RFC5280"/>) to carry claims for use in authorization controls, to bind such PKI to ASNs for proof of holdership, and the use of client certificates on the application.</t>
        <t>Instead, this document proposes to address the message integrity property by cryptographically signing the parameters of the request with a key pair that creates a HTTP message signature to be included in the request (<xref target="RFC9421"/>). The client application controls the lifecycle of this key pair. The authenticity property of the messages signed with such key pair is addressed by binding the public key of the pair to the JWT access token in one of its claims of the access token using a mechanism that demonstrates proof of possession of the private key <xref target="RFC9449"/>. With these two mechanisms, the resource server should authenticate, authorize, and validate the integrity of the request using a JWT access token that can rightfully claim to represent a given ASN.</t>
      </section>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="autopeer" target="https://github.com/bgp/autopeer/">
          <front>
            <title>Github repository with the API specification and diagrams</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="oidc" target="https://openid.net/specs/openid-connect-core-1_0.html">
          <front>
            <title>OpenID.Core</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="rest" target="http://roy.gbiv.com/pubs/dissertation/top.htm">
          <front>
            <title>Architectural Styles and the Design of Network-based Software Architectures</title>
            <author initials="R. T." surname="Fielding" fullname="Roy Thomas Fielding">
              <organization/>
            </author>
            <date year="2000"/>
          </front>
        </reference>
        <reference anchor="openapi" target="https://spec.openapis.org/oas/v3.1.0">
          <front>
            <title>OpenAPI-v3.1.0</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="RFC6750">
          <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="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="RFC7519">
          <front>
            <title>JSON Web Token (JWT)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is used as the payload of a JSON Web Signature (JWS) structure or as the plaintext of a JSON Web Encryption (JWE) structure, enabling the claims to be digitally signed or integrity protected with a Message Authentication Code (MAC) and/or encrypted.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7519"/>
          <seriesInfo name="DOI" value="10.17487/RFC7519"/>
        </reference>
        <reference anchor="RFC9068">
          <front>
            <title>JSON Web Token (JWT) Profile for OAuth 2.0 Access Tokens</title>
            <author fullname="V. Bertocci" initials="V." surname="Bertocci"/>
            <date month="October" year="2021"/>
            <abstract>
              <t>This specification defines a profile for issuing OAuth 2.0 access tokens in JSON Web Token (JWT) format. Authorization servers and resource servers from different vendors can leverage this profile to issue and consume access tokens in an interoperable manner.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9068"/>
          <seriesInfo name="DOI" value="10.17487/RFC9068"/>
        </reference>
        <reference anchor="RFC8725">
          <front>
            <title>JSON Web Token Best Current Practices</title>
            <author fullname="Y. Sheffer" initials="Y." surname="Sheffer"/>
            <author fullname="D. Hardt" initials="D." surname="Hardt"/>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <date month="February" year="2020"/>
            <abstract>
              <t>JSON Web Tokens, also known as JWTs, are URL-safe JSON-based security tokens that contain a set of claims that can be signed and/or encrypted. JWTs are being widely used and deployed as a simple security token format in numerous protocols and applications, both in the area of digital identity and in other application areas. This Best Current Practices document updates RFC 7519 to provide actionable guidance leading to secure implementation and deployment of JWTs.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="225"/>
          <seriesInfo name="RFC" value="8725"/>
          <seriesInfo name="DOI" value="10.17487/RFC8725"/>
        </reference>
        <reference anchor="RFC9323">
          <front>
            <title>A Profile for RPKI Signed Checklists (RSCs)</title>
            <author fullname="J. Snijders" initials="J." surname="Snijders"/>
            <author fullname="T. Harrison" initials="T." surname="Harrison"/>
            <author fullname="B. Maddison" initials="B." surname="Maddison"/>
            <date month="November" year="2022"/>
            <abstract>
              <t>This document defines a Cryptographic Message Syntax (CMS) protected content type for use with the Resource Public Key Infrastructure (RPKI) to carry a general-purpose listing of checksums (a 'checklist'). The objective is to allow for the creation of an attestation, termed an "RPKI Signed Checklist (RSC)", which contains one or more checksums of arbitrary digital objects (files) that are signed with a specific set of Internet Number Resources. When validated, an RSC confirms that the respective Internet resource holder produced the RSC.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9323"/>
          <seriesInfo name="DOI" value="10.17487/RFC9323"/>
        </reference>
        <reference anchor="RFC8414">
          <front>
            <title>OAuth 2.0 Authorization Server Metadata</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <date month="June" year="2018"/>
            <abstract>
              <t>This specification defines a metadata format that an OAuth 2.0 client can use to obtain the information needed to interact with an OAuth 2.0 authorization server, including its endpoint locations and authorization server capabilities.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8414"/>
          <seriesInfo name="DOI" value="10.17487/RFC8414"/>
        </reference>
        <reference anchor="RFC7515">
          <front>
            <title>JSON Web Signature (JWS)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>JSON Web Signature (JWS) represents content secured with digital signatures or Message Authentication Codes (MACs) using JSON-based data structures. Cryptographic algorithms and identifiers for use with this specification are described in the separate JSON Web Algorithms (JWA) specification and an IANA registry defined by that specification. Related encryption capabilities are described in the separate JSON Web Encryption (JWE) specification.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7515"/>
          <seriesInfo name="DOI" value="10.17487/RFC7515"/>
        </reference>
        <reference anchor="RFC9421">
          <front>
            <title>HTTP Message Signatures</title>
            <author fullname="A. Backman" initials="A." role="editor" surname="Backman"/>
            <author fullname="J. Richer" initials="J." role="editor" surname="Richer"/>
            <author fullname="M. Sporny" initials="M." surname="Sporny"/>
            <date month="February" year="2024"/>
            <abstract>
              <t>This document describes a mechanism for creating, encoding, and verifying digital signatures or message authentication codes over components of an HTTP message. This mechanism supports use cases where the full HTTP message may not be known to the signer and where the message may be transformed (e.g., by intermediaries) before reaching the verifier. This document also describes a means for requesting that a signature be applied to a subsequent HTTP message in an ongoing HTTP exchange.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9421"/>
          <seriesInfo name="DOI" value="10.17487/RFC9421"/>
        </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 anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC4271">
          <front>
            <title>A Border Gateway Protocol 4 (BGP-4)</title>
            <author fullname="Y. Rekhter" initials="Y." role="editor" surname="Rekhter"/>
            <author fullname="T. Li" initials="T." role="editor" surname="Li"/>
            <author fullname="S. Hares" initials="S." role="editor" surname="Hares"/>
            <date month="January" year="2006"/>
            <abstract>
              <t>This document discusses the Border Gateway Protocol (BGP), which is an inter-Autonomous System routing protocol.</t>
              <t>The primary function of a BGP speaking system is to exchange network reachability information with other BGP systems. This network reachability information includes information on the list of Autonomous Systems (ASes) that reachability information traverses. This information is sufficient for constructing a graph of AS connectivity for this reachability from which routing loops may be pruned, and, at the AS level, some policy decisions may be enforced.</t>
              <t>BGP-4 provides a set of mechanisms for supporting Classless Inter-Domain Routing (CIDR). These mechanisms include support for advertising a set of destinations as an IP prefix, and eliminating the concept of network "class" within BGP. BGP-4 also introduces mechanisms that allow aggregation of routes, including aggregation of AS paths.</t>
              <t>This document obsoletes RFC 1771. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4271"/>
          <seriesInfo name="DOI" value="10.17487/RFC4271"/>
        </reference>
        <reference anchor="RFC9234">
          <front>
            <title>Route Leak Prevention and Detection Using Roles in UPDATE and OPEN Messages</title>
            <author fullname="A. Azimov" initials="A." surname="Azimov"/>
            <author fullname="E. Bogomazov" initials="E." surname="Bogomazov"/>
            <author fullname="R. Bush" initials="R." surname="Bush"/>
            <author fullname="K. Patel" initials="K." surname="Patel"/>
            <author fullname="K. Sriram" initials="K." surname="Sriram"/>
            <date month="May" year="2022"/>
            <abstract>
              <t>Route leaks are the propagation of BGP prefixes that violate assumptions of BGP topology relationships, e.g., announcing a route learned from one transit provider to another transit provider or a lateral (i.e., non-transit) peer or announcing a route learned from one lateral peer to another lateral peer or a transit provider. These are usually the result of misconfigured or absent BGP route filtering or lack of coordination between autonomous systems (ASes). Existing approaches to leak prevention rely on marking routes by operator configuration, with no check that the configuration corresponds to that of the External BGP (eBGP) neighbor, or enforcement of the two eBGP speakers agreeing on the peering relationship. This document enhances the BGP OPEN message to establish an agreement of the peering relationship on each eBGP session between autonomous systems in order to enforce appropriate configuration on both sides. Propagated routes are then marked according to the agreed relationship, allowing both prevention and detection of route leaks.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9234"/>
          <seriesInfo name="DOI" value="10.17487/RFC9234"/>
        </reference>
        <reference anchor="RFC9092">
          <front>
            <title>Finding and Using Geofeed Data</title>
            <author fullname="R. Bush" initials="R." surname="Bush"/>
            <author fullname="M. Candela" initials="M." surname="Candela"/>
            <author fullname="W. Kumari" initials="W." surname="Kumari"/>
            <author fullname="R. Housley" initials="R." surname="Housley"/>
            <date month="July" year="2021"/>
            <abstract>
              <t>This document specifies how to augment the Routing Policy Specification Language inetnum: class to refer specifically to geofeed data comma-separated values (CSV) files and describes an optional scheme that uses the Routing Public Key Infrastructure to authenticate the geofeed data CSV files.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9092"/>
          <seriesInfo name="DOI" value="10.17487/RFC9092"/>
        </reference>
        <reference anchor="RFC3912">
          <front>
            <title>WHOIS Protocol Specification</title>
            <author fullname="L. Daigle" initials="L." surname="Daigle"/>
            <date month="September" year="2004"/>
            <abstract>
              <t>This document updates the specification of the WHOIS protocol, thereby obsoleting RFC 954. The update is intended to remove the material from RFC 954 that does not have to do with the on-the-wire protocol, and is no longer applicable in today's Internet. This document does not attempt to change or update the protocol per se, or document other uses of the protocol that have come into existence since the publication of RFC 954. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3912"/>
          <seriesInfo name="DOI" value="10.17487/RFC3912"/>
        </reference>
        <reference anchor="RFC7454">
          <front>
            <title>BGP Operations and Security</title>
            <author fullname="J. Durand" initials="J." surname="Durand"/>
            <author fullname="I. Pepelnjak" initials="I." surname="Pepelnjak"/>
            <author fullname="G. Doering" initials="G." surname="Doering"/>
            <date month="February" year="2015"/>
            <abstract>
              <t>The Border Gateway Protocol (BGP) is the protocol almost exclusively used in the Internet to exchange routing information between network domains. Due to this central nature, it is important to understand the security measures that can and should be deployed to prevent accidental or intentional routing disturbances.</t>
              <t>This document describes measures to protect the BGP sessions itself such as Time to Live (TTL), the TCP Authentication Option (TCP-AO), and control-plane filtering. It also describes measures to better control the flow of routing information, using prefix filtering and automation of prefix filters, max-prefix filtering, Autonomous System (AS) path filtering, route flap dampening, and BGP community scrubbing.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="194"/>
          <seriesInfo name="RFC" value="7454"/>
          <seriesInfo name="DOI" value="10.17487/RFC7454"/>
        </reference>
        <reference anchor="RFC6480">
          <front>
            <title>An Infrastructure to Support Secure Internet Routing</title>
            <author fullname="M. Lepinski" initials="M." surname="Lepinski"/>
            <author fullname="S. Kent" initials="S." surname="Kent"/>
            <date month="February" year="2012"/>
            <abstract>
              <t>This document describes an architecture for an infrastructure to support improved security of Internet routing. The foundation of this architecture is a Resource Public Key Infrastructure (RPKI) that represents the allocation hierarchy of IP address space and Autonomous System (AS) numbers; and a distributed repository system for storing and disseminating the data objects that comprise the RPKI, as well as other signed objects necessary for improved routing security. As an initial application of this architecture, the document describes how a legitimate holder of IP address space can explicitly and verifiably authorize one or more ASes to originate routes to that address space. Such verifiable authorizations could be used, for example, to more securely construct BGP route filters. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6480"/>
          <seriesInfo name="DOI" value="10.17487/RFC6480"/>
        </reference>
        <reference anchor="RFC7517">
          <front>
            <title>JSON Web Key (JWK)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>A JSON Web Key (JWK) is a JavaScript Object Notation (JSON) data structure that represents a cryptographic key. This specification also defines a JWK Set JSON data structure that represents a set of JWKs. Cryptographic algorithms and identifiers for use with this specification are described in the separate JSON Web Algorithms (JWA) specification and IANA registries established by that specification.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7517"/>
          <seriesInfo name="DOI" value="10.17487/RFC7517"/>
        </reference>
        <reference anchor="RFC7662">
          <front>
            <title>OAuth 2.0 Token Introspection</title>
            <author fullname="J. Richer" initials="J." role="editor" surname="Richer"/>
            <date month="October" year="2015"/>
            <abstract>
              <t>This specification defines a method for a protected resource to query an OAuth 2.0 authorization server to determine the active state of an OAuth 2.0 token and to determine meta-information about this token. OAuth 2.0 deployments can use this method to convey information about the authorization context of the token from the authorization server to the protected resource.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7662"/>
          <seriesInfo name="DOI" value="10.17487/RFC7662"/>
        </reference>
        <reference anchor="RFC9325">
          <front>
            <title>Recommendations for Secure Use of Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS)</title>
            <author fullname="Y. Sheffer" initials="Y." surname="Sheffer"/>
            <author fullname="P. Saint-Andre" initials="P." surname="Saint-Andre"/>
            <author fullname="T. Fossati" initials="T." surname="Fossati"/>
            <date month="November" year="2022"/>
            <abstract>
              <t>Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS) are used to protect data exchanged over a wide range of application protocols and can also form the basis for secure transport protocols. Over the years, the industry has witnessed several serious attacks on TLS and DTLS, including attacks on the most commonly used cipher suites and their modes of operation. This document provides the latest recommendations for ensuring the security of deployed services that use TLS and DTLS. These recommendations are applicable to the majority of use cases.</t>
              <t>RFC 7525, an earlier version of the TLS recommendations, was published when the industry was transitioning to TLS 1.2. Years later, this transition is largely complete, and TLS 1.3 is widely available. This document updates the guidance given the new environment and obsoletes RFC 7525. In addition, this document updates RFCs 5288 and 6066 in view of recent attacks.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="195"/>
          <seriesInfo name="RFC" value="9325"/>
          <seriesInfo name="DOI" value="10.17487/RFC9325"/>
        </reference>
        <reference anchor="RFC5280">
          <front>
            <title>Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile</title>
            <author fullname="D. Cooper" initials="D." surname="Cooper"/>
            <author fullname="S. Santesson" initials="S." surname="Santesson"/>
            <author fullname="S. Farrell" initials="S." surname="Farrell"/>
            <author fullname="S. Boeyen" initials="S." surname="Boeyen"/>
            <author fullname="R. Housley" initials="R." surname="Housley"/>
            <author fullname="W. Polk" initials="W." surname="Polk"/>
            <date month="May" year="2008"/>
            <abstract>
              <t>This memo profiles the X.509 v3 certificate and X.509 v2 certificate revocation list (CRL) for use in the Internet. An overview of this approach and model is provided as an introduction. The X.509 v3 certificate format is described in detail, with additional information regarding the format and semantics of Internet name forms. Standard certificate extensions are described and two Internet-specific extensions are defined. A set of required certificate extensions is specified. The X.509 v2 CRL format is described in detail along with standard and Internet-specific extensions. An algorithm for X.509 certification path validation is described. An ASN.1 module and examples are provided in the appendices. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5280"/>
          <seriesInfo name="DOI" value="10.17487/RFC5280"/>
        </reference>
      </references>
    </references>
    <?line 670?>

<section anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The authors would like to thank their collaborators, who implemented API versions and provided valuable feedback on the design.</t>
      <ul spacing="normal">
        <li>
          <t>Ben Blaustein (Meta)</t>
        </li>
        <li>
          <t>Jakub Heichman (Meta)</t>
        </li>
        <li>
          <t>Stefan Pratter (20C)</t>
        </li>
        <li>
          <t>Ben Ryall (Meta)</t>
        </li>
        <li>
          <t>Erica Salvaneschi (Cloudflare)</t>
        </li>
        <li>
          <t>Job Snijders (Fastly)</t>
        </li>
        <li>
          <t>David Tuber (Cloudflare)</t>
        </li>
        <li>
          <t>Aaron Rose (Amazon)</t>
        </li>
        <li>
          <t>Prithvi Nath Manikonda (Amazon)</t>
        </li>
        <li>
          <t>Matthias Wichtlhuber (DE-CIX)</t>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
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
03/Yo0pdex9brX8HthfyAYCcAAA=

-->

</rfc>
