<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.21 (Ruby 2.6.10) -->


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

]>


<rfc ipr="trust200902" docName="draft-tulshibagwale-saag-pushpull-delivery-03" category="info" submissionType="IETF" xml:lang="en">
  <front>
    <title abbrev="pushpull">Push And Pull Based Security Event Token (SET) Delivery</title>

    <author initials="A." surname="Tulshibagwale" fullname="Atul Tulshibagwale">
      <organization>SGNL</organization>
      <address>
        <email>atul@sgnl.ai</email>
      </address>
    </author>
    <author initials="A." surname="Deshpande" fullname="Apoorva Deshpande">
      <organization>Okta</organization>
      <address>
        <email>apoorva.deshpande@okta.com</email>
      </address>
    </author>
    <author initials="A." surname="Parecki" fullname="Aaron Parecki">
      <organization>Okta</organization>
      <address>
        <email>aaron@parecki.com</email>
      </address>
    </author>

    <date year="2025" month="April" day="17"/>

    <area>sec</area>
    <workgroup>saag</workgroup>
    <keyword>JSON Web Token</keyword> <keyword>JWT</keyword> <keyword>Security Event Token</keyword> <keyword>SET</keyword> <keyword>Delivery</keyword> <keyword>JavaScript Object Notation</keyword> <keyword>JSON</keyword>

    <abstract>


<?line 76?>
<t>This specification defines how multiple Security Event Tokens (SETs) can be delivered and received to and by an intended recipeint using HTTP POST over TLS or WebSocket binding.</t>

<t>This specification enabled following two use cases -</t>

<t><list style="symbols">
  <t>In situations where a transmitter of Security Event Tokens (SETs) to a network peer is also a receiver of SETs from the same peer, it is helpful to have an efficient way of sending and receiving SETs in one HTTP transaction. In many cases, such as when using the OpenID Shared Signals Framework (SSF), the situation where each entity is both a transmitter and receiver is getting increasingly common.</t>
  <t>In situations where a transmitter of Security Event Tokens (SETs) wants to transmit multiple SETs to the reciever in a single HTTP call.</t>
</list></t>

<t>Using current mechanisms such as "Push-Based Delivery of Security Event Tokens (SETs) Using HTTP" or "Poll-Based Delivery of Security Event Tokens (SETs) Using HTTP" both require two or more HTTP connections to exchange SETs between peers. This is inefficient due to the latency of setting up each communication. This specification enables mutiple events to be transmitted in bi-directional transmission and reception of multiple SETs in one HTTP connection, and enables them to do so over a single HTTP or WebSocket binding.</t>



    </abstract>

    <note title="About This Document" removeInRFC="true">
      <t>
        The latest revision of this draft can be found at <eref target="https://sgnl-ai.github.io/pushpull/"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-tulshibagwale-saag-pushpull-delivery/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/SGNL-ai/pushpull"/>.</t>
    </note>


  </front>

  <middle>


<?line 85?>

<section anchor="introduction"><name>Introduction</name>
<t>Entities that exchange SETs <xref target="RFC8417"/> with each other ("Transceivers") can do so efficiently using the protocol defined in this specification. This specification extends the mechanisms described in the DeliveryPush <xref target="RFC8935"/> and DeliveryPoll <xref target="RFC8936"/> with the following additional mechanisms:</t>

<t><list style="symbols">
  <t>A Transceiver initiating a communication can send multiple SETs in one HTTP connection to a Peer</t>
  <t>The Transceiver initiating communication can acknowledge previously received SETs in the same HTTP connection to the Peer</t>
  <t>The Peer responding to the communication can send multiple SETs in its response to a connection from the Transceiver</t>
  <t>The Peer responding to the communication can acknowledge previously received SETs in its response to the Transceiver</t>
</list></t>

<t>This specification also defines a mechanism by which a transmitter of a
   Security Event Token (SET) <xref target="RFC8417"></xref> can deliver multiple SETs to an
   intended SET Recipient via HTTP POST [RFC7231] over TLS in a single
   POST call.  <xref target="RFC8935"></xref> focuses on the delivery of the single SET to
   the receiver.  This specification builds onto <xref target="RFC8935"></xref> to transmit
   multiple SETs to the receiver in a single POST call.</t>

<t>Multi-push SET delivery is intended to help in following scenarios:</t>

<t><list style="symbols">
  <t>The transmitter of the SET has multiple outstanding SETs to be
communicated to the receiver</t>
  <t>The transmitter wants to reduce the number of outbound calls to
the same receiver to optimize performance, avoid being ratelimited
when number of SETs to be communicated is high</t>
  <t>The receiver wants to optimize processing multiple SETs</t>
</list></t>

</section>
<section anchor="notational-conventions"><name>Notational Conventions</name>

<t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
"MAY", and "OPTIONAL" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when,
they appear in all capitals, as shown here.</t>

</section>
<section anchor="terminology"><name>Terminology</name>

