<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.39 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-meunier-webbotauth-httpsig-protocol-00" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.0 -->
  <front>
    <title abbrev="HTTP Message Signatures for Bots">HTTP Message Signatures for automated traffic</title>
    <seriesInfo name="Internet-Draft" value="draft-meunier-webbotauth-httpsig-protocol-00"/>
    <author fullname="Thibault Meunier">
      <organization>Cloudflare</organization>
      <address>
        <email>ot-ietf@thibault.uk</email>
      </address>
    </author>
    <author fullname="Sandor Major">
      <organization>Google</organization>
      <address>
        <email>ietf@sandormajor.com</email>
      </address>
    </author>
    <date year="2026" month="June" day="26"/>
    <area>Web and Internet Transport</area>
    <workgroup>Web Bot Auth</workgroup>
    <keyword>not-yet</keyword>
    <abstract>
      <?line 54?>

<t>This document describes an architecture for identifying automated
traffic using <xref target="HTTP-MESSAGE-SIGNATURES"/>. The goal
is to allow automated HTTP clients to cryptographically sign outbound
requests, allowing HTTP servers to verify their identity with confidence.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://thibmeu.github.io/http-message-signatures-directory/draft-meunier-webbotauth-httpsig-protocol.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-meunier-webbotauth-httpsig-protocol/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Web Bot Auth Working Group mailing list (<eref target="mailto:web-bot-auth@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/web-bot-auth/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/web-bot-auth/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/thibmeu/http-message-signatures-directory"/>.</t>
    </note>
  </front>
  <middle>
    <?line 62?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Agents are increasingly used in business and user workflows, including AI assistants,
search indexing, content aggregation, and automated testing. These agents need to reliably identify
themselves to origins for several reasons:</t>
      <ol spacing="normal" type="1"><li>
          <t>Regulatory compliance requiring transparency of automated systems</t>
        </li>
        <li>
          <t>Origin resource management and access control</t>
        </li>
        <li>
          <t>Protection against impersonation and reputation management</t>
        </li>
        <li>
          <t>Service level differentiation between human and automated traffic</t>
        </li>
      </ol>
      <t>Current identification methods such as IP allowlisting, User-Agent strings, or shared API keys have
significant limitations in security, scalability, and manageability. This document defines an
architecture enabling agents to cryptographically identify themselves using <xref target="HTTP-MESSAGE-SIGNATURES"/>.
It proposes that every request from bots be signed by a private key owned by its provider.
This way, every origin can validate the service identity.</t>
    </section>
    <section anchor="motivation">
      <name>Motivation</name>
      <t>There is an increase in agent traffic on the Internet. Many agents
choose to identify their traffic today via IP Address lists and/or unique
User-Agents. This is often done to demonstrate trust and safety claims, support
allowlisting/denylisting the traffic in a granular manor, and enable sites to
monitor and rate limit per agent operator. However, these mechanisms have drawbacks:</t>
      <ol spacing="normal" type="1"><li>
          <t>User-Agent, when used alone, can be spoofed meaning anyone may attempt to
act as that agent. It is also overloaded - an agent may be using Chromium and
wish to present itself as such to ensure rendering works, yet it still wants to
differentiate its traffic to the site.</t>
        </li>
        <li>
          <t>IP blocks alone can present a confusing story. IPs on cloud plaforms have
layers of ownership - the platform owns the IP and registers it in their
published IP blocks, only to be re-published by the agent with little to bind
the publication to the actual service provider that may be renting infra. Purchasing
dedicated IP blocks is expensive, time consuming, and requires significant
specialist knowledge to set up. These IP blocks may have prior reputation
history that needs to be carefully inspected and managed before purchase and
use.</t>
        </li>
        <li>
          <t>An agent may go to every website on the Internet and share a secret with
them like a Bearer from <xref target="OAUTH-BEARER"/>. This is impractical to scale for any
agent beyond select partnerships, and insecure, as key rotation is challenging
and becomes less secure as the consumers scale.</t>
        </li>
      </ol>
      <t>Using well-established cryptography, we can instead define a simple and secure
mechanism that empowers small and large agents to share their identity.</t>
      <section anchor="http-layer-choice">
        <name>HTTP layer choice</name>
        <t>This architecture operates solely at the HTTP layer.
It allows signatures to be generated and
verified without modifying the transport layer or TLS stack. It enables
flexible deployment across proxies, gateways, and origin servers, and aligns
with existing tooling and infrastructure that already inspect and manipulate
HTTP headers.</t>
        <t>Because the signature is embedded in the request itself, it travels with the
message through intermediaries, preserving end-to-end verifiability even when
requests are forwarded or transformed within the HTTP layer.</t>
      </section>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<t>The following terms are used throughout this document:</t>
      <dl>
        <dt><strong>User</strong></dt>
        <dd>
          <t>An entity initiating requests through an agent. May be a human operator or another system.</t>
        </dd>
        <dt><strong>Agent</strong></dt>
        <dd>
          <t>An orchestrated user agent (e.g. Chromium, CURL). It implements the HTTP protocol and constructs valid HTTP requests with <xref target="HTTP-MESSAGE-SIGNATURES"/> signatures.</t>
        </dd>
        <dt><strong>Origin</strong></dt>
        <dd>
          <t>An HTTP server receiving signed requests that implements the HTTP protocol and verifies <xref target="HTTP-MESSAGE-SIGNATURES"/> signatures. It acts as a verifier of the signature as defined by <xref target="HTTP-MESSAGE-SIGNATURES"/>.</t>
        </dd>
      </dl>
    </section>
    <section anchor="architecture">
      <name>Architecture</name>
      <artset>
        <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="192" width="608" viewBox="0 0 608 192" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
            <path d="M 8,32 L 8,176" fill="none" stroke="black"/>
            <path d="M 80,32 L 80,176" fill="none" stroke="black"/>
            <path d="M 208,32 L 208,176" fill="none" stroke="black"/>
            <path d="M 288,32 L 288,176" fill="none" stroke="black"/>
            <path d="M 512,32 L 512,176" fill="none" stroke="black"/>
            <path d="M 600,32 L 600,176" fill="none" stroke="black"/>
            <path d="M 8,32 L 80,32" fill="none" stroke="black"/>
            <path d="M 208,32 L 288,32" fill="none" stroke="black"/>
            <path d="M 512,32 L 600,32" fill="none" stroke="black"/>
            <path d="M 296,62 L 336,62" fill="none" stroke="black"/>
            <path d="M 296,66 L 336,66" fill="none" stroke="black"/>
            <path d="M 464,62 L 504,62" fill="none" stroke="black"/>
            <path d="M 464,66 L 504,66" fill="none" stroke="black"/>
            <path d="M 80,96 L 104,96" fill="none" stroke="black"/>
            <path d="M 184,96 L 200,96" fill="none" stroke="black"/>
            <path d="M 288,112 L 312,112" fill="none" stroke="black"/>
            <path d="M 488,112 L 504,112" fill="none" stroke="black"/>
            <path d="M 296,128 L 360,128" fill="none" stroke="black"/>
            <path d="M 448,128 L 512,128" fill="none" stroke="black"/>
            <path d="M 88,144 L 104,144" fill="none" stroke="black"/>
            <path d="M 192,144 L 208,144" fill="none" stroke="black"/>
            <path d="M 8,176 L 80,176" fill="none" stroke="black"/>
            <path d="M 208,176 L 288,176" fill="none" stroke="black"/>
            <path d="M 512,176 L 600,176" fill="none" stroke="black"/>
            <polygon class="arrowhead" points="512,112 500,106.4 500,117.6" fill="black" transform="rotate(0,504,112)"/>
            <polygon class="arrowhead" points="512,64 500,58.4 500,69.6" fill="black" transform="rotate(0,504,64)"/>
            <polygon class="arrowhead" points="304,128 292,122.4 292,133.6" fill="black" transform="rotate(180,296,128)"/>
            <polygon class="arrowhead" points="304,64 292,58.4 292,69.6" fill="black" transform="rotate(180,296,64)"/>
            <polygon class="arrowhead" points="208,96 196,90.4 196,101.6" fill="black" transform="rotate(0,200,96)"/>
            <polygon class="arrowhead" points="96,144 84,138.4 84,149.6" fill="black" transform="rotate(180,88,144)"/>
            <g class="text">
              <text x="396" y="52">Exchange</text>
              <text x="400" y="68">Cryptographic</text>
              <text x="396" y="84">material</text>
              <text x="44" y="100">User</text>
              <text x="144" y="100">Request</text>
              <text x="248" y="100">Agent</text>
              <text x="556" y="100">Origin</text>
              <text x="352" y="116">Request</text>
              <text x="392" y="116">+</text>
              <text x="440" y="116">Signature</text>
              <text x="404" y="132">Response</text>
              <text x="148" y="148">Response</text>
            </g>
          </svg>
        </artwork>
        <artwork type="ascii-art"><![CDATA[
+--------+               +---------+                           +----------+
|        |               |         |         Exchange          |          |
|        |               |         |<===== Cryptographic =====>|          |
|        |               |         |         material          |          |
|  User  +--- Request -->|  Agent  |                           |  Origin  |
|        |               |         +--- Request + Signature -->|          |
|        |               |         |<-------- Response --------+          |
|        |<-- Response --+         |                           |          |
|        |               |         |                           |          |
+--------+               +---------+                           +----------+
]]></artwork>
      </artset>
      <t>A User initiates an action requiring the Agent to perform an HTTP request.
The Agent constructs the request, generates a signature using its signing key,
and includes it in the request as defined in <xref section="3.1" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>
along with the <tt>Signature-Agent</tt> header for discovery of its verification key.
Upon receiving the request, the Origin ensures it has the verification key for the Agent,
validates the signature, and processes the request if the signature is valid.</t>
      <section anchor="deployment-models">
        <name>Deployment Models</name>
        <t>Signature verification can be performed either directly by origins or delegated
