Signed Exchange (SXG)

SXG 是一种传送机制,通过这种机制,无论资源的传送方式如何,都可以对资源的来源进行身份验证。

Katie Hempenius
Katie Hempenius
Devin Mullins
Devin Mullins

Signed Exchange (SXG) 是一种提交机制,它让您可以对资源的来源进行身份验证,而无需考虑资源的分发方式。实现 SXG 可以通过启用可保护隐私的跨源预提取来改进 Largest Contentful Paint (LCP)。此外,这种分离还可以推进各种用例,例如离线互联网体验和从第三方缓存传送。

本文全面介绍了 SXG:其工作原理、应用场景和工具。

浏览器兼容性

基于 Chromium 的浏览器支持 SXG(最低版本为 Chrome 73、Edge 79 和 Opera 64)。

概览

作为其主要用例,SXG 使用缓存来预取和提供已由源站加密签名的内容。这有助于加快来自引荐网站的跨源导航,同时确保网页保持不变,并正确注明其来源。在用户进入网站之前,所有可能识别的信息均处于隐藏状态,从而保护用户的隐私。 Google 搜索是 SXG 预提取功能的尝鲜者,对于从 Google 搜索接收很大一部分流量的网站来说,SXG 是为用户提供更快网页加载速度的重要工具。我们希望随着时间的推移,这种影响会扩大到更多引荐来源网址。

工作原理

网站对请求/响应对(“HTTP 交换”)进行签名,使浏览器能够独立于内容的分发方式验证内容的来源和完整性。因此,浏览器可以在地址栏中显示源网站的网址,而不是传送内容的服务器的网址。

说明 Signed Exchange 工作原理的图表。与缓存通信的浏览器,缓存与目标网站进行通信

一直以来,网站要在保持归因的同时通过第三方分发其内容的唯一方式是,网站与分销商共享其 SSL 证书。这存在安全缺陷;此外,实现内容真正可移植性还有很长的路要走。

SXG 格式

SXG 封装在一个二进制编码文件中,该文件有两个主要组成部分:HTTP 交换和覆盖该交换的签名。HTTP 交换由请求网址、内容协商信息和 HTTP 响应组成。

下面是一个已解码的 SXG 文件示例。

format version: 1b3
request:
  method: GET
  uri: https://example.org/
  headers:
response:
  status: 200
  headers:
    Cache-Control: max-age=604800
    Digest: mi-sha256-03=kcwVP6aOwYmA/j9JbUU0GbuiZdnjaBVB/1ag6miNUMY=
    Expires: Mon, 24 Aug 2020 16:08:24 GMT
    Content-Type: text/html; charset=UTF-8
    Content-Encoding: mi-sha256-03
    Date: Mon, 17 Aug 2020 16:08:24 GMT
    Vary: Accept-Encoding
signature:
    label;cert-sha256=<em>ViFgi0WfQ+NotPJf8PBo2T5dEuZ13NdZefPybXq/HhE=</em>;
    cert-url=&quot;https://test.web.app/ViFgi0WfQ-NotPJf8PBo2T5dEuZ13NdZefPybXq_HhE&quot;;
    date=1597680503;expires=1598285303;integrity=&quot;digest/mi-sha256-03&quot;;sig=<em>MEUCIQD5VqojZ1ujXXQaBt1CPKgJxuJTvFlIGLgkyNkC6d7LdAIgQUQ8lC4eaoxBjcVNKLrbS9kRMoCHKG67MweqNXy6wJg=</em>;
    validity-url=&quot;https://example.org/webpkg/validity&quot;
header integrity: sha256-Gl9bFHnNvHppKsv+bFEZwlYbbJ4vyf4MnaMMvTitTGQ=</p>

<p>The exchange has a valid signature.
payload [1256 bytes]:</p>
<pre class="prettyprint"><code>&lt;title&gt;SXG example&lt;/title&gt;
&lt;meta charset=&#34;utf-8&#34;&gt;
&lt;meta http-equiv=&#34;Content-type&#34; content=&#34;text/html; charset=utf-8&#34;&gt;
&lt;style type=&#34;text/css&#34;&gt;
body {
    background-color: #f0f0f2;
    margin: 0;
    padding: 0;
}
&lt;/style&gt;
</code></pre>
<div>
    <h1>Hello</h1>
</div>

<p>