<dl>
  <dt>Transmitter</dt>
  <dd>
    <t>A networked entity that can act as a transmitter of SETs. It communicates with other trusted Receivers to transmit using the protocol defined herein.</t>
  </dd>
  <dt>Receiver</dt>
  <dd>
    <t>A networked entity that can act as a receiver of SETs. It communicates with other trusted Transmitter to receive SETs using the protocol defined herein.</t>
  </dd>
  <dt>Transceiver</dt>
  <dd>
    <t>A networked entity that can act both as a transmitter of SETs and a receiver of SETs. It communicates with other trusted Transceivers to transmit and receive SETs using the protocol defined herein.</t>
  </dd>
  <dt>Peer</dt>
  <dd>
    <t>Another name for a Transceiver, used to signify the other end of the communication from a Transceiver.</t>
  </dd>
  <dt>Initiator</dt>
  <dd>
    <t>A Transceiver initiating communication with a Peer.</t>
  </dd>
  <dt>Responder</dt>
  <dd>
    <t>A Transceiver responding to communication from a Peer.</t>
  </dd>
  <dt>DeliveryPush</dt>
  <dd>
    <t>The IETF RFC titled "Push-Based Delivery of Security Event Tokens (SETs) Using HTTP" <xref target="RFC8935"/>.</t>
  </dd>
  <dt>DeliveryPoll</dt>
  <dd>
    <t>The IETF RFC titled "Poll-Based Delivery of Security Event Tokens (SETs) Using HTTP" <xref target="RFC8936"/>.</t>
  </dd>
</dl>

</section>
<section anchor="pushpull-endpoint"><name>Pushpull Endpoint</name>
<t>Each Transceiver that supports this specification MUST support a "Pushpull" endpoint. This endpoint MUST be capable of serving HTTP <xref target="RFC9110"/> requests. This endpoint MUST be TLS <xref target="RFC8446"/> enabled and MUST reject any communication not using TLS. The Pushpull endpoint MUST support the HTTP method <spanx style="verb">POST</spanx> and reject all other HTTP methods.</t>

</section>
<section anchor="communication-object"><name>Communication Object</name>
<t>A Communication Object is a JSON object <xref target="RFC8259"/>, and is a unit of communication defined in this specification for use in both requests and responses. When used in a request, the Initiator MAY include additional fields defined in the later sections below. The common fields of this object are:</t>

<dl>
  <dt>sets</dt>
  <dd>
    <t>OPTIONAL. A JSON object containing key-value pairs in which the key of a field is a string that contains the <spanx style="verb">jti</spanx> value of the SET that is specified in the value of the field. This field MAY be omitted to indicate that no SETs are being delivered by the initiator in this communication.</t>
  </dd>
  <dt>ack</dt>
  <dd>
    <t>OPTIONAL. An array of strings, in which each string is the <spanx style="verb">jti</spanx> value of a previously received SET that is acknowledged in this object. This array MAY be empty or this field MAY be omitted to indicate that no previously received SETs are being acknowledged in this communication.</t>
  </dd>
  <dt>setErrs</dt>
  <dd>
    <t>OPTIONAL. A JSON object containing key-value pairs in which the key of a field is a string that contains the <spanx style="verb">jti</spanx> value of a previously received SET that the sender of the communication object was unable to process. The value of the field is a JSON object that has the following fields:
</t>

    <dl>
      <dt>err</dt>
      <dd>
        <t>REQUIRED. The short reason why the specified SET failed to be processed.</t>
      </dd>
      <dt>description</dt>
      <dd>
        <t>REQUIRED. An explanation of why the SET failed to be processed.</t>
      </dd>
    </dl>
  </dd>
</dl>

<section anchor="example"><name>Example</name>
<t>The following is a non-normative example of a Communication Object</t>