to a fronting proxy. Direct verification by origins provides simplicity and
control. Proxy verification offloads processing and enables shared caching across
multiple origins. The choice depends on traffic volume and operational
requirements.</t>
      </section>
      <section anchor="generating-http-message-signature">
        <name>Generating HTTP Message Signature</name>
        <t><xref target="HTTP-MESSAGE-SIGNATURES"/> defines components to be signed.</t>
        <t>Agents <bcp14>MUST</bcp14> include at least one of the following components:</t>
        <dl>
          <dt><tt>@authority</tt></dt>
          <dd>
            <t>as defined in <xref section="2.2.3" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/></t>
          </dd>
          <dt><tt>@target-uri</tt></dt>
          <dd>
            <t>as defined in <xref section="2.2.2" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/></t>
          </dd>
        </dl>
        <t>Agents <bcp14>MUST</bcp14> include the following <tt>@signature-params</tt> as defined in <xref section="2.3" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/></t>
        <dl>
          <dt><tt>created</tt></dt>
          <dd>
            <t>as defined in <xref section="2.3" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/></t>
          </dd>
          <dt><tt>expires</tt></dt>
          <dd>
            <t>as defined in <xref section="2.3" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/></t>
          </dd>
          <dt><tt>keyid</tt></dt>
          <dd>
            <t><bcp14>MUST</bcp14> be a base64url JWK SHA-256 Thumbprint as defined in <xref section="3.2" sectionFormat="of" target="JWK-THUMBPRINT"/> for RSA and EC, and in <xref section="A.3" sectionFormat="of" target="JWK-OKP"/> for ed25519.</t>
          </dd>
          <dt><tt>tag</tt></dt>
          <dd>
            <t><bcp14>MUST</bcp14> be <tt>web-bot-auth</tt></t>
          </dd>
        </dl>
        <t>The signing key is available to the agent at request time. Algorithms should be registered with IANA as part of HTTP Message Signatures Algorithm registry.</t>
        <t>The creation of the signature is defined in <xref section="3.1" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.</t>
        <t>It is <bcp14>RECOMMENDED</bcp14> the expiry to be no more than 24 hours.</t>
        <section anchor="signature-agent">
          <name>Signature-Agent</name>
          <t><tt>Signature-Agent</tt> is an HTTP Method context header defined in Section 4.1 of <xref target="DIRECTORY"/>.
It is <bcp14>RECOMMENDED</bcp14> that the Agent sends requests with <tt>Signature-Agent</tt> header, as described in <xref target="sending-request"/>.
If the header is to be sent, one of its members <bcp14>MUST</bcp14> be signed as a component as defined in <xref section="2.1" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.
The <tt>Signature-Agent</tt> member identifies where candidate key material can be found.
The key used to verify the signature is selected by the <tt>keyid</tt> parameter of the
corresponding <tt>Signature-Input</tt> member.</t>
          <t>This results in the following components to be signed</t>
          <artwork><![CDATA[
("@authority" "signature-agent";key="sig1")
]]></artwork>
          <t>It is <bcp14>RECOMMENDED</bcp14> that the <tt>key</tt> matches the signature label.</t>
        </section>
        <section anchor="multiple-signatures">
          <name>Multiple signatures</name>
          <t>A request <bcp14>MAY</bcp14> contain more than one Web Bot Auth signature. Each signature is
identified by its HTTP Message Signatures label. When <tt>Signature-Agent</tt> is
present, each signer <bcp14>SHOULD</bcp14> provide a <tt>Signature-Agent</tt> member for its label.</t>
          <t>A signer <bcp14>MAY</bcp14> cover selected members from another signature label, including
<tt>"signature";key=...</tt>, <tt>"signature-input";key=...</tt>, and
<tt>"signature-agent";key=...</tt>. This lets a signer preserve evidence that another
signer contributed to the request.</t>
          <t>This records which parties signed which fields. It does not, by itself, express
authorization, delegation, or consent. Those meanings are deployment policy or
are carried in separately signed fields. The delegation examples in
<xref target="DIRECTORY"/> cover a different problem: how key material can show delegation.
Multiple signatures only show which signatures were present and what they
covered.</t>
        </section>
        <section anchor="anti-replay">
          <name>Anti-replay</name>
          <t>Origins <bcp14>MAY</bcp14> want to prevent signatures from being spoofed or used multiple times by bad actors and thus require a <tt>nonce</tt> to be added to the <tt>@signature-params</tt>.
This is described in <xref section="7.2.2" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.</t>
          <t>Agents <bcp14>SHOULD</bcp14> extend <tt>@signature-parameters</tt> defined in <xref target="generating-http-message-signature"/> as follows:</t>
          <dl>
            <dt><tt>nonce</tt></dt>
            <dd>
              <t>base64url encoded random byte array. It is <bcp14>RECOMMENDED</bcp14> to use a 64-byte array.</t>
            </dd>
          </dl>
          <t>Client <bcp14>MUST</bcp14> ensure that this <tt>nonce</tt> is unique for the validity window of the signature, as defined by created and expires attributes.</t>
        </section>
        <section anchor="additional-headers">
          <name>Additional headers</name>
          <t>Agents <bcp14>MAY</bcp14> include additional components, such as specific HTTP headers, in the signature.
This can be prompted by the origin requesting additional headers, as described in <xref target="requesting-message-signature"/>,
or initiated by the agent to provide more information within the signature scope.
For example, an agent might include an HTTP header expressing its intent and sign it.</t>
          <t>Origins <bcp14>MAY</bcp14> ignore certain headers at their own discretion,
and request a new signature, as described in <xref target="requesting-message-signature"/>.</t>
        </section>
        <section anchor="sending-request">
          <name>Sending a request</name>
          <t>An Agent <bcp14>SHOULD</bcp14> send a request with the signature generated above. Updating the architecture diagram, the flow looks as follow.</t>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="272" width="848" viewBox="0 0 848 272" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,32 L 8,160" fill="none" stroke="black"/>
                <path d="M 88,32 L 88,160" fill="none" stroke="black"/>
                <path d="M 136,112 L 136,256" fill="none" stroke="black"/>
                <path d="M 680,112 L 680,256" fill="none" stroke="black"/>
                <path d="M 752,32 L 752,160" fill="none" stroke="black"/>
                <path d="M 840,32 L 840,160" fill="none" stroke="black"/>
                <path d="M 8,32 L 88,32" fill="none" stroke="black"/>
                <path d="M 752,32 L 840,32" fill="none" stroke="black"/>
                <path d="M 96,62 L 352,62" fill="none" stroke="black"/>
                <path d="M 96,66 L 352,66" fill="none" stroke="black"/>
                <path d="M 496,62 L 744,62" fill="none" stroke="black"/>
                <path d="M 496,66 L 744,66" fill="none" stroke="black"/>
                <path d="M 136,112 L 680,112" fill="none" stroke="black"/>
                <path d="M 88,128 L 128,128" fill="none" stroke="black"/>
                <path d="M 688,128 L 744,128" fill="none" stroke="black"/>
                <path d="M 8,160 L 88,160" fill="none" stroke="black"/>
                <path d="M 752,160 L 840,160" fill="none" stroke="black"/>
                <path d="M 136,256 L 680,256" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="752,128 740,122.4 740,133.6" fill="black" transform="rotate(0,744,128)"/>
                <polygon class="arrowhead" points="752,64 740,58.4 740,69.6" fill="black" transform="rotate(0,744,64)"/>
                <polygon class="arrowhead" points="104,64 92,58.4 92,69.6" fill="black" transform="rotate(180,96,64)"/>
                <g class="text">
                  <text x="420" y="52">Exchange</text>
                  <text x="424" y="68">Cryptographic</text>
                  <text x="420" y="84">material</text>
                  <text x="48" y="100">Agent</text>
                  <text x="796" y="100">Origin</text>
                  <text x="160" y="132">GET</text>
                  <text x="248" y="132">/path/to/resource</text>
                  <text x="188" y="148">Signature:</text>
                  <text x="272" y="148">sig=abc==</text>
                  <text x="212" y="164">Signature-Input:</text>
                  <text x="352" y="164">sig=("@authority"</text>
                  <text x="548" y="164">"signature-agent";key="sig");\</text>
                  <text x="364" y="180">created=1700000000;\</text>
                  <text x="364" y="196">expires=1700011111;\</text>
                  <text x="356" y="212">keyid="ba3e64==";\</text>
                  <text x="356" y="228">tag="web-bot-auth"</text>
                  <text x="212" y="244">Signature-Agent:</text>
                  <text x="412" y="244">sig="https://signer.example.com"</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
+---------+                                                                                  +----------+
|         |                                     Exchange                                     |          |
|         |<================================  Cryptographic  ===============================>|          |
|         |                                     material                                     |          |
|  Agent  |                                                                                  |  Origin  |
|         |     .-------------------------------------------------------------------.        |          |
|         +-----| GET /path/to/resource                                             |------->|          |
|         |     | Signature: sig=abc==                                              |        |          |
+---------+     | Signature-Input: sig=("@authority" "signature-agent";key="sig");\ |        +----------+
                |                  created=1700000000;\                             |
                |                  expires=1700011111;\                             |
                |                  keyid="ba3e64==";\                               |
                |                  tag="web-bot-auth"                               |
                | Signature-Agent: sig="https://signer.example.com"                 |
                '-------------------------------------------------------------------'
]]></artwork>
          </artset>
          <t>The Agent <bcp14>SHOULD</bcp14> send requests with two headers</t>
          <ol spacing="normal" type="1"><li>
              <t><tt>Signature</tt> defined in <xref target="generating-http-message-signature"/></t>
            </li>
            <li>
              <t><tt>Signature-Input</tt> defined in <xref target="generating-http-message-signature"/></t>
            </li>
          </ol>
          <t>Mentioned in <xref target="signature-agent"/>, the Agent <bcp14>MAY</bcp14> send requests with <tt>Signature-Agent</tt> header.</t>
        </section>
      </section>
      <section anchor="requesting-message-signature">
        <name>Requesting a Message signature</name>
        <t><xref section="5" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/> defines the <tt>Accept-Signature</tt> field which can be used to request a Message Signature from a client by an origin.
An Origin <bcp14>MAY</bcp14> choose to request signatures from clients that did not initially provide them. If requesting, Origins <bcp14>MUST</bcp14> use the same parameters as those defined by the <xref target="generating-http-message-signature"/>.
The status code <bcp14>SHOULD</bcp14> be 403 Forbidden as defined in <xref section="15.5.4" sectionFormat="of" target="HTTP"/>.</t>
        <t>Origin <bcp14>MAY</bcp14> request a new signature with tag "web-bot-auth" even if a nonce is provided, for example if it believes the nonce is a replay, or if it doesn't store nonces and thus requests new signatures every time.
The status code <bcp14>SHOULD</bcp14> be 429 Too Many Requests as defined in <xref section="4" sectionFormat="of" target="HTTP-MORE-STATUS-CODE"/>.</t>
      </section>
      <section anchor="validating-message-signature">
        <name>Validating Message signature</name>
        <t>Upon receiving an HTTP request, the origin has to verify the signature. The algorithm is provided in <xref section="3.2" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.
Similar to a regular User-Agent check, this happens at the HTTP layer, once headers are received.</t>
        <t>Additional requirements are placed on this validation:</t>
        <ul spacing="normal">
          <li>
            <t>During step 1 to 3 included, if the Origin fails to parse the provided <tt>Signature</tt>, <tt>Signature-Input</tt>, or <tt>Signature-Agent</tt> headers, it <bcp14>MAY</bcp14> respond with status code 400 Bad Request as defined in <xref section="15.5.1" sectionFormat="of" target="HTTP"/>.</t>
          </li>
          <li>
            <t>During step 4, the Origin <bcp14>MAY</bcp14> discard signatures for which the <tt>tag</tt> is not set to <tt>web-bot-auth</tt>.</t>
          </li>
          <li>
            <t>During step 5, the Origin <bcp14>MAY</bcp14> discard signatures for which they do not know the <tt>keyid</tt>.</t>
          </li>
          <li>
            <t>During step 5, if the keyid is unknown to the origin, they <bcp14>MAY</bcp14> fetch key material as indicated by the <tt>Signature-Agent</tt> header defined in Section 4 of <xref target="DIRECTORY"/>.</t>
          </li>
        </ul>
        <t>Origin <bcp14>MAY</bcp14> require the <tt>nonce</tt> to satisfy certain constraints: be globally unique using a global nonce store, be unique to a specific location or time window using a local cache, or no constraint at all.</t>
      </section>
      <section anchor="key-distribution-and-discovery">
        <name>Key Distribution and Discovery</name>
        <t>This section describes key discovery for the agent.</t>
        <t>The reference for discovery is a URL. It <bcp14>SHOULD</bcp14> be an HTTPS URL. The
