并非所有自动流量都一样
自动客户端每分钟都会访问你的应用: 搜索爬虫、监控工具、合作伙伴集成、为用户抓取页面的 AI 助手,以及执行任务的自主 agent。多年来,大多数应用区分它们的唯一方式是 user-agent 头,这是一种任何客户端都可以随意设置的字符串。
这让应用团队陷入两难。若对所有自动化都持怀疑态度,就会降低客户所依赖的合法 agent 的使用体验。若相信这个头部字段,就等于允许任何人冒充知名爬虫。
已验证的自动请求改变了这一局面。当自动客户端使用其已发布的密钥对请求签名时,你的应用可以检查该签名,并在密码学层面知道究竟是哪个客户端签署了该请求。Proof of Actor 将这项检查纳入一个统一、一致的 actor 结果中,供你的代码进行路由判断。若想更深入了解该检查能证明什么、不能证明什么,请阅读 已签名的 AI agent 请求能证明什么。
请求签名的工作方式
用于自动流量的新兴方法采用 HTTP message signatures,其标准化定义见 RFC 9421,该标准规定了如何对 HTTP 消息的各个组成部分创建、编码和验证签名。客户端使用私钥对每个请求的选定部分进行签名,并在 header 中包含签名及其参数。然后,它会在与其控制的标识符相关联的位置发布对应的公钥,通常是其域名。
当请求到达时,接收方会获取或查找已发布的密钥,重建被签名的内容,并检查签名。如果验证通过,说明该请求是由持有该密钥的一方签署的。对自动流量签名的工作仍在 IETF 的 Web Bot Auth working group 中继续推进,其章程涵盖对自动客户端进行密码学认证,例如代表最终用户运行的爬虫和 AI agent;Web Bot Auth 词条对其作了概述。关于 已签名的 AI agent 请求能证明什么 的博客文章会逐步展示一个已验证请求的完整流程,而 APIs use case 则说明验证最先在哪些场景产生价值。
关于 验证已签名的 agent 请求 的指南则详细介绍了相关机制,包括时间戳、重放窗口和密钥缓存。
已验证的签名能证明什么,不能证明什么
这是妥善处理已验证自动请求时最重要的区别。
有效签名证明该请求是使用与已发布标识符关联的密钥签署的。如果该密钥属于运营方的域名,则该请求来自持有该运营方密钥的客户端。
有效签名不能证明:
- 是谁指示了该 agent,或是否有人要求执行此操作;
- 某个人是否将权限委托给了该 agent;
- 运营方背后的真实世界法律身份;
- 请求的操作在你的应用中是否安全或被允许。
这些都是不同的问题。你的应用会通过自身的凭证、授权模型和 policy 来回答它们。Proof of Actor 会刻意将这些层面区分开来,而 Detection & Limitations 页面会明确说明每类证据能够建立什么。
Proof of Actor 如何处理已验证的自动请求
Detect
你的集成会将请求上下文,包括任何签名 header,传递给 Proof of Actor。系统会根据已发布的密钥检查签名。通过验证的请求会以 Verified 基础记录。仅声明自身身份的客户端会以 Declared 记录。行为模式会以 Inferred 记录。当证据不足时,结果为 Unknown。只有在密码学检查通过时,才会提升为 Verified。
Understand
查看哪些已验证的运营方在调用你的应用、他们使用哪些 route、频率如何,以及这与已声明和未知自动化相比有何不同。每个结果上的证据摘要都会告诉你涉及了哪一个密钥和标识符,因此你的团队可以快速调查任何请求。
Route
在你的 policy 中使用该依据。常见模式包括:
- 在只读 route 上为已验证 agent 提供结构化响应,例如 API 或页面的 Markdown 版本。
- 对你识别出的已验证运营方提高 rate-limit,同时对已声明客户端保持标准限制。
- 无论签名如何,对每条写入 route 都保留现有授权。
- 为每条 route 明确定义未签名和 Unknown 调用方的回退处理。
由你的 policy 决定,Proof of Actor 提供证据。
为什么 user-agent header 还不够
user-agent 字符串只是声明。任何客户端都可以发送任意值,而且 user-agent spoofing 不需要什么技巧。这就是爬虫运营方会发布自己的检查方法的原因: Google 记录了用于 验证 Googlebot 的反向和正向 DNS 查询以及已发布的 IP 段,Bing 记录了用于 验证 Bingbot 的 DNS 检查,而 OpenAI 为其每个 crawlers and user agents 发布了 IP 段文件。Proof of Actor 将 user-agent 声明视为已声明证据,绝不将其视为验证。这意味着,一个自称知名爬虫但没有有效签名的客户端,会被报告为具有已声明或已推断基础,而你的 policy 可以将其与已证明身份的客户端区别对待。
这正是已验证自动请求的价值所在: 它们为你提供了一种可靠方式,把信任扩展给那些赢得信任的客户端,而不是扩展给每一个复制其 header 的客户端。
身份证据、凭证与授权
在任何服务自动客户端的应用中,以下三层都会协同工作:
- 身份依据: 是哪个客户端签署了这次请求? 已验证签名会回答这个问题。
- 凭证: 是哪个账户负责? 你的 API key、token 或 session 会回答这个问题。
- 授权: 这个调用方可以这样做吗? 你的权限模型会回答这个问题。
Proof of Actor 强化第一层并使其可见。它不会签发身份或委托凭证,也不会替代你的授权。保持各层分离,才能让你在低风险 route 上更宽松地对待已验证 agent,同时在高影响 route 上保持审慎。
它适合放在哪里
Proof of Actor 位于你的 gateway、认证和 rate limiting 旁边。集成以服务器端 middleware 的形式运行,部署在 edge、你的 MCP server 中,或通过通用 HTTP 集成实现,并与每个创始团队一起进行面对面的交付。如果你的流量主要是 APIs 和工具,APIs 和 MCP Servers use case 展示了最重要的模式。
从观察模式开始
每次集成都从观察模式开始。系统会记录结果,而不会改变你的应用响应方式,因此你可以看到自动流量中有多少是已验证的、哪些运营方在签名,以及 Unknown 比例在哪些地方最高。只有当证据支持时,policy 才会在之后按 route 引入。How It Works 会完整演示整个流程。
让验证可靠的实用细节
签名检查的可靠性取决于其周边细节。若要在生产环境中依赖已验证的自动请求,以下实践很重要。
检查新鲜度
RFC 9421 定义了 created 和 expires signature 参数,已签名请求通常会携带这些参数。拒绝超出短时间窗口的签名,这样被截获的请求就无法在之后重放。
合理缓存密钥
如果每个请求都去获取运营方已发布的密钥,会增加延迟。应在合理时长内缓存这些密钥,并在签名因未知密钥标识符而失败时刷新,以避免密钥轮换造成误判失败。
签署请求的正确部分
只覆盖时间戳的签名几乎不能证明什么。要检查被签名的组件是否包含 method、path 和 host,这样签名才能绑定到你的应用实际收到的请求。
记录证据
为每个已验证请求保留 key identifier、已发布标识符和结果。当出现异常时,你的团队可以精确查看是谁在什么时间签署了什么。
Proof of Actor 在 Detect 步骤中处理这些检查,并将结果作为 policy 可读取的依据报告出来,因此你的应用代码可以保持简洁。
加入创始开发者计划
Proof of Actor 目前处于 private beta。入选的创始开发团队可在约定的使用限额内,获得最长 12 个月的免费访问,并由我们的工程师提供直接集成支持。
如果自动客户端会访问你的应用,而你希望对已验证的客户端区别对待,请 申请早期访问。告诉我们你的应用以及你看到的自动调用方,我们会向你展示 Proof of Actor 如何适配。
来源
- RFC 9421: HTTP Message Signatures, IETF, 2024年2月.
- Web Bot Auth (webbotauth) working group charter, IETF.
- Verifying Googlebot and other Google crawlers, Google Search Central.
- How to verify that Bingbot is Bingbot, Bing Webmaster Blog.
- Overview of OpenAI crawlers, OpenAI.