<figure title="Example of a Communication Object" anchor="fig-communication-object-example"><sourcecode type="json"><![CDATA[
{
  "sets": {
    "dfc38da2-939e-4536-bec9-b8a16ed45c4e": 
    "eyJhbGciOiJIUzI1NiJ9.
    eyJqdGkiOiJkZmMzOGRhMi05MzllLTQ1MzYtYmVjOS1iOGExNmVkNDVjNGUiLC
    JpYXQiOjE0NTg0OTY0MDQsImlzcyI6Imh0dHBzOi8vc2NpbS5leGFtcGxlLmNv
    bSIsImF1ZCI6WyJodHRwczovL3NjaW0uZXhhbXBsZS5jb20vRmVlZHMvOThkNT
    I0NjFmYTViYmM4Nzk1OTNiNzc1NCIsImh0dHBzOi8vc2NpbS5leGFtcGxlLmNv
    bS9GZWVkcy81ZDc2MDQ1MTZiMWQwODY0MWQ3Njc2ZWU3Il0sImV2ZW50cyI6ey
    J1cm46aWV0ZjpwYXJhbXM6c2NpbTpldmVudDpjcmVhdGUiOnsicmVmIjoiaHR0
    cHM6Ly9zY2ltLmV4YW1wbGUuY29tL1VzZXJzLzQ0ZjYxNDJkZjk2YmQ2YWI2MW
    U3NTIxZDkiLCJhdHRyaWJ1dGVzIjpbImlkIiwibmFtZSIsInVzZXJOYW1lIiwi
    cGFzc3dvcmQiLCJlbWFpbHMiXX19fQ.XuVUJWrU6l80dcJ8bTRf-erMzFtQFYo
    kZLN--Kzd98o",
    "d93341ad-7329-4d1b-ba4a-9ff6f9f34003":
    "eyJhbGciOiJub25lIn0.
    eyJqdGkiOiIzZDBjM2NmNzk3NTg0YmQxOTNiZDBmYjFiZDRlN2QzMCIsImlhdC
    I6MTQ1ODQ5NjAyNSwiaXNzIjoiaHR0cHM6Ly9zY2ltLmV4YW1wbGUuY29tIiwi
    YXVkIjpbImh0dHBzOi8vamh1Yi5leGFtcGxlLmNvbS9GZWVkcy85OGQ1MjQ2MW
    ZhNWJiYzg3OTU5M2I3NzU0IiwiaHR0cHM6Ly9qaHViLmV4YW1wbGUuY29tL0Zl
    ZWRzLzVkNzYwNDUxNmIxZDA4NjQxZDc2NzZlZTciXSwic3ViIjoiaHR0cHM6Ly
    9zY2ltLmV4YW1wbGUuY29tL1VzZXJzLzQ0ZjYxNDJkZjk2YmQ2YWI2MWU3NTIx
    ZDkiLCJldmVudHMiOnsidXJuOmlldGY6cGFyYW1zOnNjaW06ZXZlbnQ6cGFzc3
    dvcmRSZXNldCI6eyJpZCI6IjQ0ZjYxNDJkZjk2YmQ2YWI2MWU3NTIxZDkifSwi
    aHR0cHM6Ly9leGFtcGxlLmNvbS9zY2ltL2V2ZW50L3Bhc3N3b3JkUmVzZXRFeH
    QiOnsicmVzZXRBdHRlbXB0cyI6NX19fQ."
  },
  "ack": [
    "f52901c4-3996-11ef-9454-0242ac120002",
    "50924f49-55a9-47ca-820d-b1161cb0a602",
    "d563c724-79a0-4ff0-ba41-657fa5e2cb11"
  ],
  "setErrs": {
    "5c436b19-0958-4367-b408-2dd542606d3b" : {
      "err": "invalid subject",
      "description": "subject format not supported"
    }
  }
}
]]></sourcecode></figure>

</section>
</section>
<section anchor="http-request-response-binding"><name>HTTP Request Response Binding</name>
<t>This section describes how Transceivers can use HTTP Requests and Responses to exchange Communication Objects described in  <xref target="communication-object"/>.</t>

<section anchor="initiating-communication"><name>Initiating Communication</name>

<t>A Transceiver can initiate communication with a Peer in order to:</t>

<t><list style="symbols">
  <t>Send one or more SETs to the Peer.</t>
  <t>Positively or negatively acknowledge previously received SETs from the Peer.</t>
  <t>Both acknowledge previously received SETs from the Peer and send SETs to the Peer.</t>
</list></t>

<t>To initiate communication, the Initiator makes a HTTP POST request to the Responder's Pushpull Endpoint <xref target="pushpull-endpoint"/>. The body of this request is of the content type <spanx style="verb">application/json</spanx>. It contains a Communication Object <xref target="communication-object"/>, and the following additional field MAY be present:</t>

<dl>
  <dt>maxResponseEvents</dt>
  <dd>
    <t>OPTIONAL. A number which specifies the maximum number of events the Responder can include in its response to the Initiator. If this field is absent in the request, the Responder MAY include any number of events in the response. If this field is present, then the Responder MUST NOT include more events than the value of "maxResponseEvents" in its response to the specific request.</t>
  </dd>
</dl>

</section>
<section anchor="response-communication"><name>Response Communication</name>

<t>A Responder MUST respond to a communication from an Initiator by sending an HTTP Response.</t>

<section anchor="http-success-response"><name>Success Response</name>
<t>If the Responder is successful in receiving the request, it MUST return the HTTP status code 200 (OK). This status only indicates that the communication received was well formatted and was successfully parsed by the Responder. It does not indicate anything about whether any SETs in the communication were accepted or not.</t>

<t>The response MUST have the content-type <spanx style="verb">application/json</spanx> and the response MUST include a Communication Object <xref target="communication-object"/>.</t>

</section>
<section anchor="error-response"><name>Error Response</name>
<t>The Responder MUST respond with an error response if it is unable to process the request. This error response means that the responder was unable to parse the communication or the responder encountered a system error while attempting to process the communication. It does not indicate a positive or negative acknowledgement of any SETs in the communication.</t>

