<?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.27 (Ruby 3.3.6) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-meunier-web-bot-auth-architecture-00" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.28.1 -->
  <front>
    <title abbrev="HTTP Message Signatures for Bots">HTTP Message Signatures for automated traffic Architecture</title>
    <seriesInfo name="Internet-Draft" value="draft-meunier-web-bot-auth-architecture-00"/>
    <author fullname="Thibault Meunier">
      <organization>Cloudflare</organization>
      <address>
        <email>ot-ietf@thibault.uk</email>
      </address>
    </author>
    <date year="2025" month="April" day="15"/>
    <area>Web and Internet Transport</area>
    <workgroup>Web Bot Auth</workgroup>
    <keyword>not-yet</keyword>
    <abstract>
      <?line 42?>

<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-web-bot-auth-architecture.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-meunier-web-bot-auth-architecture/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        WG Web Bot Auth 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 50?>

<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 to 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 architectures 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 <tt>Signature-Agent</tt> header for discovery for 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 the following component:</t>
        <dl>
          <dt><tt>@authority</tt></dt>
          <dd>
            <t>as defined in <xref section="2.2.1" 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"/> foe 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 RECOMMEND the expiry to be no more than 24 hours.</t>
        <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>.</t>
          <t>Agents <bcp14>SHOULD</bcp14> extend <tt>@signature-parameters</tt> defined in <xref target="generating-http-message-signature"/> as follow</t>
          <dl>
            <dt><tt>nonce</tt></dt>
            <dd>
              <t>Base10 encoded random uint32</t>
            </dd>
          </dl>
          <t>This <tt>nonce</tt> <bcp14>MUST</bcp14> be unique for the validity window of the signature, as defined by created and expires attributes.
Because the <tt>nonce</tt> is controlled by the client, the origin needs to maintain a list of all nonces that it has seen that are still in the validity window of the signature.</t>
        </section>
        <section anchor="sending-a-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 look as follow.</t>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="208" width="744" viewBox="0 0 744 208" 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,192" fill="none" stroke="black"/>
                <path d="M 576,112 L 576,192" fill="none" stroke="black"/>
                <path d="M 648,32 L 648,160" fill="none" stroke="black"/>
                <path d="M 736,32 L 736,160" fill="none" stroke="black"/>
                <path d="M 8,32 L 88,32" fill="none" stroke="black"/>
                <path d="M 648,32 L 736,32" fill="none" stroke="black"/>
                <path d="M 96,62 L 296,62" fill="none" stroke="black"/>
                <path d="M 96,66 L 296,66" fill="none" stroke="black"/>
                <path d="M 440,62 L 640,62" fill="none" stroke="black"/>
                <path d="M 440,66 L 640,66" fill="none" stroke="black"/>
                <path d="M 136,112 L 576,112" fill="none" stroke="black"/>
                <path d="M 88,128 L 128,128" fill="none" stroke="black"/>
                <path d="M 584,128 L 640,128" fill="none" stroke="black"/>
                <path d="M 8,160 L 88,160" fill="none" stroke="black"/>
                <path d="M 648,160 L 736,160" fill="none" stroke="black"/>
                <path d="M 136,192 L 576,192" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="648,128 636,122.4 636,133.6" fill="black" transform="rotate(0,640,128)"/>
                <polygon class="arrowhead" points="648,64 636,58.4 636,69.6" fill="black" transform="rotate(0,640,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="364" y="52">Exchange</text>
                  <text x="368" y="68">Cryptographic</text>
                  <text x="364" y="84">material</text>
                  <text x="48" y="100">Agent</text>
                  <text x="692" 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="256" y="148">abc==</text>
                  <text x="212" y="164">Signature-Input:</text>
                  <text x="424" y="164">sig=(@authority);tag="web-bot-auth"</text>
                  <text x="212" y="180">Signature-Agent:</text>
                  <text x="356" y="180">signer.example.com</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
+---------+                                                                     +----------+
|         |                              Exchange                               |          |
|         |<=========================  Cryptographic  =========================>|          |
|         |                              material                               |          |
|  Agent  |                                                                     |  Origin  |
|         |     .------------------------------------------------------.        |          |
|         +-----| GET /path/to/resource                                |------->|          |
|         |     | Signature: abc==                                     |        |          |
+---------+     | Signature-Input: sig=(@authority);tag="web-bot-auth" |        +----------+
                | Signature-Agent: 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 a section below, the Agent <bcp14>MAY</bcp14> send request with an additional header