<tt>Signature-Agent</tt> header defines typed discovery. This architecture uses these
types:</t>
        <dl>
          <dt><tt>directory</tt></dt>
          <dd>
            <t>Resolve the HTTP Message Signatures Directory at the well-known URI registered
in <xref target="DIRECTORY"/>. This is the default when no <tt>type</tt> parameter is present.</t>
          </dd>
          <dt><tt>jwks_uri</tt></dt>
          <dd>
            <t>Resolve the member value as a direct JWK Set URI.</t>
          </dd>
          <dt><tt>cimd</tt></dt>
          <dd>
            <t>Resolve the member value as a Client ID Metadata Document <xref target="CIMD"/> URI. The
document then provides key material through <tt>jwks</tt> or <tt>jwks_uri</tt>.</t>
          </dd>
        </dl>
        <t>For all types, the key is selected using the <tt>keyid</tt> parameter in
<tt>Signature-Input</tt>.</t>
        <t>Examples:</t>
        <artwork><![CDATA[
Signature-Agent: sig1="https://signature-agent.test"
Signature-Agent: sig1="https://signature-agent.test/jwks.json";type=jwks_uri
Signature-Agent: sig1="https://signature-agent.test/card";type=cimd
]]></artwork>
        <t>Example:</t>
        <sourcecode type="json"><![CDATA[
{
  "keys": [{
    "kty": "OKP",
    "crv": "Ed25519",
    "kid": "NFcWBst6DXG-N35nHdzMrioWntdzNZghQSkjHNMMSjw",
    "x": "JrQLj5P_89iXES9-vFgrIy29clF9CC_oPPsw3c5D0bs",
    "use": "sig",
    "nbf": 1712793600,
    "exp": 1715385600
  }]
}
]]></sourcecode>
        <section anchor="out-of-band-communication-between-client-and-origin">
          <name>Out-of-band communication between client and origin</name>
          <t>A service submitting their key to an origin, or the origin manually adding a service to their trusted list.</t>
        </section>
        <section anchor="public-list">
          <name>Public list</name>
          <t>Could be a GitHub repository like the public suffix list. The issue is the gating of such repositories, and therefore its governance.</t>
        </section>
        <section anchor="signature-agent-header">
          <name>Signature-Agent header</name>
          <t>This allows for backward compatibility with existing header agent filtering, and an upgrade to a cryptographically secured protocol.
See <xref target="signature-agent"/> for more details.</t>
        </section>
        <section anchor="signature-key-header">
          <name>Signature-Key header</name>
          <t><xref target="SIGNATURE-KEY"/> defines a separate key discovery header for HTTP Message
Signatures. Deployments <bcp14>MAY</bcp14> use it when they need that model. This architecture
uses <tt>Signature-Agent</tt> as its default discovery mechanism.</t>
        </section>
      </section>
      <section anchor="session-protocol-considerations">
        <name>Session Protocol Considerations</name>
        <t>Per-request signature generation and verification may incur computational overhead from cryptographic operations and key discovery. For high-frequency interactions, origins might establish sessions to reduce repeated verification.</t>
        <t>One approach: after successful signature verification, an origin issues a session credential (e.g., an HTTP cookie) that subsequent requests present in lieu of a full signature. This trades cryptographic verification costs for the security properties of bearer tokens, including susceptibility to credential theft and replay within the session lifetime.</t>
        <t>The design of session protocols, including appropriate session lifetimes and binding mechanisms, is out of scope for this document.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="use-of-tls">
        <name>Use of TLS</name>
        <t>We reassess <xref section="7.1.2" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.
Clients <bcp14>SHOULD</bcp14> use TLS <xref target="RFC8446"/>
(https) or equivalent transport security when making requests with
Message signatures. Failing to do so exposes the Message signature to numerous
attacks that could give attackers unintended access.</t>
        <t>This include reverse proxy and their consideration presented in <xref target="reverse-proxy"/>.</t>
        <t>An origin <bcp14>SHOULD</bcp14> refuse Signature headers when communicated over an unsecured channel.</t>
      </section>
      <section anchor="performance-impact">
        <name>Performance Impact</name>
        <t>Origins should account for the overhead of signature verification in their operations. A local cache of public keys reduces network requests and verification latency. The choice of signing algorithm impacts CPU requirements. Origins should monitor verification latency and set appropriate timeouts to maintain service levels under load.</t>
      </section>
      <section anchor="nonce-validation">
        <name>Nonce validation</name>
        <t>Clients control the nonce. While <xref target="anti-replay"/> mandates that clients <bcp14>MUST</bcp14> provide a globally unique nonce, it is the origin's responsibility to enforce it.</t>
        <t>Different validation policies have different performance and operational considerations. Global uniqueness requires a global nonce store. Some origins may find that their use case can tolerate sharding on location, timing, or other properties.</t>
      </section>
      <section anchor="key-compromise-response">
        <name>Key Compromise Response</name>
        <t>An agent signing key might get compromised.</t>
        <t>If that happens, the agent <bcp14>SHOULD</bcp14> cease using the compromised key as soon as possible, notify affected origins if possible, and generate a new key pair.</t>
        <t>To minimise the impact of a key compromise, the origin should support rapid key rotation and monitor for suspicious signature patterns.</t>
      </section>
      <section anchor="shared-secrets-considered-harmful">
        <name>Shared Secrets Considered Harmful</name>
        <t>Implementations <bcp14>MUST NOT</bcp14> use shared HMAC defined in <xref section="3.3.3" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.
Shared secrets break non-repudiation and make auditing
difficult. Each automated client <bcp14>SHOULD</bcp14> use a unique asymmetric keypair to
ensure attribution, support key rotation, and enable effective revocation if
needed.</t>
      </section>
      <section anchor="key-reuse-considered-harmful">
        <name>Key Reuse Considered Harmful</name>
        <t>Implementations <bcp14>SHOULD NOT</bcp14> reuse a signing key for different purposes. For
example, if an agent implementor has two agents they want to differentiate,
these should use distinct signing keys and signing key directories.</t>
      </section>
      <section anchor="reverse-proxy">
        <name>Reverse proxy consideration</name>
        <t>An origin may be placed behind a reverse proxy, which means the proxy will see
the <tt>Signature</tt> and <tt>Signature-Agent</tt> headers before the origin does.
A proxy <bcp14>SHOULD NOT</bcp14> strip the <tt>Signature</tt> or <tt>Signature-Agent</tt> headers from
requests.</t>
        <t>A proxy <bcp14>SHOULD NOT</bcp14> replay signatures against other reverse proxies used by the
origin, as this allows impersonation of the principal signature agent.</t>
        <t>Origins <bcp14>MAY</bcp14> require a specific nonce policy to prevent such malicious behaviour
and decide to validate the signature themselves. This has to be done in
accordance with <xref target="nonce-validation"/>. For example, an origin could
require a nonce derived from public information (such as the current date),
mandate nonce chaining (where each nonce is the hash of the previous one),
or provide its own nonce in an <tt>Accept-Signature</tt> response to challenge the agent.</t>
        <t>Such policies <bcp14>MAY</bcp14> incur additional round-trip between the client and the origin
to convey <tt>accept-signature</tt> header, or deployment specific exchanges.</t>
        <section anchor="signature-agent-labeling">
          <name>Signature-Agent labeling</name>
          <t>An intermediary is allowed to relabel an existing signature when processing the
message, per <xref section="7.2.5" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.</t>
          <t>This <bcp14>MAY</bcp14> apply to <tt>Signature-Agent</tt>, when included in the request as defined in
<xref target="signature-agent"/>,
An intermediary updating the member key <bcp14>MUST</bcp14> update the components of the
associated signatures accordingly.</t>
          <t>For instance, an intermediary updating the <tt>Signature-Agent</tt> from <tt>agent2</tt> to
<tt>agent3</tt> on the example provided in <xref target="example-signature-agent-included"/> would
result in the following <tt>Signature</tt>, <tt>Signature-Input</tt>, and <tt>Signature-Agent</tt>
header fields after recomputing the signature.</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

Signature-Agent: agent3="https://signature-agent.test"
Signature-Input: sig2=("@authority" "signature-agent";key="agent3")\
 ;created=1735689600\
 ;keyid="oD0HwocPBSfpNy5W3bpJeyFGY_IQ_YpqxSjQ3Yd-CLA"\
 ;alg="rsa-pss-sha512"\
 ;expires=4889289600\
 ;nonce="wcfPQPh7SzkvrIVvhD00vNk9PkxJNY2NVbYl2PVBB4zmUoluSwE7W6bPtF60QA3k8g06FU7PPCD+J58YofY1zg=="\
 ;tag="web-bot-auth"
Signature: sig2=:bpfH5RL2nS54KUUVMs0lIT13RcgskY/9iF8IfQIxowd7Im08KgpVek5tnmXvYPddqIs5qLdVzb+RpXzjDcao9tFk6Ad0ccX/vf1qQmVXkH0MMpXhPGBmJT1b21nUinkrGhBPEnb+OXSJVTmLGWLgCihPSpzaEE6BUp9IFWjJoMOF3pOY+1Yinukj2/JXr1+meTe0pwGWtQ079SHhKbP1veqXanFN1rrQ5QwbDiYklfDEC4PLVKYLFXryFuTAj5wivj7/8Y9qbD6dFyMggEIPe4a0ubOzmAiTuQyW+OqOfFvPwxVWkYxUgoapjz5rEA1Dguc3ZZo/2ja+N/1fmOe7/Q==:
]]></artwork>
          <t><tt>Signature-Agent</tt>, <tt>Signature-Input</tt>, and <tt>Signature</tt> all reflect the update
from <tt>agent2</tt> to <tt>agent3</tt>.</t>
        </section>
      </section>
      <section anchor="ssrf">
        <name>Server-Side Request Forgery (SSRF)</name>
        <t>As described in <xref target="key-distribution-and-discovery"/>, verifiers may fetch key directories based on
the value conveyed in <tt>Signature-Agent</tt> when included in a request. Since
clients control the <tt>Signature-Agent</tt> header value, this introduces a risk of
server-side request forgery (SSRF) attacks by malicious clients.</t>
        <t>Verifiers <bcp14>SHOULD</bcp14> take appropriate precautions as follows:</t>
        <dl>
          <dt><tt>Response size</tt></dt>
          <dd>
            <t>a directory can be arbitrarily large. Verifiers <bcp14>SHOULD</bcp14> reject responses