<t>The error response MUST include the appropriate error code as described in Section 2.4 of DeliveryPush <xref target="RFC8935"/>.</t>

</section>
<section anchor="out-of-order-responses"><name>Out Of Order Responses</name>
<t>A Communication Object in a Response may contain <spanx style="verb">jti</spanx> values in its <spanx style="verb">ack</spanx> or <spanx style="verb">setErrs</spanx> that do not correspond to the SETs received in the same Request to which the Response is being sent. They MAY consist of values received in previous Requests.</t>

</section>
</section>
<section anchor="example-request-and-response"><name>Example Request and Response</name>
<t>The following is a non-normative example of a request and its corresponding response</t>

<section anchor="request"><name>Request</name>

<figure title="Example Pushpull request" anchor="fig-example-request"><sourcecode type="http"><![CDATA[
POST /pushpull-endpoint HTTP/1.1
Host: sharedsignals-transceiver.myorg.example
Content-type: application/json
Authorization: Bearer eyJraWQiOiIyMDIwXzEiLCJJhbGciOiJSUzI1NiJ9...

{
  "ack": [],
  "sets": {
    "9deb50b0-d2f8-4793-a420-5e5678cf25a8": 
    "eyJhbGciOiJIUzI1NiJ9.
    eyJqdGkiOiI5ZGViNTBiMC1kMmY4LTQ3OTMtYTQyMC01ZTU2NzhjZjI1YTgiLC
    JpYXQiOjE0NTg0OTY0MDQsImlzcyI6Imh0dHBzOi8vc2NpbS5leGFtcGxlLmNv
    bSIsImF1ZCI6WyJodHRwczovL3NjaW0uZXhhbXBsZS5jb20vRmVlZHMvOThkNT
    I0NjFmYTViYmM4Nzk1OTNiNzc1NCIsImh0dHBzOi8vc2NpbS5leGFtcGxlLmNv
    bS9GZWVkcy81ZDc2MDQ1MTZiMWQwODY0MWQ3Njc2ZWU3Il0sImV2ZW50cyI6ey
    J1cm46aWV0ZjpwYXJhbXM6c2NpbTpldmVudDpjcmVhdGUiOnsicmVmIjoiaHR0
    cHM6Ly9zY2ltLmV4YW1wbGUuY29tL1VzZXJzLzQ0ZjYxNDJkZjk2YmQ2YWI2MW
    U3NTIxZDkiLCJhdHRyaWJ1dGVzIjpbImlkIiwibmFtZSIsInVzZXJOYW1lIiwi
    cGFzc3dvcmQiLCJlbWFpbHMiXX19fQ.KAaZj082ge8I1AiXfnmYw49ILFc5hEA
    tTZC9LkGg7IA",
    "d93341ad-7329-4d1b-ba4a-9ff6f9f34003":
    "eyJhbGciOiJIUzI1NiJ9.
    eyJqdGkiOiJkOTMzNDFhZC03MzI5LTRkMWItYmE0YS05ZmY2ZjlmMzQwMDMiLC
    JpYXQiOjE0NTg0OTYwMjUsImlzcyI6Imh0dHBzOi8vc2NpbS5leGFtcGxlLmNv
    bSIsImF1ZCI6WyJodHRwczovL2podWIuZXhhbXBsZS5jb20vRmVlZHMvOThkNT
    I0NjFmYTViYmM4Nzk1OTNiNzc1NCIsImh0dHBzOi8vamh1Yi5leGFtcGxlLmNv
    bS9GZWVkcy81ZDc2MDQ1MTZiMWQwODY0MWQ3Njc2ZWU3Il0sInN1YiI6Imh0dH
    BzOi8vc2NpbS5leGFtcGxlLmNvbS9Vc2Vycy80NGY2MTQyZGY5NmJkNmFiNjFl
    NzUyMWQ5IiwiZXZlbnRzIjp7InVybjppZXRmOnBhcmFtczpzY2ltOmV2ZW50On
    Bhc3N3b3JkUmVzZXQiOnsiaWQiOiI0NGY2MTQyZGY5NmJkNmFiNjFlNzUyMWQ5
    In0sImh0dHBzOi8vZXhhbXBsZS5jb20vc2NpbS9ldmVudC9wYXNzd29yZFJlc2
    V0RXh0Ijp7InJlc2V0QXR0ZW1wdHMiOjV9fX0.IGbGOmSBtyS8wOGyMhWHe83v
    YgbGjUoezk-cIpYzVeY"
  },
  "setErrs": {
    "5c436b19-0958-4367-b408-2dd542606d3b" : {
      "err": "invalid subject",
      "description": "subject format not supported"
    }
  },
  "maxResponseEvents": 10
}
]]></sourcecode></figure>
<t>In the above example request, the Initiator does not acknowledge any previous events, delivers two SETs, and reports an error on a previously received SET.</t>

</section>
<section anchor="response"><name>Response</name>
<t>The following is a non-normative example of a response:</t>

