<?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-01" 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="September" day="18"/>

    <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. 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. 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. In addition, this specification enables the transmission and reception of multiple SETs in one HTTP 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 74?>

<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.</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>OPTIONAL. The short reason why the specified SET failed to be processed.</t>
      </dd>
      <dt>description</dt>
      <dd>
        <t>OPTIONAL. 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": {
    "4d3559ec67504aaba65d40b0363faad8": 
    "eyJhbGciOiJub25lIn0.
    eyJqdGkiOiI0ZDM1NTllYzY3NTA0YWFiYTY1ZDQwYjAzNjNmYWFkOCIsImlhdC
    I6MTQ1ODQ5NjQwNCwiaXNzIjoiaHR0cHM6Ly9zY2ltLmV4YW1wbGUuY29tIiwi
    YXVkIjpbImh0dHBzOi8vc2NpbS5leGFtcGxlLmNvbS9GZWVkcy85OGQ1MjQ2MW
    ZhNWJiYzg3OTU5M2I3NzU0IiwiaHR0cHM6Ly9zY2ltLmV4YW1wbGUuY29tL0Zl
    ZWRzLzVkNzYwNDUxNmIxZDA4NjQxZDc2NzZlZTciXSwiZXZlbnRzIjp7InVybj
    ppZXRmOnBhcmFtczpzY2ltOmV2ZW50OmNyZWF0ZSI6eyJyZWYiOiJodHRwczov
    L3NjaW0uZXhhbXBsZS5jb20vVXNlcnMvNDRmNjE0MmRmOTZiZDZhYjYxZTc1Mj
    FkOSIsImF0dHJpYnV0ZXMiOlsiaWQiLCJuYW1lIiwidXNlck5hbWUiLCJwYXNz
    d29yZCIsImVtYWlscyJdfX19.",
    "3d0c3cf797584bd193bd0fb1bd4e7d30":
    "eyJhbGciOiJub25lIn0.
    eyJqdGkiOiIzZDBjM2NmNzk3NTg0YmQxOTNiZDBmYjFiZDRlN2QzMCIsImlhdC
    I6MTQ1ODQ5NjAyNSwiaXNzIjoiaHR0cHM6Ly9zY2ltLmV4YW1wbGUuY29tIiwi
    YXVkIjpbImh0dHBzOi8vamh1Yi5leGFtcGxlLmNvbS9GZWVkcy85OGQ1MjQ2MW
    ZhNWJiYzg3OTU5M2I3NzU0IiwiaHR0cHM6Ly9qaHViLmV4YW1wbGUuY29tL0Zl
    ZWRzLzVkNzYwNDUxNmIxZDA4NjQxZDc2NzZlZTciXSwic3ViIjoiaHR0cHM6Ly
    9zY2ltLmV4YW1wbGUuY29tL1VzZXJzLzQ0ZjYxNDJkZjk2YmQ2YWI2MWU3NTIx
    ZDkiLCJldmVudHMiOnsidXJuOmlldGY6cGFyYW1zOnNjaW06ZXZlbnQ6cGFzc3
    dvcmRSZXNldCI6eyJpZCI6IjQ0ZjYxNDJkZjk2YmQ2YWI2MWU3NTIxZDkifSwi
    aHR0cHM6Ly9leGFtcGxlLmNvbS9zY2ltL2V2ZW50L3Bhc3N3b3JkUmVzZXRFeH
    QiOnsicmVzZXRBdHRlbXB0cyI6NX19fQ."
  },
  "ack": [
    "f52901c4-3996-11ef-9454-0242ac120002",
    "0636e274-3997-11ef-9454-0242ac120002",
    "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>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 processing the request, it MUST return the HTTP status code 200 (OK). 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. 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": {
    "4d3559ec67504aaba65d40b0363faad8": 
    "eyJhbGciOiJub25lIn0.
    eyJqdGkiOiI0ZDM1NTllYzY3NTA0YWFiYTY1ZDQwYjAzNjNmYWFkOCIsImlhdC
    I6MTQ1ODQ5NjQwNCwiaXNzIjoiaHR0cHM6Ly9zY2ltLmV4YW1wbGUuY29tIiwi
    YXVkIjpbImh0dHBzOi8vc2NpbS5leGFtcGxlLmNvbS9GZWVkcy85OGQ1MjQ2MW
    ZhNWJiYzg3OTU5M2I3NzU0IiwiaHR0cHM6Ly9zY2ltLmV4YW1wbGUuY29tL0Zl
    ZWRzLzVkNzYwNDUxNmIxZDA4NjQxZDc2NzZlZTciXSwiZXZlbnRzIjp7InVybj
    ppZXRmOnBhcmFtczpzY2ltOmV2ZW50OmNyZWF0ZSI6eyJyZWYiOiJodHRwczov
    L3NjaW0uZXhhbXBsZS5jb20vVXNlcnMvNDRmNjE0MmRmOTZiZDZhYjYxZTc1Mj
    FkOSIsImF0dHJpYnV0ZXMiOlsiaWQiLCJuYW1lIiwidXNlck5hbWUiLCJwYXNz
    d29yZCIsImVtYWlscyJdfX19.",
    "3d0c3cf797584bd193bd0fb1bd4e7d30":
    "eyJhbGciOiJub25lIn0.
    eyJqdGkiOiIzZDBjM2NmNzk3NTg0YmQxOTNiZDBmYjFiZDRlN2QzMCIsImlhdC
    I6MTQ1ODQ5NjAyNSwiaXNzIjoiaHR0cHM6Ly9zY2ltLmV4YW1wbGUuY29tIiwi
    YXVkIjpbImh0dHBzOi8vamh1Yi5leGFtcGxlLmNvbS9GZWVkcy85OGQ1MjQ2MW
    ZhNWJiYzg3OTU5M2I3NzU0IiwiaHR0cHM6Ly9qaHViLmV4YW1wbGUuY29tL0Zl
    ZWRzLzVkNzYwNDUxNmIxZDA4NjQxZDc2NzZlZTciXSwic3ViIjoiaHR0cHM6Ly
    9zY2ltLmV4YW1wbGUuY29tL1VzZXJzLzQ0ZjYxNDJkZjk2YmQ2YWI2MWU3NTIx
    ZDkiLCJldmVudHMiOnsidXJuOmlldGY6cGFyYW1zOnNjaW06ZXZlbnQ6cGFzc3
    dvcmRSZXNldCI6eyJpZCI6IjQ0ZjYxNDJkZjk2YmQ2YWI2MWU3NTIxZDkifSwi
    aHR0cHM6Ly9leGFtcGxlLmNvbS9zY2ltL2V2ZW50L3Bhc3N3b3JkUmVzZXRFeH
    QiOnsicmVzZXRBdHRlbXB0cyI6NX19fQ."
  },
  "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 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": [
    "3d0c3cf797584bd193bd0fb1bd4e7d30"
  ],
  "sets": {
    "756E69717565206964656E746966696572":
    "eyJ0eXAiOiJzZWNldmVudCtqd3QiLCJhbGciOiJIUzI1NiJ9Cg.
  eyJpc3MiOiJodHRwczovL2lkcC5leGFtcGxlLmNvbS8iLCJqdGkiOiI3NTZFNjk
  3MTc1NjUyMDY5NjQ2NTZFNzQ2OTY2Njk2NTcyIiwiaWF0IjoxNTA4MTg0ODQ1LC
  JhdWQiOiI2MzZDNjk2NTZFNzQ1RjY5NjQiLCJldmVudHMiOnsiaHR0cHM6Ly9zY
  2hlbWFzLm9wZW5pZC5uZXQvc2VjZXZlbnQvcmlzYy9ldmVudC10eXBlL2FjY291
  bnQtZGlzYWJsZWQiOnsic3ViamVjdCI6eyJzdWJqZWN0X3R5cGUiOiJpc3Mtc3V
  iIiwiaXNzIjoiaHR0cHM6Ly9pZHAuZXhhbXBsZS5jb20vIiwic3ViIjoiNzM3NT
  YyNkE2NTYzNzQifSwicmVhc29uIjoiaGlqYWNraW5nIn19fQ.
  Y4rXxMD406P2edv00cr9Wf3_XwNtLjB9n-jTqN1_lLc"
  }
}
]]></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>
<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>