exceeding a defined byte limit after content decoding.</t>
          </dd>
          <dt><tt>Key count</tt></dt>
          <dd>
            <t>a JWKS with many keys forces O(n) key search. Verifiers <bcp14>SHOULD</bcp14> enforce
a maximum key count.</t>
          </dd>
          <dt><tt>Fetch latency</tt></dt>
          <dd>
            <t>no timeout allows slowloris-style exhaustion. Verifiers <bcp14>SHOULD</bcp14> apply
a wall-clock timeout to directory fetches.</t>
          </dd>
          <dt><tt>Redirect chains</tt></dt>
          <dd>
            <t>unbounded HTTP redirects can be used to amplify requests. Verifiers
<bcp14>SHOULD</bcp14> limit redirect depth.</t>
          </dd>
          <dt><tt>Network address ranges</tt></dt>
          <dd>
            <t>no address filtering can target internal services. Verifiers <bcp14>SHOULD</bcp14>
prevent directory fetches to private, loopback, and link-local
address ranges.</t>
          </dd>
        </dl>
        <t>Further recommendations can be found in the Open Worldwide Application
Security Project (OWASP) SSRF Prevention Cheat Sheet <xref target="OWASP-SSRF"/>.</t>
      </section>
      <section anchor="test-and-demonstration-keys">
        <name>Test and Demonstration Keys</name>
        <t>Test keys, including the example keys in <xref target="HTTP-MESSAGE-SIGNATURES"/>, <bcp14>MUST NOT</bcp14>
be used in production. Verifiers <bcp14>SHOULD</bcp14> reject known test keys when they are
detected in key directories or out-of-band configuration.</t>
      </section>
      <section anchor="static-signatures">
        <name>Static Signatures</name>
        <t>Deployments <bcp14>MUST NOT</bcp14> treat a precomputed Web Bot Auth signature as a long-lived
access credential. A reusable static signature has bearer-token semantics and can
be replayed until the covered signature parameters, key, or verifier policy make
it unusable.</t>
        <t>Agents <bcp14>SHOULD</bcp14> generate signatures for the request being sent, with bounded
<tt>created</tt> and <tt>expires</tt> values. Long expiration windows increase replay risk.</t>
      </section>
      <section anchor="discovery-failure">
        <name>Discovery Failure</name>
        <t>Failure to fetch or validate a key directory, beyond the directory cache window
discussed in <xref target="cache-behaviour"/>, means that the asserted identity is not
verified. It does not prove that the signer is malicious, and it does not make
the request trusted. The resulting enforcement decision is local policy.</t>
      </section>
    </section>
    <section anchor="privacy-considerations">
      <name>Privacy Considerations</name>
      <section anchor="public-identity">
        <name>Public Identity</name>
        <t>This architecture assumes that automated clients identify themselves
explicitly using digital signatures. The identity associated with a signing
key is expected to be publicly discoverable for verification purposes. This
reduces anonymity and allows receivers to associate requests with specific
agents. If an agent wishes not to identify itself, this is not the right
choice of protocol for it.</t>
      </section>
      <section anchor="no-human-correlation">
        <name>No Human Correlation</name>
        <t>The key used for signing <bcp14>MUST NOT</bcp14> be tied to a specific human individual.
Keys <bcp14>SHOULD</bcp14> represent a role, company, or automation identity (e.g., "news-aggregator-
bot", "example-crawler-v1"). This avoids accidental exposure of personally
identifiable information and prevents the misuse of keys for user tracking or
profiling.</t>
      </section>
      <section anchor="minimizing-tracking-risks">
        <name>Minimizing Tracking Risks</name>
        <t>To limit tracking risks, implementations <bcp14>SHOULD</bcp14> avoid long-lived, globally
unique key identifiers unless strictly necessary. Key rotation <bcp14>SHOULD</bcp14> be
supported, and clients <bcp14>SHOULD</bcp14> take care to avoid signing information that
could be used to correlate activity across contexts, especially where
sensitive user data is involved.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="DIRECTORY">
          <front>
            <title>HTTP Message Signatures Directory</title>
            <author fullname="Thibault Meunier" initials="T." surname="Meunier">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Sandor Major" initials="S." surname="Major">
              <organization>Google</organization>
            </author>
            <date day="26" month="June" year="2026"/>
            <abstract>
              <t>   This document describes a method for clients using
   [HTTP-MESSAGE-SIGNATURES] to advertise their signing keys.

   It defines a key directory format based on JWKS as defined in
   Section 5 of [JWK], as well as a new HTTP Method Context for in-band
   key discovery.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-meunier-webbotauth-httpsig-directory-00"/>
        </reference>
        <reference anchor="HTTP-MESSAGE-SIGNATURES">
          <front>
            <title>HTTP Message Signatures</title>
            <author fullname="A. Backman" initials="A." role="editor" surname="Backman"/>
            <author fullname="J. Richer" initials="J." role="editor" surname="Richer"/>
            <author fullname="M. Sporny" initials="M." surname="Sporny"/>
            <date month="February" year="2024"/>
            <abstract>
              <t>This document describes a mechanism for creating, encoding, and verifying digital signatures or message authentication codes over components of an HTTP message. This mechanism supports use cases where the full HTTP message may not be known to the signer and where the message may be transformed (e.g., by intermediaries) before reaching the verifier. This document also describes a means for requesting that a signature be applied to a subsequent HTTP message in an ongoing HTTP exchange.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9421"/>
          <seriesInfo name="DOI" value="10.17487/RFC9421"/>
        </reference>
        <reference anchor="HTTP">
          <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="HTTP-CACHE">
          <front>
            <title>HTTP Caching</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 defines HTTP caches and the associated header fields that control cache behavior or indicate cacheable response messages.</t>
              <t>This document obsoletes RFC 7234.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="98"/>
          <seriesInfo name="RFC" value="9111"/>
          <seriesInfo name="DOI" value="10.17487/RFC9111"/>
        </reference>
        <reference anchor="HTTP-MORE-STATUS-CODE">
          <front>
            <title>Additional HTTP Status Codes</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="R. Fielding" initials="R." surname="Fielding"/>
            <date month="April" year="2012"/>
            <abstract>
              <t>This document specifies additional HyperText Transfer Protocol (HTTP) status codes for a variety of common situations. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6585"/>
          <seriesInfo name="DOI" value="10.17487/RFC6585"/>
        </reference>
        <reference anchor="JWK-OKP">
          <front>
            <title>CFRG Elliptic Curve Diffie-Hellman (ECDH) and Signatures in JSON Object Signing and Encryption (JOSE)</title>
            <author fullname="I. Liusvaara" initials="I." surname="Liusvaara"/>
            <date month="January" year="2017"/>
            <abstract>
              <t>This document defines how to use the Diffie-Hellman algorithms "X25519" and "X448" as well as the signature algorithms "Ed25519" and "Ed448" from the IRTF CFRG elliptic curves work in JSON Object Signing and Encryption (JOSE).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8037"/>
          <seriesInfo name="DOI" value="10.17487/RFC8037"/>
        </reference>
        <reference anchor="JWK-THUMBPRINT">
          <front>
            <title>JSON Web Key (JWK) Thumbprint</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <date month="September" year="2015"/>
            <abstract>
              <t>This specification defines a method for computing a hash value over a JSON Web Key (JWK). It defines which fields in a JWK are used in the hash computation, the method of creating a canonical form for those fields, and how to convert the resulting Unicode string into a byte sequence to be hashed. The resulting hash value can be used for identifying or selecting the key represented by the JWK that is the subject of the thumbprint.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7638"/>
          <seriesInfo name="DOI" value="10.17487/RFC7638"/>
        </reference>
        <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="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>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="CIMD">
          <front>
            <title>OAuth Client ID Metadata Document</title>
            <author fullname="Aaron Parecki" initials="A." surname="Parecki">
              <organization>Okta</organization>
            </author>
            <author fullname="Emelia Smith" initials="E." surname="Smith">
         </author>
            <date day="1" month="March" year="2026"/>
            <abstract>
              <t>   This specification defines a mechanism through which an OAuth client
   can identify itself to authorization servers, without prior dynamic
   client registration or other existing registration.  This is through
   the usage of a URL as a client_id in an OAuth flow, where the URL
   refers to a document containing the necessary client metadata,
   enabling the authorization server to fetch the metadata about the
   client as needed.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-oauth-client-id-metadata-document-01"/>
        </reference>
        <reference anchor="HTTP-BEST-PRACTICES">
          <front>
            <title>Building Protocols with HTTP</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>Applications often use HTTP as a substrate to create HTTP-based APIs. This document specifies best practices for writing specifications that use HTTP to define new application protocols. It is written primarily to guide IETF efforts to define application protocols using HTTP for deployment on the Internet but might be applicable in other situations.</t>
              <t>This document obsoletes RFC 3205.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="56"/>
          <seriesInfo name="RFC" value="9205"/>
          <seriesInfo name="DOI" value="10.17487/RFC9205"/>
        </reference>
        <reference anchor="OAUTH-BEARER">
          <front>
            <title>The OAuth 2.0 Authorization Framework: Bearer Token Usage</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="D. Hardt" initials="D." surname="Hardt"/>
            <date month="October" year="2012"/>
            <abstract>
              <t>This specification describes how to use bearer tokens in HTTP requests to access OAuth 2.0 protected resources. Any party in possession of a bearer token (a "bearer") can use it to get access to the associated resources (without demonstrating possession of a cryptographic key). To prevent misuse, bearer tokens need to be protected from disclosure in storage and in transport. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6750"/>
          <seriesInfo name="DOI" value="10.17487/RFC6750"/>
        </reference>
        <reference anchor="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="OWASP-SSRF" target="https://cheatsheetseries.owasp.org/cheatsheets/Server_Side_Request_Forgery_Prevention_Cheat_Sheet.html">
          <front>
            <title>OWASP Server-Side Request Forgery Prevention Cheat Sheet</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="SIGNATURE-KEY">
          <front>
            <title>HTTP Signature Keys</title>
            <author fullname="Dick Hardt" initials="D." surname="Hardt">
              <organization>Hellō</organization>
            </author>
            <author fullname="Thibault Meunier" initials="T." surname="Meunier">
              <organization>Cloudflare</organization>
            </author>
            <date day="17" month="June" year="2026"/>
            <abstract>
              <t>   This document defines two HTTP header fields and one Accept-Signature
   parameter for use with HTTP Message Signatures as defined in RFC
   9421.  The Signature-Key request header distributes public keys used
   to verify signatures, with five initial key distribution schemes:
   pseudonymous inline keys (hwk), self-issued key delegation via JWK
   Thumbprint JWTs (jkt-jwt), identified signers with JWKS URI discovery
   (jwks_uri), JWT-based delegation (jwt), and X.509 certificate chains
   (x509).  The sigkey parameter extends Accept-Signature (RFC 9421
   Section 5) to indicate the type of Signature-Key the server requires.
   The Signature-Error response header provides structured error
   information when signature verification fails.  Together, these
   mechanisms enable flexible trust models ranging from privacy-
   preserving pseudonymous verification to horizontally-scalable
   delegated authentication and PKI-based identity chains.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-hardt-httpbis-signature-key-05"/>
        </reference>
      </references>
    </references>
    <?line 587?>

<section anchor="deployment-guidance">
      <name>Deployment Guidance</name>
      <t>This appendix is operational guidance. It does not define new protocol
requirements.</t>
      <section anchor="verifier-outcomes">
        <name>Verifier Outcomes</name>
        <t>Verifiers should keep three outcomes distinct:</t>
        <dl>
          <dt><tt>verified</tt></dt>
          <dd>
            <t>the signature and key material validate.</t>
          </dd>
          <dt><tt>invalid</tt></dt>
          <dd>
            <t>the signature, covered components, key, or freshness checks fail.</t>
          </dd>
          <dt><tt>unverified</tt></dt>
          <dd>
            <t>the verifier cannot obtain enough information to decide, for example because
directory discovery failed or the key is unknown.</t>
          </dd>
        </dl>
        <t>Origins can apply local policy to each outcome. During deployment, treating
<tt>unverified</tt> as one bot-management signal is safer than treating it as either
<tt>verified</tt> or <tt>invalid</tt>.</t>
      </section>
      <section anchor="directory-availability">
        <name>Directory Availability</name>
        <t>Directory resources are bootstrap material. Operators serving a directory should
make it reachable without requiring Web Bot Auth on the directory request. They
should also avoid bot protection rules that block ordinary verifier fetches of
the well-known resource.</t>
        <t>The directory endpoint should support <tt>GET</tt>. Supporting <tt>HEAD</tt>, <tt>ETag</tt>,
<tt>Last-Modified</tt>, <tt>Cache-Control</tt>, and conditional requests can reduce fetch
load. Cache is specifically discussed in <xref target="cache-behaviour"/>.</t>
      </section>
      <section anchor="bounded-directory-fetches">
        <name>Bounded Directory Fetches</name>
        <t>Verifiers fetch directories named by untrusted requests. Fetches should be
bounded as described in <xref target="ssrf"/>. In particular, verifiers should use a fetch
timeout, bound the decoded response size, bound the number of keys considered,
limit redirects, and prevent fetches to private, loopback, and link-local
addresses.</t>
        <t>Verifiers should also coalesce concurrent fetches for the same directory and
apply per-directory or per-origin concurrency limits. This avoids a fetch storm
when many requests reference the same uncached directory.</t>
      </section>
      <section anchor="cache-behaviour">
        <name>Cache Behaviour</name>
        <t>Verifiers should use normal HTTP caching semantics <xref target="HTTP-CACHE"/> for key
directories. In particular, verifiers should respect <tt>Cache-Control</tt>, <tt>Expires</tt>,
<tt>Date</tt>, <tt>ETag</tt>, and <tt>Last-Modified</tt> when present.</t>
        <t>A verifier should not fetch the directory for every request. It should refresh
cached directories when they become stale, and can use background refresh with
jitter to avoid synchronized refetches.</t>
      </section>
      <section anchor="negative-caching-and-retry">
        <name>Negative Caching and Retry</name>
        <t>Verifiers can cache unsuccessful discovery outcomes for a short period to reduce
repeated fetches. Negative cache entries should expire after no more than five
minutes. They are operational throttling state, not proof that a signature is
invalid.</t>
        <t>Network failures, TLS failures, and <tt>5xx</tt> responses should be treated as
transient unless local policy says otherwise. Verifiers should retry with bounded
exponential backoff and jitter. When a directory response includes
<tt>Retry-After</tt>, verifiers should respect it as described by <xref target="HTTP"/> and
<xref target="HTTP-BEST-PRACTICES"/>.</t>
      </section>
      <section anchor="freshness-and-replay">
        <name>Freshness and Replay</name>
        <t>Shorter signature lifetimes reduce replay risk but increase sensitivity to clock
skew and signing failures. Nonces provide stronger replay defense, but require
state at the verifier. Some deployments can tolerate bounded replay for short
windows; others need strict <xref target="nonce-validation"/>.</t>
        <t>These choices are deployment policy. Verifiers should avoid accepting signatures
with freshness windows longer than their risk model permits.</t>
      </section>
      <section anchor="rollout-and-fallback">
        <name>Rollout and Fallback</name>
        <t>Web Bot Auth deployments will coexist with existing bot identification signals
during rollout. Verifiers can continue to use existing methods such as IP-based
checks, forward-confirmed reverse DNS, local allowlists, and reputation systems.</t>
        <t>Fallback should not turn an unsupported or unverifiable Web Bot Auth signature
into a trusted identity. It should leave the request in the origin's existing
bot-management path.</t>
      </section>
      <section anchor="proxies-and-intermediaries">
        <name>Proxies and Intermediaries</name>
        <t>Proxies and intermediaries need to preserve the fields covered by a signature if
the origin will verify that signature. If a proxy rewrites the authority, path,
or signed header fields, the origin may no longer see the message that was
signed.</t>
        <t>A deployment can instead verify at the proxy and pass the result to the origin
through a deployment-local trusted channel. That assertion is local policy; it is
not a replacement for the original HTTP Message Signature.</t>
      </section>
      <section anchor="cors">
        <name>CORS</name>
        <t>Key directories contain public key material. If browser-based verifiers need to
fetch them cross-origin, a directory server can use a permissive CORS policy such
as <tt>Access-Control-Allow-Origin: *</tt> without credentials. CORS is not key
authentication and does not replace signature validation.</t>
      </section>
      <section anchor="deployment-anti-patterns">
        <name>Deployment Anti-Patterns</name>
        <t>Deployments should avoid:</t>
        <ul spacing="normal">
          <li>
            <t>using test or demonstration keys in production</t>
          </li>
          <li>
            <t>issuing one static signature for many requests</t>
          </li>
          <li>
            <t>asking users to copy long-lived signatures into third-party tools</t>
          </li>
          <li>
            <t>sharing one signing key across unrelated agents or purposes</t>
          </li>
          <li>
            <t>relying on manual key rotation as the only revocation mechanism</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="examples">
      <name>Examples</name>
      <section anchor="example-multiple-signatures">
        <name>Multiple signatures with a remote browser</name>
        <t>This example shows Alice's agent using a remote browser to fetch a resource. The
agent signs selected request fields. The remote browser signs the request it
sends to the origin and also covers the agent's signature fields. The signature
values are illustrative; this is not a test vector.</t>
        <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

GET /resource HTTP/1.1
Host: origin.example
Signature-Agent: agent="https://agent.alice.example",\
 browser="https://browser.example"
Signature-Input: agent=("@method" "@authority" "@path"\
 "signature-agent";key="agent");created=1735689600\
 ;keyid="poqkLGiymh_W0uP6PZFw-dvez3QJT5SolqXBCW38r0U"\
 ;tag="web-bot-auth",\
 browser=("@method" "@authority" "@path"\
 "signature-agent";key="browser"\
 "signature-agent";key="agent"\
 "signature-input";key="agent"\
 "signature";key="agent");created=1735689601\
 ;keyid="oD0HwocPBSfpNy5W3bpJeyFGY_IQ_YpqxSjQ3Yd-CLA"\
 ;tag="web-bot-auth"
Signature: agent=:YWdlbnQtc2lnbmF0dXJl:,\
 browser=:YnJvd3Nlci1zaWduYXR1cmU=:
]]></artwork>
        <t>The origin can verify both signatures. The <tt>agent</tt> signature covers the fields