3. <tt>Signature-Agent</tt> defined in <xref target="signature-agent"/></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. 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"/>.</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 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 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 the provider directory as indicated by <tt>Signature-Agent</tt> header defined in Section 4 of <xref target="DIRECTORY"/>.</t>
          </li>
        </ul>
      </section>
      <section anchor="key-distribution-and-discovery">
        <name>Key Distribution and Discovery</name>
        <t>This section describes the discovery mechanism for the agent directory.</t>
        <t>The reference for discovery is a FQDN. It <bcp14>SHOULD</bcp14> provide a directory hosted on the well known registered in Section 4 of <xref target="DIRECTORY"/>.</t>
        <t>We add one field to the directory defined in the other draft:
"purpose": Ideally matches some IANA registry for preferences</t>
        <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
  },
  "signature_agent": "https://directory.test",
  "purpose": "rag"
}
]]></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">
          <name>Signature-Agent header</name>
          <t>This is defined in the sibling draft.
This allows for backward compatibility with existing header agent filtering, and an upgrade to cryptographically secured protocol.</t>
        </section>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="performance-impact">
        <name>Performance Impact</name>
        <t>Origins must 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="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>MUST 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>
    <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>
            <date day="15" month="April" year="2025"/>
            <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 new HTTP Method Context to allow for
   in-band key discovery.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-meunier-http-message-signatures-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="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="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>
      </references>
    </references>
    <?line 354?>

<section anchor="implementations">
      <name>Implementations</name>
      <t>This draft has a couple of <eref target="https://github.com/cloudflareresearch/web-bot-auth">implementations</eref></t>
      <t>Clients:</t>
      <ul spacing="normal">
        <li>
          <t>Chrome MV3</t>
        </li>
        <li>
          <t>Cloudflare Workers</t>
        </li>
      </ul>
      <t>Servers:</t>
      <ul spacing="normal">
        <li>
          <t>Caddy plugin</t>
        </li>
        <li>
          <t>Cloudflare Workers</t>
        </li>
      </ul>
      <t>A demontstration 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>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA61b61YcR5L+n0+R2/4xvnQ3Qki2xdozbgGSGAuBAY3HO2fO
kF2V3V2murKnsgrUluVn2WfZJ9svIjLrAo3A3uXoHEFVXiLj+kVk1Gg0UlVW
5XZXD16dn5/oI+u9mVt9ls0LU9Wl9XrmSm3qyi1NZVNdlWY2yxI9KZNFVtmE
xgyUmU5Le3XPIs9d5QcqwTJzV653dVbMnFKpSwqzBAEpVq5GS1sXmS1H13Y6
mrpqhJ0XI9PZbPTokfL1dJl5n7miWq8w9fDg/IUq6uXUlrsqxQa7KnGFt4Wv
/S5Irq0CcTvKlNbs6h/tVJsi1YdFZcvCVvq8NIVfubJS1668nJeuXskoUKwn
IEBd2jVepbtKj3QBqta2Ule2qLGR1nHCS/wu9PTmar00WQ7edI/0XWar2diV
8wHe0/HwflFVK7+7tUXD+cRXdhyHbdGDrWnprr3d6i60RQvMs2pRT7FEtcim
4OAWLQVWshhGvhHDKM1KcBHcp1k5GOWrzsZh9liWG2fu/nW2Hii18aJa5gOl
6IUriY8gQOtZneci/XPsbeq8gvLwUvwaBzdF9oupIOldvZe7Op2BNZZfWmEr
diMmfVeFBcb1pVKFK6GuYCDJZ//w9GDv/Pj0JyjKaH/cp/jeE2IBUurR0cHZ
2eTlwejs8OWbyfnb04OzXX36Yu/Zk8fbYYj8vb39KE7Zm+y9OohPadRff/x+
dPy9DPz60c5X4dH5q7dHz09OD9+c85uvvtz5WilF5tE5xfHk7fmr0fODyenB
KQ/78qunj5QajUbaTD3MMqmUAhe9hkXVS1tUOrU+KbMpzM8UuisNNscsxZhs
ts6KeWvfKtp37en5+/d3nP3DhzFEZvXcmVxhz8ppk+fuuuMp2BUkeYZd+H1S
rleVm5dmtcgSDF5rYrd2dTV1dZGq0v67hj76oaxE2/MS3pZXtuQl8D8I1tXC
ZpH+aq2voa4a9j6jJ4kdK+HKMkvT3Cr1CRl66dI6ITVSajJniqBG8EAJPAKd
FNTUHkRnhZ7S0aEQ7CPwsNTkFWYgCaRhRl6nRNvkUBu4IF8ZrDZU3hKD8T61
7/B6SARVJAQzn5d2zio85CU7vhTHxVjmpLcYyYQVll45Xdo8M1MQFgWlcO6l
t/mVZWa4MptnhbhWb8Eak2s6DRzfrlLbY31q5zVsHDoMYpYrrAbuaGJzVtIJ
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
c7x/DK1pvm0Yq/8FptQAkdE9AAA=

-->

</rfc>
