<?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.17 (Ruby 3.3.3) -->


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

]>


<rfc ipr="trust200902" docName="draft-tulshibagwale-saag-pushpull-delivery-02" 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>

    <date year="2024" month="October" day="02"/>

    <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 72?>
<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>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 bi-directional transmission and reception of multiple SETs in one HTTP connection, and enables them to do so over a single HTTP or WebSocket connection.</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 76?>

<section anchor="introduction"><name>Introduction</name>
<t>Workloads that exchange SETs <xref target="RFC8417"/> with each other ("Transceivers") can do so efficiently using the protocol defined in this specification. Although this specification works along the lines of the DeliveryPush <xref target="RFC8935"/> and DeliveryPoll <xref target="RFC8936"/> specifications, it makes a few important additions:</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>

</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>Transceiver</dt>
  <dd>
    <t>A networked workload 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 used in this specification used both in requests and responses. When used in a request, the Initiator MAY have additional fields defined 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>Positively or negatively acknowledge previously received SETs from the Peer.</t>
  <t>Send SETs to 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 "application/json". 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 "application/json" 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>

<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 the metadata. If no such metadata is found, then the Initiator MAY use any means to authorize itself to the Responder.</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 Responder MAY use common authentication schemes such as Mutual TLS (MTLS) to verify the authenticity of the Initiator.</t>

<t>Alternatively, the Responder MAY provide OAuth Protected Resource Metadata <xref target="OPRM"/> to enable Initiators to obtain appropriate OAuth tokens to authenticate themselves and prove their authorization.</t>

<t>Finally, the Responder MAY use other means to authenticate and authorize the Initiator, which are beyond the 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>
<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 anchor="uniqueness-of-sets"><name>Uniqueness of SETs</name>
<t>A Transceiver MUST NOT send two SETs with the same <spanx style="verb">jti</spanx> value if the SET has been either acknowledged through <spanx style="verb">ack</spanx> value or produced an error indicated by a <spanx style="verb">setErrs</spanx> value. If a Transceiver wishes to re-send an event after it has received a error response through a <spanx style="verb">setErrs</spanx> value, then it MUST generate a new SET that has a new (and unique) <spanx style="verb">jti</spanx> value.</t>

</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 section <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" section <xref target="all-sets-accounted-for"/>. This ensures that if there was a temporary disconnection between two Transceivers, say 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">puhspull</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>
    <contact initials="A." surname="Deshpande" fullname="Apoorva Deshpande">
      <organization>Okta</organization>
      <address>
        <email>apoorva.deshpande@okta.com</email>
      </address>
    </contact>
    </section>

  </back>

<!-- ##markdown-source:
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
zkazTm04mPx/Ter/bk3q92M2mlUP6xN+2Kkdi5ex7w1XzXbn5sJuTc+PZafe
YHTavplfTg46x3+xJvWdQioI6KZ3djEdnVYb3U2ndTO4n3efO/HQO68OH6qt
kTesj2au193crbpn3Z1Cu+rOHv9NQltfBM5z598rtNuqXf+a0Po9AKS3SCB2
7xOAP9n1pzUAr/Yuh/UuWILR5bDV867nPe9CAPayNNbbPK5hpRbKjyw43aOs
HYBsra3ZYjF6uff6/snUBpmzNwsS7r5Sn74vsSjUiWR5SBnMnavrhSU5/WqO
aEUOyC22pR6etkE/exun3l6PLq5du04gnqr3L9OqRB0fPlXvXu6rI9BBqrXN
ntrjl2qlc2ld9r2Hk3j9cLjqX6670+crftiQHBlOrMvZY8A3c9PuLIabJz5M
K1n/W8tGhNzHJOvIqFULFSXlA80kv88XkZLcXr0vv2PPLMVcVpBx6jvOlJPA
MFvIwIgviTBkjljRwVhE3ZRJZ03IZfNCEktjx+KuSkhFhwv/YkQipx1l4gwd
T1DC1f/9R4FCzssrC3noNBttvm9atWoDK5YH5uG+0zadVrtVs/nBARjNXBUy
I0uNcc1ujWFGu223zKZdt0zWZg1z/5CzdtXibZu1M9a1yl+O0YZuRs89pRPx
n06DDP5uy7uwG118k7F37tw+LRqOQ4SSHh3MLmY9VYif9dbVVv+5WwNTPet6
YKoH7rS7rtb7l0/TPsQfo4E7Gw7IeWkrXeueTb71z+6a0tqcPSaWtzMbbnrz
bh1MeK03B8939nTZA5coDWjWQWuMCYSKLS6f4uFLd2k1TlwL3OKN13LBMGQI
0l6zl94sqWa/3Lfsy0el58+9mdXAQbU5DJoOvW/uSNbTN87z9Z8ARBkSsLgg
NsPG/di5clfgc8H6Egj0NjUY3KG9/gJhaQ6BAOqC3wOHMevU75AGs26jd3rd
hkHr0fPFxqo3CSh7XkyH9XhhebYYgxOv/HG9msm+/3q3fmx9e729v7++Fq3f
Z+4fL3zxypcTx2k/W3+cTOvXs8OovKW6nNoCXYPZaQzkgB3WoFh8yih/RM2l
aRtGhBnxNn1G7Yek7lU4VIikQ/VAt1LorEikZbGB7N2H//uBtBWRsh7bahdY
AE9bklXRu5QrXGOWhIXrZJjqOsabMO/v1EKHVdZsr95P1K53lhiMB0hoc6sx
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
FeiPZFTkF6ksvPH739HiIHh8UAAA

-->

</rfc>