selected by Alice's agent. The <tt>browser</tt> signature covers the request sent by the
remote browser, its own <tt>Signature-Agent</tt> member, and the <tt>agent</tt> signature
fields. This records that the remote browser forwarded a request carrying the
agent's signature. It does not say that Alice's agent authorized the remote
browser to act for it.</t>
      </section>
    </section>
    <section anchor="test-vectors">
      <name>Test Vectors</name>
      <section anchor="rsassa-pss-using-sha-512">
        <name>RSASSA-PSS Using SHA-512</name>
        <t>The test vectors in this section use the RSA-PSS key defined in <xref section="B.1.2" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.
This section includes non-normative test vectors that may be used as test cases to validate implementation correctness.</t>
        <section anchor="signature-agent-absent-from-the-request">
          <name>Signature-Agent absent from the request</name>
          <t>This example presents a minimal signature using the rsa-pss-sha512 algorithm over test-request. The request does not contain
a <tt>Signature-Agent</tt> header.</t>
          <t>The corresponding signature base is:</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

"@authority": example.com
"@signature-params": ("@authority")\
 ;created=1735689600\
 ;keyid="oD0HwocPBSfpNy5W3bpJeyFGY_IQ_YpqxSjQ3Yd-CLA"\
 ;alg="rsa-pss-sha512"\
 ;expires=4889289600\
 ;nonce="JojDFWJ90jf+gZhdKeTyJYsu1XvNPZSFAGhvYq5SuV3gneOEUAhq+xl792WGuD1W+Dr6NRmx+m+t06NsYnL4iA=="\
 ;tag="web-bot-auth"
]]></artwork>
          <t>This results in the following Signature-Input and Signature header fields being added to the message under the label <tt>sig1</tt>:</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

Signature-Input: sig1=("@authority")\
 ;created=1735689600\
 ;keyid="oD0HwocPBSfpNy5W3bpJeyFGY_IQ_YpqxSjQ3Yd-CLA"\
 ;alg="rsa-pss-sha512"\
 ;expires=4889289600\
 ;nonce="JojDFWJ90jf+gZhdKeTyJYsu1XvNPZSFAGhvYq5SuV3gneOEUAhq+xl792WGuD1W+Dr6NRmx+m+t06NsYnL4iA=="\
 ;tag="web-bot-auth"
Signature: sig1=:hWPaj85MWQiRkzU4jnIKvdPQiDfMCPIoxOP8nZveNc3aFQ7r/UmXWCwGNImw588iRvTFey5TR3fVEgnXpcttlyK+u5pN831z9Wlr+IMNfub4uEM3SuO+SKFygJZyLG0pf7OAiRcU4C0gyx1BS/+z9ydQTRzDLr88wCkBBRqwGRrSi8HTwxkqg1jugobh93hcnU6gV8MK1n+VnhRprIgl2RQSO6q5cfbB4OS8C4t/8ndW0lYmP2SWzKZJXnpX5Wrj17PuLqnVW6MO8pJnLAMXNvxUdx32KHeq/cHFrzZazZsua3UOoP+k+niHwoQ8bBWj1Vi4mM1mYJK+fk366cCLsQ==:
]]></artwork>
        </section>
        <section anchor="example-signature-agent-included">
          <name>Signature-Agent included present on the request</name>
          <t>This example presents a minimal signature using the rsa-pss-sha512 algorithm over test-request. The request contains
a <tt>Signature-Agent</tt> header.</t>
          <t>The corresponding signature base is:</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