<figure title="Example Pushpull response" anchor="fig-example-response"><sourcecode type="http"><![CDATA[
HTTP/1.1 200 OK
Content-type: application/json

{
  "ack": [
    "d8d439e6-b103-47c7-86d9-d5951ce774d1"
  ],
  "sets": {
    "3f1c5fc7-99c5-4c2b-a9a3-68ea90be9ca9":
    "eyJ0eXAiOiJzZWNldmVudCtqd3QiLCJhbGciOiJIUzI1NiJ9.
    eyJpc3MiOiJodHRwczovL2lkcC5leGFtcGxlLmNvbS8iLCJqdGkiOiIzZjFjNW
    ZjNy05OWM1LTRjMmItYTlhMy02OGVhOTBiZTljYTkiLCJpYXQiOjE1MDgxODQ4
    NDUsImF1ZCI6IjYzNkM2OTY1NkU3NDVGNjk2NCIsImV2ZW50cyI6eyJodHRwcz
    ovL3NjaGVtYXMub3BlbmlkLm5ldC9zZWNldmVudC9yaXNjL2V2ZW50LXR5cGUv
    YWNjb3VudC1kaXNhYmxlZCI6eyJzdWJqZWN0Ijp7InN1YmplY3RfdHlwZSI6Im
    lzcy1zdWIiLCJpc3MiOiJodHRwczovL2lkcC5leGFtcGxlLmNvbS8iLCJzdWIi
    OiI3Mzc1NjI2QTY1NjM3NCJ9LCJyZWFzb24iOiJoaWphY2tpbmcifX19._Jwjs
    2M2AbxvPRRJJi5Kjl_Xepveugdd9Wb_Bh2Jj8s"
  }
}
]]></sourcecode></figure>
<t>In the above example, the Responder acknowledges one of the SETs it previously received and provides a SET to deliver to the initiator. There are no errors reported by the Responder.</t>

</section>
</section>
</section>
<section anchor="websocket-binding"><name>WebSocket Binding</name>
<t>Transceivers MAY use WebSockets <xref target="RFC6455"/> to send and receive Communication Objects described in <xref target="communication-object"/>. Since WebSockets are a symmetric protocol, a Transceiver MAY send a Communication Object at any time to its Peer. In such communication, a Transceiver sends a Communication Object as Payload data over the WebSocket protocol to a Peer. Similarly, a Transceiver MAY receive a Communication Object from a Peer over a WebSocket connection, wherein the Communication Object is the Payload data. In all such WebSocket communication, the Payload data does not have any Extension data in it.</t>

<section anchor="using-websockets"><name>Using WebSockets</name>
<t>During any communication initiated by a Transceiver, the Transceiver MAY request the Peer to use WebSockets <xref target="RFC6455"/> by requesting that the connection be upgraded to a WebSocket connection. If the Transceiver and its Peer can successfully perform the WebSocket handshake for the Pushpull Subprotocol described in <xref target="pushpull-subprotocol-handshake"/>, then the Transceiver and Peer MUST use WebSockets until the connection is closed. If the handshake fails, the Transceiver and Peer MAY use the HTTP Request Response Binding as described in <xref target="http-request-response-binding"/></t>

<section anchor="pushpull-subprotocol-handshake"><name>Pushpull Subprotocol Handshake</name>
<t>The Pushpull subprotocol is used to transport Communication Objects <xref target="communication-object"/> over a WebSocket connection. The Transceiver and its Peer agree to this subprotocol during the WebSocket handshake (see <xref section="1.3" sectionFormat="of" target="RFC6455"/>).</t>

<t>During the Websocket handshake, the Initiator MUST include the value <spanx style="verb">pushpull</spanx> in the list of protocols for the <spanx style="verb">Sec-WebSocket-Protocol</spanx> header. The reply from the Responder MUST also include the value <spanx style="verb">pushpull</spanx> in the list of values in its own <spanx style="verb">Sec-WebSocket-Protocol</spanx> header, in order for the Initiator and Responder to use WebSockets.</t>

</section>
</section>
</section>
<section anchor="authn-and-authz"><name>Authentication and Authorization</name>

<section anchor="verifying-the-responder"><name>Verifying the Responder</name>
<t>The Initiator MUST verify the identity of the Responder by validating the TLS certification presented by the Responder, and verifying that it is the intended recipient of the request, before sending the Communication Object <xref target="communication-object"/>.</t>

</section>
<section anchor="verifying-the-initiator"><name>Verifying the Initiator</name>
<t>The Responder MUST verify the identity and authorization of the Initiator. The mechanism by which the Responder verifies the Initiator is out of scope of this specification, but may include mechanisms such as Mutual TLS (MTLS) client authentication, or OAuth access tokens.</t>

<t>The Initiator MUST attempt to obtain the OAuth Protected Resource Metadata <xref target="OPRM"/> for the Responder endpoint. If such metadata is found, the Initiator MUST obtain an access token using an OAuth authorization server discovered in the metadata. If no such metadata is found, then the mechanism of authenticating to the Responder is out of scope of this specification.</t>