<t>The Responder MUST verify the identity and authorization of the Initiator. The Responder MAY use OAuth Protected Resource Metadata <xref target="OPRM"/> for this purpose, but the Responder MAY use other means to authorize the Initiator, which are beyond the scope of this specification.</t>

</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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
pWS6WnjDOpolBNkvgtcl3GQNOnlKqOWFDLi8xtTyNspNWcIQplQ5MUtrilzA
SZflTMV8vSrnZ6Qe0uj0fNAYJs0PXPYTG8xtzCzS9bU5jNT7xBx+lLrjAosk
nRfiKDyjBGp1lmKKpMnGydigHs9DxThCJYp5PMeUFdgLDo391v/nZ6VTCc9o
HtVaMrpU2aJLiTbkpydS8vuUSzMIfCUw0rCHUq4tO6JMqY9ZZBCmOMixPs1d
S12zXFJ0F6bm0MfBQHIYzEIyd2osMY8X3MZAO6tGtYXCue3gS1PYn8esP2Z9
Mv2Jq9pan8PCWCItHl8a65XN+ZNzlW9g779h9eObDju+qTTcCSgOsIMwI886
9Y1Sb5A9kLpN7XValEgQwVNXqoqgRhMzVQUGkItkRKVCjVkWuPFAibvO5dfJ
klkf/juT7jADAhmSUoyzzU6rjdDLqZwctbBEjurLmush9flSr9ZL5wG2WkV0
ZB2pE+tKnDkh8JZB+FzVGJWOMvqD/T95/SkdUIOEXNGrfXYoAGqIiVSIeR0k
Usur4+7iaXWCYXySdg3uV916T17sVavAvfdM1JvEm3+VFP4qKfxVUvirpPBX
SeFPKCn8f83fCbn1MHif1WuF1F67o0qSgeWz+ST70t8hie+qOIBbQca/bjmd
cwKRO6Sh7CBx9CqCr5qYKKLGsqSFIBTqlDaJ4rCnalueWjVe+38ZGKhp+xl3
b9w6RcP9f/7MX+ec7S/auGwZKCNDu+3OSWdvtw5/241aZ6/T6sCb3RY8deC/
9m4jYx1r4ukAreNq9NhTqncUf3eaZKeN5eyaqODoGY0n6pXdvMr5jsuG+2If
FY3WV4RizCzo2ui0N30BCM0r8Ba96T3EIEN02w36tLpp9O+GDRgC/wZ1QRMG
7gqszRvEA60rsMxgbOuXaH0vJo4KYxpXYL7VFAJRv50SyDVTkrPJAKExca3H
09Wlt7cAfQZD0QafdwN+/2GqLQsYE3c1BDug2FIHVh26l43TKZi2OkCAIfHo
DIY8XkSjR631YB659zDV9mflPF58B87Wnpq3bfvsHnmGvIthHECQROO605iN
zg/WPDCONda3t7oCdgKE4bL3cgK0D1dAO1kxsDsTu7E3J5Bn7vfhYw9Cvrbf
9cn24JxW+PR2ddyqda4bwnmt1exw73Hc/NfTohdfTg/3/Mr07nuv/i/30i5v
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

-->

</rfc>