"@authority": example.com
"signature-agent";key="agent2": "https://signature-agent.test"
"@signature-params": ("@authority" "signature-agent";key="agent2")\
 ;created=1735689600\
 ;keyid="oD0HwocPBSfpNy5W3bpJeyFGY_IQ_YpqxSjQ3Yd-CLA"\
 ;alg="rsa-pss-sha512"\
 ;expires=4889289600\
 ;nonce="wcfPQPh7SzkvrIVvhD00vNk9PkxJNY2NVbYl2PVBB4zmUoluSwE7W6bPtF60QA3k8g06FU7PPCD+J58YofY1zg=="\
 ;tag="web-bot-auth"
]]></artwork>
          <t>This results in the following Signature-Input and Signature header fields being added to the message under the label <tt>sig2</tt>:</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

Signature-Agent: agent2="https://signature-agent.test"
Signature-Input: sig2=("@authority" "signature-agent";key="agent2")\
 ;created=1735689600\
 ;keyid="oD0HwocPBSfpNy5W3bpJeyFGY_IQ_YpqxSjQ3Yd-CLA"\
 ;alg="rsa-pss-sha512"\
 ;expires=4889289600\
 ;nonce="wcfPQPh7SzkvrIVvhD00vNk9PkxJNY2NVbYl2PVBB4zmUoluSwE7W6bPtF60QA3k8g06FU7PPCD+J58YofY1zg=="\
 ;tag="web-bot-auth"
Signature: sig2=:gHzpLNeHaHIO19NaJH9YMW5dcVSi2s0wOMBr6p18vcofS106sfC4KBIS0/szPlBBd1vIcyQ88B6CTEWIhRAiVrb9zfX0mx1aG12CSGWcYkSirHeyTxhbuJvXd27ed6skWoy4PjXItq38936ivUQjfdIwXh1aX6HxkAC3vRnEdSNfntkLWeEuIQ5BLIOBGE39fSwg27Qjq6OVWYas/9/aFUr3HA34MXWYdp+//cvlEKDp3kRoLOw9ro0AOr6srHrTeEtxon2afcws1aZVSlPdd2fZSEIGmw9HAHLDCEkFTERu1gH2k/zIEqgy7CAYXI9E5slog0cLg/Vc6+f8gih33g==:
]]></artwork>
        </section>
        <section anchor="legacy-signature-agent-sf-string-instead-of-sf-dictionary-included-present-on-the-request">
          <name>Legacy Signature-Agent (sf-string instead of sf-dictionary) included present on the request</name>
          <t>THIS IS A LEGACY EXAMPLE. IF YOU ARE AN IMPLEMENTER, PLEASE UPDATE TO THE ABOVE.</t>
          <t>This example presents a minimal signature using the rsa-pss-sha512 algorithm over test-request. The request contains
a <tt>Signature-Agent</tt> header.</t>
          <t>The corresponding signature base is:</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

"@authority": example.com
"signature-agent": "https://signature-agent.test"
"@signature-params": ("@authority" "signature-agent")\
 ;created=1735689600\
 ;keyid="oD0HwocPBSfpNy5W3bpJeyFGY_IQ_YpqxSjQ3Yd-CLA"\
 ;alg="rsa-pss-sha512"\
 ;expires=1735693200\
 ;nonce="XSHtZVCThSIAksXsH9WBs6AtxtXC0eQGiIcUGSoJstFs8lAWakjhrfwzLhyjtme5iXMZvmFWqDEs6cT3Jf+BbQ=="\
 ;tag="web-bot-auth"
]]></artwork>
          <t>This results in the following Signature-Input and Signature header fields being added to the message under the label <tt>sig2</tt>:</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

Signature-Agent: "https://signature-agent.test"
Signature-Input: sig2=("@authority" "signature-agent")\
 ;created=1735689600\
 ;keyid="oD0HwocPBSfpNy5W3bpJeyFGY_IQ_YpqxSjQ3Yd-CLA"\
 ;alg="rsa-pss-sha512"\
 ;expires=1735693200\
 ;nonce="XSHtZVCThSIAksXsH9WBs6AtxtXC0eQGiIcUGSoJstFs8lAWakjhrfwzLhyjtme5iXMZvmFWqDEs6cT3Jf+BbQ=="\
 ;tag="web-bot-auth"
Signature: sig2=:I1QWNzGXdP1a4dSvOHLCVOOanEYHDk+ZsVxM9MLX/p4ko69ghKwR5EOtAD96g7g4GWP7lmpM/jFAf9q8EFRDTPLjUXySwMv4YPgabv2LQihTJG2y8a2m6IGltyruwQNiqSJVUuRaG9+b17CGmAMFZh30X6GXLdQJrCARpeTqPwp2DC+a8haDE/VE5EruqzjA5/2mKwvrkzkSqeW5tOVtFwWRRHIOidquf/8Je6kM9mhgkg4arudLA5SL4wyyYE1jURIgcOl8agrfdJ5Def23DIRtiOLRa8jT9cpTLFAuFHN+mrZA/LH9h0gSIg1cPb+0cMASee5uku1KjWcFer7jWA==:
]]></artwork>
        </section>
      </section>
      <section anchor="eddsa-using-curve-edwards25519">
        <name>EdDSA Using Curve edwards25519</name>
        <t>The test vectors in this section use the Ed25519 key defined in <xref section="B.1.4" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.
This section include non-normative test vectors that may be used as test cases to validate implementation correctness.</t>
        <section anchor="signature-agent-absent-from-the-request-1">
          <name>Signature-Agent absent from the request</name>
          <t>This example presents a minimal signature using the ed25519 algorithm over test-request. The request does not contain
a <tt>Signature-Agent</tt> header.</t>
          <t>The corresponding signature base is:</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

"@authority": example.com
"@signature-params": ("@authority")\
 ;created=1735689600\
 ;keyid="poqkLGiymh_W0uP6PZFw-dvez3QJT5SolqXBCW38r0U"\
 ;alg="ed25519"\
 ;expires=4889289600\
 ;nonce="zIW8+cdmA3vdYagbxojpONwa/l0EKJ/O3/wD486VvsQjO/RxPaSt6ZxvQaMcQzNnqKN/mQ6hpGiFro2L2qkz5A=="\
 ;tag="web-bot-auth"
]]></artwork>
          <t>This results in the following Signature-Input and Signature header fields being added to the message under the label <tt>sig1</tt>:</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

Signature-Input: sig1=("@authority")\
 ;created=1735689600\
 ;keyid="poqkLGiymh_W0uP6PZFw-dvez3QJT5SolqXBCW38r0U"\
 ;alg="ed25519"\
 ;expires=4889289600\
 ;nonce="zIW8+cdmA3vdYagbxojpONwa/l0EKJ/O3/wD486VvsQjO/RxPaSt6ZxvQaMcQzNnqKN/mQ6hpGiFro2L2qkz5A=="\
 ;tag="web-bot-auth"
Signature: sig1=:QKN4fTdIYfh82fvoZCQiQA1weuozfCS/Led2zTMbewMMqH8PI2Wsy/5c4ao6B6D09nraNQdBNOADg8aM1MqfCg==:
]]></artwork>
        </section>
        <section anchor="signature-agent-included-present-on-the-request">
          <name>Signature-Agent included present on the request</name>
          <t>This example presents a minimal signature using the ed25519 algorithm over test-request. The request contains
a <tt>Signature-Agent</tt> header.</t>
          <t>The corresponding signature base is:</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

"@authority": example.com
"signature-agent";key="agent2": "https://signature-agent.test"
"@signature-params": ("@authority" "signature-agent";key="agent2")\
 ;created=1735689600\
 ;keyid="poqkLGiymh_W0uP6PZFw-dvez3QJT5SolqXBCW38r0U"\
 ;alg="ed25519"\
 ;expires=4889289600\
 ;nonce="n9p433xm+NJ3ph3upfBIGmsuwHw387YV7Q/F+6BSpGCVjYCqQw6rznNA8PVVLySrAWsv0hQtFioQb6E1YsauiA=="\
 ;tag="web-bot-auth"
]]></artwork>
          <t>This results in the following Signature-Input and Signature header fields being added to the message under the label <tt>sig2</tt>:</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

Signature-Agent: agent2="https://signature-agent.test"
Signature-Input: sig2=("@authority" "signature-agent";key="agent2")\
 ;created=1735689600\
 ;keyid="poqkLGiymh_W0uP6PZFw-dvez3QJT5SolqXBCW38r0U"\
 ;alg="ed25519"\
 ;expires=4889289600\
 ;nonce="n9p433xm+NJ3ph3upfBIGmsuwHw387YV7Q/F+6BSpGCVjYCqQw6rznNA8PVVLySrAWsv0hQtFioQb6E1YsauiA=="\
 ;tag="web-bot-auth"
Signature: sig2=:RdNFx5Bj6au3YgAMQL/RzmUlZE8QZLIaXGRpw985hWnwPfMxT228NMk6ehRS1PSl4e8PhbNZACSanGdhEwYCCg==:
]]></artwork>
        </section>
        <section anchor="legacy-signature-agent-sf-string-instead-of-sf-dictionary-included-present-on-the-request-1">
          <name>Legacy Signature-Agent (sf-string instead of sf-dictionary) included present on the request</name>
          <t>THIS IS A LEGACY EXAMPLE. IF YOU ARE AN IMPLEMENTER, PLEASE UPDATE TO THE ABOVE.</t>
          <t>This example presents a minimal signature using the ed25519 algorithm over test-request. The request contains
a <tt>Signature-Agent</tt> header.</t>
          <t>The corresponding signature base is:</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

"@authority": example.com
"signature-agent": "https://signature-agent.test"
"@signature-params": ("@authority" "signature-agent")\
 ;created=1735689600\
 ;keyid="poqkLGiymh_W0uP6PZFw-dvez3QJT5SolqXBCW38r0U"\
 ;alg="ed25519"\
 ;expires=1735693200\
 ;nonce="e8N7S2MFd/qrd6T2R3tdfAuuANngKI7LFtKYI/vowzk4lAZYadIX6wW25MwG7DCT9RUKAJ0qVkU0mEeLElW1qg=="\
 ;tag="web-bot-auth"
]]></artwork>
          <t>This results in the following Signature-Input and Signature header fields being added to the message under the label <tt>sig2</tt>:</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

Signature-Agent: "https://signature-agent.test"
Signature-Input: sig2=("@authority" "signature-agent")\
 ;created=1735689600\
 ;keyid="poqkLGiymh_W0uP6PZFw-dvez3QJT5SolqXBCW38r0U"\
 ;alg="ed25519"\
 ;expires=1735693200\
 ;nonce="e8N7S2MFd/qrd6T2R3tdfAuuANngKI7LFtKYI/vowzk4lAZYadIX6wW25MwG7DCT9RUKAJ0qVkU0mEeLElW1qg=="\
 ;tag="web-bot-auth"