</section>
</section>
<section anchor="delivery-reliability"><name>Delivery Reliability</name>
<t>A Transceiver MUST attempt to deliver any SETs it has previously attempted to deliver to a Peer until:</t>

<t><list style="symbols">
  <t>It receives an acknowledgement through the <spanx style="verb">ack</spanx> value for that SET in a subsequent communication with the Peer</t>
  <t>It receives a <spanx style="verb">setErrs</spanx> object for that SET in a subsequent communication with the Peer</t>
  <t>It has attempted to deliver the SET a maximum number of times and has failed to communicate either due to communication errors or lack of inclusion in <spanx style="verb">ack</spanx> or <spanx style="verb">setErrs</spanx> in subsequent communications that were conducted for the maximum number of times. The maximum number of attempts MAY be set by the Transceiver for itself and SHOULD be communicated offline to the Peers.</t>
</list></t>

<t>If a Transceiver previously attempted to deliver a SET in a response to a Peer's request, the Transceiver MAY Initiate a request to the Peer in order to retry delivery of the SET. A Peer MUST be able to either provide <spanx style="verb">ack</spanx>s or <spanx style="verb">setErrs</spanx> for the same SETs either through requests or responses.</t>

<section anchor="all-sets-accounted-for"><name>All SETs Accounted For</name>
<t>A Transceiver MUST ensure that it includes the <spanx style="verb">jti</spanx> value of each SET it receives, either in an <spanx style="verb">ack</spanx> or a <spanx style="verb">setErrs</spanx> value, to the Transceiver from which it received the SETs. A Transceiver SHOULD retry sending the same SET again if it was never responded to either in an <spanx style="verb">ack</spanx> value or in a <spanx style="verb">setErrs</spanx> value by a receiving Transceiver in a reasonable time period. A Transceiver MAY limit the number of times it retries sending a SET. A Transceiver MAY publish the retry time period and maximum number of retries to its peers, but such publication is outside the scope of this specification.</t>

</section>
</section>
<section anchor="conformance"><name>Conformance</name>

<t>This section describes conformance criteria for entities conforming to this specification.</t>

<section anchor="multi-push"><name>Multi-Push</name>

<t>The "Multi-Push" conformance class enables a Transmitter to deliver multiple SETs to a Receiver. To conform to the "Multi-Push" class, a Transceiver acts as only one role: a Transmitter or Receiver.</t>

<t><list style="symbols">
  <t>A Transmitter MUST support <spanx style="verb">sets</spanx> in the request Communication Object.</t>
  <t>A Receiver MUST support <spanx style="verb">acks</spanx> and <spanx style="verb">setErrs</spanx> in the response Communication Object.</t>
</list></t>

</section>
<section anchor="push-pull"><name>Push-Pull</name>

<t>The "Push-Pull" conformance class enables bidirectional communication between Transceivers to both send and receive SETs in the same request and response. Transceivers MUST support <spanx style="verb">sets</spanx>, <spanx style="verb">acks</spanx> and <spanx style="verb">setErrs</spanx> in all Communication Objects.</t>

</section>
</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<section anchor="authentication-and-authorization"><name>Authentication and Authorization</name>
<t>Transceivers MUST follow the procedures described in <xref target="authn-and-authz"/> in order to securely authenticate and authorize Peers.</t>

</section>
<section anchor="http-and-tls"><name>HTTP and TLS</name>
<t>Transceivers MUST use TLS <xref target="RFC8446"/> to communicate with Peers and is subject to the security considerations of HTTP <xref target="RFC9110"/> Section 17.</t>

</section>
<section anchor="denial-of-service"><name>Denial of Service</name>
<t>A Responder may be vulnerable to denial of service attacks wherein a large number of spurious requests need to be processed. Having efficient authorization mechanisms such as OAuth 2.0 <xref target="RFC6749"/> can mitigate such attacks by leveraging standard infrastructure that is designed to handle such attacks.</t>

</section>
<section anchor="temporary-disconnection"><name>Temporary Disconnection</name>
<t>Transceivers must make sure they respond to each SET received in a timely manner as described in the "All SETs Accounted For" (<xref target="all-sets-accounted-for"/>). This ensures that if there was a temporary disconnection between two Transceivers, for example when a Responding Transceiver sent a Communication Object in the HTTP Response, that such disconnection is detected and the missing SETs can be retried.</t>

</section>
</section>
<section anchor="privacy-considerations"><name>Privacy Considerations</name>
<t>SETs may contain confidential information, and Transceivers receiving SETs must be careful not to log such content or ensure that sensitive information from the SET is redacted before logging.</t>

</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>
<t>The following WebSocket subprotocol will be added to the "WebSocket Subprotocol Name Registry" <xref target="IANA.WebSocket.Subprotocol"/></t>

