What is the Signature-Agent header?

Signature-Agent is an HTTP request header defined by the IETF Web Bot Auth draft. It tells the site where to find the signing bot's public keys: an HTTPS URL serving a JWK Set. The header itself must be covered by the request's HTTP message signature, so it cannot be swapped without breaking the signature.

At a glance

Defined in
draft-ietf-webbotauth-httpsig-protocol (IETF working-group draft, -01 as of October 2026)
Format
Structured Field Dictionary. Each member is a string holding an https URL.
Dictionary key
The label of the signature it belongs to, e.g. sig1
Points to
A JWK Set, often at /.well-known/http-message-signatures-directory
Must be signed
Yes. Its member must be a covered component, alongside @authority or @target-uri.
Legacy form
A bare string. Verifiers may accept it. Signers must send the dictionary form.

How it works

  • Read it: the header maps a signature label to a URL, for example sig1="https://signer.example.com". Google’s signed Google-Agent requests send g="https://agent.bot.goog".
  • Check it was signed: the matching Signature-Input must list "signature-agent";key="<label>" as a covered component, plus @authority or @target-uri, and carry tag="web-bot-auth".
  • Fetch and verify: get the JWK Set from that URL, pick the key whose thumbprint matches keyid, and verify the signature. Accept the older bare-string form too while signers catch up.
Signature-Agent: sig1="https://signer.example.com"
Signature-Input: sig1=("@authority" "signature-agent";key="sig1");created=1700000000;expires=1700011111;keyid="ba3e64==";tag="web-bot-auth"

Still moving

The working group has one adopted draft today and several related individual drafts, including a registry and “signature agent card” proposal. Details such as the header format have already changed once, so check the current draft before building your own verifier.

The rest of the signature

Quick answers

Does a Signature-Agent header prove identity on its own?

No. Anyone can send it. Identity is proven only when the signature verifies against a key from the URL it names, and you trust that URL's operator.

Is it the same as the User-Agent header?

No. User-Agent is a self-reported name. Signature-Agent is a signed pointer to the keys that prove who the signer is.

Why do some requests send a plain URL string?

Earlier drafts used a bare string. The current draft uses a dictionary but lets verifiers accept the old form, and many signers still send it.

Sources