签名中的 expires 参数表示 SXG 的失效日期。SXG 的有效期最多为 7 天。如需详细了解签名标头,请参阅 Signed HTTP Exchanges 规范

支持服务器端个性化

包含 Vary: Cookie 标头的 SXG 将仅向没有已签名请求网址的 Cookie 的用户显示。如果您的网站向已登录用户呈现不同的 HTML,您可以使用此功能来充分利用 SXG,而无需改变这种体验。如需了解详情,请参阅使用 Dynamic SXG 进行服务器端个性化

网络打包

SXG 是更广泛的网络打包规范提案系列的一部分。除了 SXG 之外,Web 打包规范的另一个主要组成部分是 Web Bundle(“捆绑的 HTTP 交换”)。Web 软件包是 HTTP 资源以及解读该软件包所需的元数据的集合。

SXG 和 Web Bundle 之间的关系是一个常见的混淆点。SXG 和 Web Bundle 是两种不同的技术,它们互不依赖 - Web Bundle 可用于已签名和未签名的广告交易平台。SXG 和 Web Bundle 共同发展的一个共同目标是创建一种“网络打包”格式,这种格式允许整体共享网站以供离线访问。

使用 Signed Exchange 加快网页加载速度

启用 Signed Exchange 有助于提高网页性能,进而影响网站的核心网页指标,尤其是 Largest Contentful Paint (LCP)。作为尝鲜者,Google 搜索利用 SXG 为从搜索结果页加载的网页为用户提供更快的网页加载体验。

Google 搜索会抓取并缓存 SXG(如有),并预提取用户可能会访问的 SXG,例如与第一条搜索结果对应的页面。

SXG 与其他性能优化(例如使用 CDN 以及减少阻塞渲染的子资源)协同发挥作用时效果最佳。实现 SXG 后,请按照这些建议操作,以最大限度地发挥预提取 SXG 的 LCP 优势。在许多情况下,此类优化可能会使 Google 搜索近乎即时地加载网页:

Signed Exchange 的影响

从过往实验中,我们观察到,启用 SXG 的预提取使得 LCP 平均缩短了 300 毫秒至 400 毫秒。这有助于网站给用户留下更好的第一印象,而且往往会对业务指标产生积极影响。

一些全球品牌和网站已经从 Signed Exchange 中受益。作为案例研究,我们来看看实施 Signed Exchange 如何帮助 RebelMouse(一个著名的内容管理系统 (CMS))提升其客户的表现和业务指标:

  • Narcity 将 LCP 提高了 41%
  • Paper Magazine 发现,每位用户的会话数增加了 27%
  • MLT 博客将网页加载时间缩短了 21%

Cloudflare 发现,SXG 在其测试中为 98% 的网站改进了 TTFB,并提升了 85% 网站的 LCP,其中符合 SXG 规定的网页加载速度中位数超过 20%。

索引编制

Google 搜索不会对网页的 SXG 和非 SXG 表示法进行排名或编入索引。SXG 最终是一种传送机制,它不会更改底层内容。

AMP

AMP 内容可以使用 SXG 提交。SXG 允许使用其规范网址(而非 AMP 网址)预提取和显示 AMP 内容。AMP 拥有自己的独立工具,可用于生成 SXG。如需了解如何使用 Signed Exchange 提供 AMP 内容,请访问 amp.dev

使用 Chrome 开发者工具调试 SXG

如需亲身查看 SXG,请使用 Chromium 浏览器,打开开发者工具,打开“Network”面板,然后访问此搜索页面示例。您可以通过在类型列中查找 signed-exchange 来识别 Signed Exchange。

显示开发者工具“Network”面板中的 SXG 请求的屏幕截图
开发者工具中的网络面板

Preview 标签页提供了有关 SXG 内容的更多信息。

SXG 的“Preview”标签页的屏幕截图
开发者工具中的预览标签页

工具

实现 SXG 涉及生成与给定网址对应的 SXG,然后将该 SXG 提供给请求者(通常是抓取工具)。

证书

虽然有些工具会自动获取 SXG,但要生成 SXG,您需要一个可以签署 SXG 的证书。此页面列出了可以颁发此类证书的证书授权机构。 您可以使用任何 ACME 客户端从 Google 证书授权机构自动获取证书。Web Packager 服务器内置了 ACME 客户端,且 sxg-rs 即将推出。

针对具体平台的 SXG 工具