<t><list style="symbols">
  <t>Subprotocol Identifier: <spanx style="verb">pushpull</spanx></t>
  <t>Subprotocol Common Name: <spanx style="verb">WebSocket transport for Pushpull delivery of SETs</spanx></t>
  <t>Subprotocol Definition: Section <xref target="pushpull-subprotocol-handshake"/> of this document.</t>
</list></t>

</section>


  </middle>

  <back>



    <references title='Normative References' anchor="sec-normative-references">



<reference anchor="RFC2119">
  <front>
    <title>Key words for use in RFCs to Indicate Requirement Levels</title>
    <author fullname="S. Bradner" initials="S." surname="Bradner"/>
    <date month="March" year="1997"/>
    <abstract>
      <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="2119"/>
  <seriesInfo name="DOI" value="10.17487/RFC2119"/>
</reference>
<reference anchor="RFC6455">
  <front>
    <title>The WebSocket Protocol</title>
    <author fullname="I. Fette" initials="I." surname="Fette"/>
    <author fullname="A. Melnikov" initials="A." surname="Melnikov"/>
    <date month="December" year="2011"/>
    <abstract>
      <t>The WebSocket Protocol enables two-way communication between a client running untrusted code in a controlled environment to a remote host that has opted-in to communications from that code. The security model used for this is the origin-based security model commonly used by web browsers. The protocol consists of an opening handshake followed by basic message framing, layered over TCP. The goal of this technology is to provide a mechanism for browser-based applications that need two-way communication with servers that does not rely on opening multiple HTTP connections (e.g., using XMLHttpRequest or s and long polling). [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="6455"/>
  <seriesInfo name="DOI" value="10.17487/RFC6455"/>
</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="RFC8174">
  <front>
    <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
    <author fullname="B. Leiba" initials="B." surname="Leiba"/>
    <date month="May" year="2017"/>
    <abstract>
      <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="8174"/>
  <seriesInfo name="DOI" value="10.17487/RFC8174"/>
</reference>
<reference anchor="RFC8259">
  <front>
    <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
    <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
    <date month="December" year="2017"/>
    <abstract>
      <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t>
      <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="90"/>
  <seriesInfo name="RFC" value="8259"/>
  <seriesInfo name="DOI" value="10.17487/RFC8259"/>
</reference>
<reference anchor="RFC8417">
  <front>
    <title>Security Event Token (SET)</title>
    <author fullname="P. Hunt" initials="P." role="editor" surname="Hunt"/>
    <author fullname="M. Jones" initials="M." surname="Jones"/>
    <author fullname="W. Denniss" initials="W." surname="Denniss"/>
    <author fullname="M. Ansari" initials="M." surname="Ansari"/>
    <date month="July" year="2018"/>
    <abstract>
      <t>This specification defines the Security Event Token (SET) data structure. A SET describes statements of fact from the perspective of an issuer about a subject. These statements of fact represent an event that occurred directly to or about a security subject, for example, a statement about the issuance or revocation of a token on behalf of a subject. This specification is intended to enable representing security- and identity-related events. A SET is a JSON Web Token (JWT), which can be optionally signed and/or encrypted. SETs can be distributed via protocols such as HTTP.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8417"/>
  <seriesInfo name="DOI" value="10.17487/RFC8417"/>
</reference>
<reference anchor="RFC8446">
  <front>
    <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
    <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
    <date month="August" year="2018"/>
    <abstract>
      <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
      <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8446"/>
  <seriesInfo name="DOI" value="10.17487/RFC8446"/>
</reference>
<reference anchor="RFC8935">
  <front>
    <title>Push-Based Security Event Token (SET) Delivery Using HTTP</title>
    <author fullname="A. Backman" initials="A." role="editor" surname="Backman"/>
    <author fullname="M. Jones" initials="M." role="editor" surname="Jones"/>
    <author fullname="M. Scurtescu" initials="M." surname="Scurtescu"/>
    <author fullname="M. Ansari" initials="M." surname="Ansari"/>
    <author fullname="A. Nadalin" initials="A." surname="Nadalin"/>
    <date month="November" year="2020"/>
    <abstract>
      <t>This specification defines how a Security Event Token (SET) can be delivered to an intended recipient using HTTP POST over TLS. The SET is transmitted in the body of an HTTP POST request to an endpoint operated by the recipient, and the recipient indicates successful or failed transmission via the HTTP response.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8935"/>
  <seriesInfo name="DOI" value="10.17487/RFC8935"/>
</reference>
<reference anchor="RFC8936">
  <front>
    <title>Poll-Based Security Event Token (SET) Delivery Using HTTP</title>
    <author fullname="A. Backman" initials="A." role="editor" surname="Backman"/>
    <author fullname="M. Jones" initials="M." role="editor" surname="Jones"/>
    <author fullname="M. Scurtescu" initials="M." surname="Scurtescu"/>
    <author fullname="M. Ansari" initials="M." surname="Ansari"/>
    <author fullname="A. Nadalin" initials="A." surname="Nadalin"/>
    <date month="November" year="2020"/>
    <abstract>
      <t>This specification defines how a series of Security Event Tokens (SETs) can be delivered to an intended recipient using HTTP POST over TLS initiated as a poll by the recipient. The specification also defines how delivery can be assured, subject to the SET Recipient's need for assurance.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8936"/>
  <seriesInfo name="DOI" value="10.17487/RFC8936"/>
</reference>
<reference anchor="RFC9110">
  <front>
    <title>HTTP Semantics</title>
    <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
    <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
    <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
    <date month="June" year="2022"/>
    <abstract>
      <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
      <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="97"/>
  <seriesInfo name="RFC" value="9110"/>
  <seriesInfo name="DOI" value="10.17487/RFC9110"/>
</reference>

<reference anchor="OPRM" target="https://datatracker.ietf.org/doc/draft-ietf-oauth-resource-metadata/">
  <front>
    <title>OAuth 2.0 Protected Resource Metadata</title>
    <author initials="M. B." surname="Jones" fullname="Michael B. Jones">
      <organization></organization>
    </author>
    <author initials="P." surname="Hunt" fullname="Phil Hunt">
      <organization></organization>
    </author>
    <author initials="A." surname="Parecki" fullname="Aaron Parecki">
      <organization></organization>
    </author>
    <date year="2024" month="May"/>
  </front>
</reference>
<reference anchor="IANA.WebSocket.Subprotocol" target="https://www.iana.org/assignments/websocket/websocket.xml#subprotocol-name">
  <front>
    <title>WebSocket Subprotocol Name Registry</title>
    <author initials="" surname="IANA" fullname="IANA">
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>


    </references>




    <section anchor="contributors" numbered="false" toc="include" removeInRFC="false">
        <name>Contributors</name>
    <contact initials="E." surname="Gustavson" fullname="Erik Gustavson">
      <organization>SGNL</organization>
      <address>
        <email>erik@sgnl.ai</email>
      </address>
    </contact>
    </section>

  </back>

<!-- ##markdown-source:
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
kMmsUqWTYlHkSwQU+dxbgFULQjnupzmzN2dLubUTkSJ/QI8uw/B/WpV+wFWK
5DFVCXf7WIXpCuKMJdlBZJkKsOWO2lbFbaNCS2Eiky9jyF1ISRAPQ/jviaGD
bAkbwk4wkljJpJqo1Mx0MyAVYyZcKUgrify5QwmajIoX6owvC/sUazYLl/lM
l7o08O+C/PTJuPzKPMgnKF9ICSGCfbC2ydkWwKeBUgS7TG+p9K9//cuY4aHZ
N0CvjGanfGJ8o8yo7IztxrHD6ma70eZms9U4NC1ut03rmNUOudNs2U0Oo+Vg
vr6dWte26IvbzvOmU+uJ23aFXsGb353rOb6Zj7zupn/9OO2Kaqu7cd27wUOt
uxnGQ+9l1n+qif715dee9zLvXbzMetfP4u6cQNwuhm8Poj+7rPYGk2p/MKx2
Lx6ijudu7HXnsONNq87N2aYvjt/tem9hPbVcfn0V29df3Tuv904grKcOTLiq
jc47h6/r28C5eVzZm+D9rtGbsdfqcvQ2nVpvZ9HoqTWz6tX3R+/FHd103/uD
6bw3IBCdam925Q0HL2LodZu9zbzWH/REb2PXeucI/KewaF+PXl/m9vq4Nrqw
60BGrTsYie7rw6p/AWS9PgA+dn30+tzouFUA+gK/W1Ukk8vDo9ua7TUP2etL
dTRbrIZvwPa37iGtOFi4jveydC4WM9t7mTrAwL4fCfjtdWaBYDePVQJh33QP
79btzbDuxnfeS3P4WltZ18/LYb0d39VeNqO3283d5gEWGH7tXYDUZvP60Huo
D1879e4rgXhu9Aadr6OLOYjodgrMXLPX25pz/bLpzBYWSGbeEStheVfxCBnv
E9A+LOTic4nF9dXGbjjvtveAQFzr9Wph3XTF21utPX6ovC1fnm9fw+dD97jq
2LfH1uBxbPKwu7mKH66GsgowH931TPO3jdM+DiCFlVrbbjSaNeaYR41622w6
Ncu0WJOZ7fH4cNweN5rVaqN8sqW0S6vecjt+taiznc3o4mzWrfc8EHgD1Q84
8RUFD8+94ewK/n10e/WHTZeUwJ06Umc7h11Q7v7FQ6s3O133nlaCvfU2Wg7f
E0HCoeHby1yyM1Ut5k1rQ5FXrYxWtfrXoFGzBy2n0bT3eiuGm0mjP3hudeud
Rm/zXMUVMlj8zm5exJYiVEeuBPH6CNoAe3IzXPUunmF/ouBPm73Zw1fU4d5m
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
cZk8ibr011Eq8kuLFl5L/m+oIMu0o1cAAA==

-->

</rfc>