Signature: sig2=:jdq0SqOwHdyHr9+r5jw3iYZH6aNGKijYp/EstF4RQTQdi5N5YYKrD+mCT1HA1nZDsi6nJKuHxUi/5Syp3rLWBA==:
]]></artwork>
        </section>
      </section>
    </section>
    <section anchor="implementations">
      <name>Implementations</name>
      <t>This draft has a couple of public implementations. A demonstration server has been deployed to <eref target="https://http-message-signatures-example.research.cloudflare.com/">https://http-message-signatures-example.research.cloudflare.com/</eref>.</t>
      <t>It uses ed25519 example signing and verifying keys defined in <xref section="B.1.4" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.</t>
      <section anchor="clients">
        <name>Clients</name>
        <t>draft-meunier-webbotauth-httpsig-protocol-00</t>
        <ul spacing="normal">
          <li>
            <t><eref target="https://github.com/cloudflare/web-bot-auth">Chrome MV3</eref> (TypeScript)</t>
          </li>
          <li>
            <t><eref target="https://github.com/cloudflare/web-bot-auth">Cloudflare Workers</eref> (TypeScript)</t>
          </li>
          <li>
            <t><eref target="https://github.com/cloudflare/web-bot-auth">Rust binaries</eref> (Rust)</t>
          </li>
        </ul>
        <t>draft-meunier-web-bot-auth-architecture-03</t>
        <ul spacing="normal">
          <li>
            <t><eref target="https://github.com/stytchauth/web-bot-auth-example">Puppeteer script</eref> (JavaScript)</t>
          </li>
          <li>
            <t><eref target="https://github.com/olipayne/guzzle-web-bot-auth-middleware">Guzzle middleware</eref> (PHP)</t>
          </li>
          <li>
            <t><eref target="https://zenn.dev/oymk/articles/944069e5eddc27">Python script</eref> (Python)</t>
          </li>
          <li>
            <t><eref target="https://github.com/cyberstormdotmu/bot-authentication">Bot-Authentication</eref> (Python)</t>
          </li>
          <li>
            <t><eref target="https://github.com/cloudflare/web-bot-auth">HTTPie plugin</eref> (Python)</t>
          </li>
          <li>
            <t><eref target="https://github.com/cyberstormdotmu/bot-authentication">Web scrapers (scrapy/crawl4ai)</eref> (Python)</t>
          </li>
          <li>
            <t><eref target="https://github.com/HumanSecurity/human-verified-ai-agent">HUMAN Verified AI Agents</eref> (Python)</t>
          </li>
          <li>
            <t><eref target="https://github.com/nomadium/linzer/blob/master/spec/integration/cloudflare_example_research_spec.rb">Linzer</eref> (Ruby)</t>
          </li>
        </ul>
      </section>
      <section anchor="servers">
        <name>Servers</name>
        <t>draft-meunier-webbotauth-httpsig-protocol-00</t>
        <ul spacing="normal">
          <li>
            <t><eref target="https://github.com/cloudflare/web-bot-auth">Cloudflare Workers</eref> (TypeScript)</t>
          </li>
        </ul>
        <t>draft-meunier-web-bot-auth-architecture-03</t>
        <ul spacing="normal">
          <li>
            <t><eref target="https://github.com/cloudflare/web-bot-auth">Caddy plugin</eref> (Go)</t>
          </li>
          <li>
            <t><eref target="https://github.com/garyillyes/web-bot-auth-apache">Apache module</eref> (C)</t>
          </li>
        </ul>
      </section>
      <section anchor="test-vectors-1">
        <name>Test vectors</name>
        <ul spacing="normal">
          <li>
            <t>In <eref target="https://github.com/cloudflare/web-bot-auth/blob/main/packages/web-bot-auth/test/test_data/web_bot_auth_architecture_v2.json">JSON format</eref></t>
          </li>
        </ul>
      </section>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The editor would also like to thank the following individuals (listed in alphabetical order) for feedback, insight, and implementation of this document -
Marwan Fayed,
Maxime Guerreiro,
Scott Hendrickson,
Jonathan Hoyland,
Mark Nottingham,
Eugenio Panero,
Lucas Pardue,
Malte Ubl,
Loganaden Velvindron,
Tanya Verma.</t>
    </section>
    <section numbered="false" anchor="changelog">
      <name>Changelog</name>
      <t>draft-meunier-webbotauth-httpsig-protocol-00</t>
      <ul spacing="normal">
        <li>
          <t>Rename draft from <tt>draft-meunier-web-bot-auth-architecture</tt>.</t>
        </li>
        <li>
          <t>Add SSRF guidance for <tt>Signature-Agent</tt> directory fetches.</t>
        </li>
        <li>
          <t>Add deployment guidance for verifier outcomes, directory fetches, caching,
retry, rollout, proxies, CORS, and observability.</t>
        </li>
        <li>
          <t>Add guidance for test keys, static signatures, and discovery failures.</t>
        </li>
        <li>
          <t>Add multiple Web Bot Auth signatures and an example.</t>
        </li>
        <li>
          <t>Add typed <tt>Signature-Agent</tt> discovery examples for <tt>directory</tt>, <tt>jwks_uri</tt>,
and <tt>cimd</tt>.</t>
        </li>
        <li>
          <t>Group implementations by the draft version that added them.</t>
        </li>
        <li>
          <t>Clarify that <tt>Signature-Input</tt> <tt>keyid</tt> selects the key and <tt>Signature-Agent</tt>
points to candidate key material.</t>
        </li>
        <li>
          <t>Note <tt>Signature-Key</tt> as an optional discovery header.</t>
        </li>
        <li>
          <t>Align examples with published test-vector fixtures.</t>
        </li>
        <li>
          <t>Fix typos.</t>
        </li>
      </ul>
      <t>draft-meunier-web-bot-auth-architecture-05</t>
      <ul spacing="normal">
        <li>
          <t>Add Sandor Major as an author.</t>
        </li>
        <li>
          <t>Add session protocol considerations.</t>
        </li>
        <li>
          <t>Update HTTP Message Signatures test vectors.</t>
        </li>
        <li>
          <t>Keep legacy <tt>Signature-Agent</tt> string examples for implementers migrating to
dictionary members.</t>
        </li>
      </ul>
      <t>draft-meunier-web-bot-auth-architecture-04</t>
      <ul spacing="normal">
        <li>
          <t>Change <tt>Signature-Agent</tt> to a Structured Fields dictionary.</t>
        </li>
        <li>
          <t>Add a security consideration for intermediaries that relabel