这些工具支持特定的技术栈。如果您已经在使用这些工具支持的平台,您可能会发现设置起来比通用工具更容易。

通用 SXG 工具

sxg-rs HTTP 服务器

sxg-rs http_server 充当提供 SXG 的反向代理。对于来自 SXG 抓取工具的请求,http_server 将对来自后端的响应进行签名,并使用 SXG 进行响应。如需了解安装说明,请参阅自述文件

Web 打包器服务器

Web Packager 服务器 webpkgserver 是用 Go 编写的 sxg-rs http_server 的替代方案。有关设置 Web Packager 服务器的说明,请参阅如何使用 Web Packager 设置签名的广告交易平台

Web Packager CLI

Web Packager CLI 可生成与给定网址对应的 SXG。

webpackager \
    --private\_key=private.key \
    --cert\_url=https://example.com/certificate.cbor \
    --url=https://example.com

生成 SXG 文件后,将其上传到您的服务器,并使用 application/signed-exchange;v=b3 MIME 类型传送该文件。此外,您还需要以 application/cert-chain+cbor 的形式提供 SXG 证书。

SXG 库

这些库可用于构建您自己的 SXG 生成器:

  • sxg_rs 是一个用于生成 SXG 的 Rust 库。它是功能最强大的 SXG 库,可用作 cloudflare_workerfastly_compute 工具的基础。

  • libsxg 是用于生成 SXG 的极简 C 库。它用作 NGINX SXG 模块和 Envoy SXG 过滤器的基础。

  • go/signed-exchange 是由 webpackage 规范提供的最小 Go 库,作为生成 SXG 的参考实现。它用作参考 CLI 工具 gen-signedexchange 和功能更强大的 Web Packager 工具的基础。

内容协商

当 Accept 标头指示 application/signed-Exchange 的 q 值大于或等于文本/html 的 q 值时,服务器应提供 SXG。实际上,这意味着源服务器会向抓取工具提供 SXG,但不会向浏览器提供 SXG。上述许多工具在默认情况下会执行此操作,但对于其他工具,可以使用以下正则表达式来匹配应以 SXG 形式提供的请求的 Accept 标头: http Accept: /(^|,)\s\*application\/signed-exchange\s\*;\s\*v=[[:alnum:]\_-]+\s\*(,|$)/

此建议包含 Apache 和 nginx 的示例。

更新 Cache API

Google SXG Cache 有一个 API,网站所有者可以使用该 API 在 SXG 因Cache-Control: max-age而过期之前从缓存中移除它们。如需了解详情,请参阅更新缓存 API 参考文档

链接到 SXG

在适用的情况下,任何网站都可以使用 标记来缓存、传送和预提取其链接到的网页的 SXG: html <a href="https://example.com/article.html.sxg"> <link rel="prefetch" as="document" href="https://example.com/article.html.sxg"> 这篇文章介绍了如何使用 nginx 分发 SXG。

独特优势

SXG 是支持跨源预提取的众多可能技术之一。在决定使用哪种技术时,您可能需要在优化不同的方面进行权衡。以下部分介绍了 SXG 在可能的解决方案领域中提供的几个唯一值。随着可用解决方案范围不断演变,这些因素可能会随着时间的推移而变化。

投放请求较少

使用跨网站预提取时,您的服务器可能需要处理其他请求。这对应于预提取网页,但用户未访问该网页或无法向用户显示预提取的字节的情况。对于 SXG,以下未使用的请求数量可以大幅减少:

  • SXG 会被缓存,并可以发送给用户,直至过期。因此,许多预提取只能由缓存服务器处理。
  • 在您的网站上,无论是否使用 Cookie,SXG 都可以向用户显示。因此,导航后需要重新抓取网页的次数会减少。

网页速度提升

您可能会看到网页速度有所提升,这取决于预提取界面目前支持的预提取界面和功能:

  • 可以使用您网站的 Cookie 向用户显示 SXG。
  • 在使用 Link 标头指定时,SXG 还会预提取网页的子资源,例如 JavaScript、CSS、字体和图片。
  • 在不久的将来,Google 搜索中的 SXG 预提取功能将适用于更多搜索结果类型。

总结

Signed Exchange 是一种传送机制,让您可以独立于资源的分发方式来验证资源的来源和有效性。因此,SXG 可由第三方分发,同时保留完整的发布商归因。

深入阅读