返回博客

Timing-Allow-Origin:分析工具在 Resource Timing API 中能看到什么

Timing-Allow-Origin 请求头控制着页面能读取多少跨域计时细节。以下是它对隐私优先性能测量的意义。

没人会刻意设置的请求头

大多数团队第一次接触 Timing-Allow-Origin(TAO)都是因为监控工具里的图表显示出可疑的零值。跨域资源——字体、来自 CDN 的图片、第三方脚本——会出现在 Resource Timing API 中,但除非响应服务器明确选择开放,否则它们详细的子计时都会返回 0。这个选择开放的机制就是 TAO 请求头。如果你想在不依赖侵入式追踪的前提下获得真实的性能数据,理解它至关重要。

Resource Timing 标准会为页面发起的每一次请求暴露一个 PerformanceResourceTiming 条目。对于同源资源,你能获得完整的细分:DNS 查询、TCP 连接、TLS 协商、请求开始以及响应各阶段的计时。而对于跨域资源,规范有意限制文档能读取的内容,因为这些细粒度的计时可能泄露关于用户网络状态、缓存内容或另一个源内部行为的信息。

哪些数据会被清零

如果没有匹配的 TAO 请求头,跨域 PerformanceResourceTiming 条目上的以下属性会被强制归零:redirectStartredirectEnddomainLookupStartdomainLookupEndconnectStartconnectEndsecureConnectionStartrequestStartresponseStarttransferSizeencodedBodySizedecodedBodySize。你仍然可以获得 startTimedurationresponseEnd 以及资源的 nameinitiatorType。实际上这意味着你能知道某个资源加载了、总共花了多长时间,但无法知道时间花在了哪里,也不知道有多少字节经过了网络传输。

这项检查由 Resource Timing 规范中的 timing allow check 算法定义。如果一个资源的响应携带了 Timing-Allow-Origin,且其值要么等于发起请求的文档的源,要么是通配符 *,那么该资源就通过检查。

Timing-Allow-Origin: https://example.com
# or, to allow any origin
Timing-Allow-Origin: *

为什么这对隐私优先的分析很重要

Monoid 从真实环境中测量性能——由真实访客发起的真实导航——不使用 cookie、不使用 localStorage、也不进行指纹识别。Resource Timing 和 Navigation Timing API 正是实现这一目标的标准化方式,而 TAO 就是平台用来默认保持跨域计时数据机密性的机制。

这个默认行为是一项隐私特性,而不是障碍。清零机制的存在正是为了阻止页面通过计时侧信道探测第三方源。当我们建议你在自己的静态资源和 CDN 上设置 Timing-Allow-Origin 时,我们是在请你把你自己的基础设施开放给你自己的测量——而不是削弱任何人的保护。

Core Web Vitals 进一步印证了这一点。Largest Contentful Paint 往往是一张跨域图片或一个 web 字体。如果这些响应缺少 TAO 请求头,你仍然可以通过 Largest Contentful Paint API 观察到 LCP 元素,但你会失去请求和响应的子计时——正是这些数据能告诉你延迟究竟是由缓慢的 DNS、冷启动的 TLS 握手,还是庞大的传输造成的。给你的资源源加上这个请求头,就能把一个不透明的数字变成一个可付诸行动的数字。

正确地设置它

几点实用说明。首先,transferSize 非零还能让你区分缓存命中(较小的传输大小)和网络请求,这在诊断重复访问的性能时极为宝贵。其次,如果你跨域提供字体,CSS 的 crossorigin 属性和 CORS 是与 TAO 分开的另一件事——你可能两者都需要。第三,在可能的情况下,优先指定具体的源而不是使用 *,这样只有真正需要这些数据的文档才能接收到它们。

在 Cloudflare 上,你可以用 Transform Rule 或在 Worker 响应中于边缘添加该请求头,并将其应用到你的资源路径。由于 Monoid 运行在同一边缘上,访客浏览器收集的计时数据会直接汇入聚合的、无标识符的指标——无需任何按用户建立的画像,就能知道你的主视觉图片在 TLS 上花了 400ms。

核心要点

Timing-Allow-Origin 是一个小小的请求头,却对你能从真实性能数据中获取多少信息有着巨大的影响。浏览器的默认行为——将跨域子计时清零——是一项刻意设计的隐私保护措施,而它与隐私优先分析应有的工作方式完美契合:从标准 API 测量聚合数据、明确地把你自己的源开放出细节,并且永远不把用户的网络指纹当作可采集的东西。给你的资源设置好 TAO,你的 Web Vitals 调试就会更加清晰,而完全无需任何追踪。

Sources

Comments

Loading comments…