<tt>Signature-Agent</tt> members.</t>
        </li>
        <li>
          <t>Allow <tt>@target-uri</tt> as a replacement for <tt>@authority</tt>.</t>
        </li>
        <li>
          <t>Add contributors.</t>
        </li>
        <li>
          <t>Add implementations.</t>
        </li>
        <li>
          <t>Remove the <tt>purpose</tt> field from the Web Bot Auth example.</t>
        </li>
      </ul>
      <t>draft-meunier-web-bot-auth-architecture-03</t>
      <ul spacing="normal">
        <li>
          <t>Update the Linzer example URL.</t>
        </li>
        <li>
          <t>Fix the section reference and name for status code 429.</t>
        </li>
        <li>
          <t>Fix typos.</t>
        </li>
      </ul>
      <t>draft-meunier-web-bot-auth-architecture-02</t>
      <ul spacing="normal">
        <li>
          <t>Add response status codes.</t>
        </li>
        <li>
          <t>Add references for readability.</t>
        </li>
        <li>
          <t>Add text about signing extra headers.</t>
        </li>
        <li>
          <t>Add TLS guidance to Security Considerations.</t>
        </li>
        <li>
          <t>Add RSASSA-PSS examples.</t>
        </li>
        <li>
          <t>Update acknowledgments.</t>
        </li>
        <li>
          <t>Add PHP, Python, Ruby, and Rust implementations.</t>
        </li>
        <li>
          <t>Fix <tt>Signature-Agent</tt> in the architecture diagram to use Structured Fields.</t>
        </li>
        <li>
          <t>Fix test vectors to use Structured Fields for <tt>Signature-Agent</tt>.</t>
        </li>
        <li>
          <t>Fix typos.</t>
        </li>
      </ul>
      <t>draft-meunier-web-bot-auth-architecture-01</t>
      <ul spacing="normal">
        <li>
          <t>Require clients to sign <tt>Signature-Agent</tt> when it is present.</t>
        </li>
        <li>
          <t>Add test vectors for requests with and without <tt>Signature-Agent</tt>.</t>
        </li>
        <li>
          <t>Fix the example diagram.</t>
        </li>
        <li>
          <t>Add reverse proxy security considerations.</t>
        </li>
        <li>
          <t>Update text about why an origin may request a new signature.</t>
        </li>
        <li>
          <t>Update nonce validation wording and uniqueness requirements.</t>
        </li>
        <li>
          <t>Add acknowledgments.</t>
        </li>
      </ul>
      <t>draft-meunier-web-bot-auth-architecture-00</t>
      <ul spacing="normal">
        <li>
          <t>Initial draft.</t>
        </li>
        <li>
          <t>Describe how to use HTTP Message Signatures to sign requests.</t>
        </li>
        <li>
          <t>Describe signature verification.</t>
        </li>
        <li>
          <t>Define the <tt>web-bot-auth</tt> tag.</t>
        </li>
        <li>
          <t>Derive <tt>keyid</tt> from the JWK Thumbprint.</t>
        </li>
        <li>
          <t>Add initial Security and Privacy Considerations.</t>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
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
yZ8lDy1w4MZ7/ee//KxTI4Y5KFdTqvOEb8Fq1vd298vaqlecwfDtnvk0xav8
bTlePMHGu79o+m9pulalurO3v7O1hU9FYpR/uHUy9832QXcwvVhUbyv96am9
ODq+/9S8+nQ/fXruPl5V7q18/by2gZ+B4fZhIwiN/DQM86DEVUtlei6zt7b3
9vbLySTEkz5szM1B+6o92u2+jGdB82Y2Otzaml2M99vj59OL+/LFTf/eLbdv
Dg62XybXvht3543d251+Ozra2bqqVcZ7w62do+vddrt+uHla3bv3B/ell+GH
DzTzai5WCjgBsvf96eCk2jkve93q9tn19U0r3HKbvVKlYw7D8X1x3znaaw6u
ms/+3NptTrb2zobTG3tcjbzJ3ey+bVlPzbD6dG7dvPQ3O9O7l8dD0/D3o6Px
Ts3aMs274mxQerqa3NyNT7ZarendqH18MDntlfrlknfteOPgeHTQbnj9zcu7
7ulNb3J+fHs+rDujdnf6YjQaOwfX0/3m0e3jqd+6PKpML+83S/eOF48fy8XT
u6C0ObF79tZ0fnwbXW3t7ndPRmf9dmlmP90Z3tFFKQiuqlfz/qFzP3YHh436
dvv85uz+/OguWBzFvdpjde7MHneLe/f7T/3DHeto0RoOG822vW1sxf3Ll0nN
6cVXi9vNy6fLwdGsPX++uR3fP18PfWP6+FINGrXS4TA2Kx8/+sXyo7F5USwN
Jpf2bvHqw4f3HKZYw+W+SnUPFA4L7AG1kELaYl6lLTMNXTIN6fl9vYHrL9j0
9R369sNggJrhSrL1VyK/X3JJbw1hryYheEVJpSoEzMrQRC1AbAtJx9OsMsIV
np8kZYONDM9tzVzjUng1FkxTiqwTR7QzJRs8cMIxcHeNu5TkUW1O+zdmgST9
Zv2FooKJVQCkbxIwCF0zIhNKca+ARmIasXB+Z6o1ku4QofNCVRtGAr2FzFQz
gr4TBUbggJyk9loFfWXKwH5E3JCaS6hhkqgJRhJHpdKUsKS5ITNt2WwVVEgf
38Ww8BnZxzHyeVzP6e1Zl3XCCSY2kVlCHpRQv/zFe0cnzk1c16xLOFuw/zZ8
/uxM4omwv2OOYR8R1gjfFE7o+dIblbT1wlaPgE3ARKMF2oTPIyMOyam/OiGp
EzTdHD7Pm9iiLhmQzDAJXcJX0prgFESAnBRNKruOPWquayd9cfiNcDl9EMUv
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
pF3u3r6cfTy986Z31dvgsbTbjs+fvJvbndbl3vTUO6+17i5mz9fWc6V8dmI/
Fc2To+Dlo/HyMYyNyvWl394cb3oOYMbVXv/g9rF042xPWqXJ/enZ5mBc2dkx
6+dhmje9jgEnWcIy18PPVoik5sar5RH/XGYteHT4L8Ok39BKy9iT5+2ii6/z
+Df13vK/Cu/4Z9dc/M+KgPKPigDVNCz/owty/tcix0pBzvDkZXp+YZ8YJ83L
0v6FcXqyf9+6rVrmTdcph1vzy9ZBsDMt7c1Mf9Atbe2Eg/r22UGzu1UMX9ru
wYFVmjXNxdXe3sFOvde4bY46Necm6O+/DO62Js8l47hUrnePb837cdcJTuxF
73nUj09nd1Z517Z2wvGtv9huP941o6fK3n5lx5ldXz0OrOb8blQy7nZOnse1
emXW8RpW92LgRePzW7sRN6+qB+fNy4PjRmV/0J0Py7tXj087lze390ZY3C8a
R9dB5aRW2W7d3d5b081i0Zy5jbPDaWXc8c8v5/uBv1W7DHbC4CTo2Y3o2ffK
xsCchyXj403XbVtWefCx22geT+b7J7WT88N6Y3zUa3Ti0vCkPC6+NBtPw8Vu
vXZ/19xvVEPXH26Z58PijbmzOdgbOqNKZZgRLOf2EJNKl+XLL+Egj0EdSjpj
ZzL25RjkLYcsECNYvPuaEAJCP2l2dfhfTT9vHNfq93rjrtZqnzfAdDvS7y+v
9Vqnodcu9CY+bDUuYB85Hf5a6zb06/ZhrdfQe5d67wReOri8aRT+LbIyPOMf
IqX++byHJtmvlDO85657En28qfdG3WZtHN6FJ/u3B+FOLXqO7upb9tWx0zSv
j7v+aRgdhXtu7dYYP46CwfzlfLR4jCZ21blrfZxNjm6fDhvhjtmrnA42D/pX
f1TB9I+QSP9LEWFFCDVLV7cXL8d3VrtkbFvd2eXJef3m8tLwGvcnh+PNj+HN
c2u/dX5XnG6P/Z394ehs3qk2LqPa4f7OcHe4fXzb3nUn01bx8ag22H/aaxx1
Dnvt88fru0V33ppt37eHRn9WPr9yRr3T4/JizyhPdprHbrQI4vnVhfPUPb25
jjvG8f5mv7RbP57UWkcfR5Wtu53ju3Pr6jSo1zpTu/fUnk/Lh/VNY29kHDaK
N41qI4ifXh5r1WJ5cjafBeOXcffJvq1GlzfR0fy20wGh6lhP8aC4d2rvjFv7
k9FwPNw2gtg6r1W759vzxeK+UXq87jSH5qW7ZwyDgXVaPbQH5cphsxM5l+cd
Y++xt29Oe+dHtfjo5GJzEnysFc9P9kdbw25zWDLb/c0ts1Xr2nY1Hsels8db
88gOdh9va4oQ0hvWYbcm3Gv1mO4+s9AZGFJ3zu/wtIl+nl/xtG3/gKftD+Fo
EzeP/tvD9iOBEmJeAoJfV51fmrd7m6Y1qVVm1r0x7D/7j9PLi7lRdLcaZ6fF
y0pxfri9t3MzC68eL4ud57bRjXY+Ps+ujJZ59XLhPZ1dFCdXO6PpsXMU+OXz
8tP4pfpv19of9vxWfGpXZxfbg57VvB+M9sqDmf+xfuVc1UpzO/ZfBvVu8Ry2
8tJr9e15q/V0stdulm/DRbFqbhv+zsHO4da+FxgXV9bBxWXtcLhntEqtp0F9
+Lf4lP5JPOdfXuv+l3MU/WMpwdufblcqz5PNi9PKdFSJp4MDMD7DeH4yr+zt
3t/sXhWPNncOutPj+s3jff3par4TvHgXtb32zc35ohvUbsPZ1ugqOnL8q/5O
o3QfGvG/bpDgj+Mh+mNhxYpW3rEujp6rB487Rly5H9ZaV+fFzsvk2v3Y2Lv6
eN407o470/n+XnV0683bg9Zzr1zeu2iNd+xRp1tqd91te6896l98rNW7hnds
jRrz+3r9f51r5I/Hnf+HfCJ/N2pbawPbexe73XLryCo+BdZOr9ypRNagFse1
C2941tw9P4rO7pvFmT9/GW+7tY/3htW825nflqut+fHuYb2337k+q51uPd2M
r7cmDfu84d6Wnv6wXvr/GWfIHwsDVvjto/W01X26nJ9Yi5NgfzOoPs4rzv3H
kx3j4vjMebyfFhthdLTduepdWU71onp/fxYcbk7qvdJJreR9PAydHe/0LD55
vnaK1e5iWgnObw8UL4C+1KxU1hYHxoALiw1snIOsLW02vVTCjV06smmrInuX
G3TYnshnZiz8s8SS9ffChXnJZpCTUosf0/Vja+AaAbGe4n/98reO8A77CEd8
EY/kxEkKqMhtTVpmL5LGqD/u2aBkaq421zQCLSw79hw7yMPxw+nj4dNFeTB9
XhZW57e2MD/4z/VRgCUjrZtKuvUhCI24T7tJN1dUcemd/ktvMbW7ZuBMo3c8
UPIm9sjB7ut/44CdGFuaYLmrY3/vWPjtuzXQSN7Jq3008lsVmrEdA9wjG/Nl
aR1rJw2jRWSOcIzMpBIvYPJTY2aoGzmOX15cbIFgWa49h9WuHdd3namx8Ozi
kF7Prjb9FsZvn7R54PYCeJu3stgX2/MKlj0r+ovJuEglh64dFve3t7d29u2q
bVlmeRfHoc95qAOYqZZJUF8P8UUfDhbrMC0/msRFucD0s6VxEW8dbMsbD51X
hnz1ENVxsDgF9mlg8wlQ1vBviyK1rtg2nHd/p7Vet0A3EwU9ll5r8k2h63GP
On/Itk9Fat6Rl0XqecNhCbM0wbnjvdjB2uE8f2JYTjwpuvROse/6/eLEwFu2
iljjVsS6lyFzQAVknwTWfZLc6BO+XAj6RAP9xTulb94PcYe/K1F/JznWQblY
/BjqHPsM8dqUajUnvhW768luCJq947oLIJDsguhLGKr+Lm3MNZM5pL9iNe+f
T7uXFzq3ZPie9cnDdbwiTDIGTMnOXaSrsfD/PmHXDvztE/z2CX/7pALq06xM
N3G9o14eNRPr/l3bGlItiPb5PReOg26zMTDc0N74wkq8bVG393la2s3XMvlU
ZDde0gnTjjRAeFh7JroYutMRKHdISi62JbCDd5RyO7BtiwvMwaDALjqiiVLW
R051rWqXkbzWMoK54elH2E4rB/96xnsAj2MbDA4n8HNa1/SjSD8BuRg45hh2
ndNOsU811gWe+AsXZsHPgrF+4dOVVyNjktMaMdCh4+ttw7NxlPPYBL2hbQRW
bOPrbmTr130XfvCHhmfghbA3tjuDTQc4Q8/wFgayhIlBmcR16kzs+sP10P0+
+srrHdujgnnSh7j55TfSCN0xWbMsbjAn26nQCayacGt6BPLHSoVZZoikYlzW
SudWx8jJMni8zIzKf3OyKjInO47nqAiKMcDvo+ImmnPIBWRmTVrL5VYqj0S9
Y7aTCaXVi4Fk/c0rVYyhvIxLam/iM75RcR3E5ETiA64WV65SzCl3/CEEqNCa
LiDEsY8DUGtXuhGJSzv5uJEjy5Y/0ozCu5Lh6zqwjKQecfVebHlFIBcKhEkv
l/WtjXWdmn1wbRa8wjGrTGEdTHmBafvKx2f2gtq2YE/0qahSX74pjIDowicp
kKhMihT5ELsEkMuBmSaYjc+RPLEjUG0B9D4GyL5ZKFQ1ifKwCxiwZTxiAT+t
ka08earL9zQtX2YCr11zc+zXbsBUQ4H4+hn2E3LZdbSKLcJxlEGV5Oypnawz
DESzbJ9a80ifkii4+C44bCMcmBGtWQsV63ajIKa3LQA1WevplBJIRnphU/aW
BVp9tsqWEFH0U4f1v1Y3wtSIgkN/+J0be+aRPrgX43Kl6ENqmyfcjFrgYn9e
AXd8tmwQEt+c+KLW90EUAso70ZOgaoYRJGT/XTpIgiY4HitviSmHt7ZKTB7Z
SWQ5bUWC1Ejcnars1VuRy/s/TANlSQNps5h05ARiySIYFQOg1iW+i03DdKOP
NavSJoUngSFvn5DvYTOJhEcDar1yEZl8XamrkcSgEJuRVVDkR2DO5HRWk3M6
Kq3M68n8W3P2CLdVBBSurEx3RMBeILuJrMVfIYrkFDJx/1deXi9af/ggSyz+
+YIJ2SsOb1tGdvpaE+koc1+uPEll8XzaalNEQ9zLjSf9+uqVFrICaCkqqdex
rOcY6hkriDUfLZQrNTCVIrnpIHsfvfK5t3wH15zvI6B9rN49lcGjFfT69tMg
ZazpOdSrhL6iK7xFPxF9hNd7M168KjDE0aUXtijfp37y7A2O+Ap1vCNGlrmd
XI+MIb+Ad44kIj/hbnjzcQ+szj7ezZIggyO2kJApgm19i9GC9v8BVENx6s+3
AAA=

-->

</rfc>
