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 的工作原理的图表。浏览器与缓存进行通信,而缓存内容与目标网站进行通信

一直以来, 允许第三方在提供内容的同时 表明该网站与 分销商。这样做存在安全缺陷;它与 使内容具有真正的可移植性

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 是更广泛的网络的一部分 打包规范提案系列。此外 Web 打包规范的另一个主要组成部分是 Web Bundle (“捆绑的 HTTP 广告交易平台”)。Web Bundle 是 HTTP 资源的集合 解读 bundle 所需的元数据。

SXG 和 Web Bundle 之间的关系经常会引起混淆。 SXG 和 Web Bundle 是两种不同的技术,不依赖于每种技术 other - Web Bundle 可用于已签名和未签名的广告交易平台。常见 SXG 和 Web Bundle 都提出的目标是打造“Web 打包” 这种格式可让网站的完整内容可供共享,以供离线使用。

使用 Signed Exchange 加速网页加载

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

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

与其他性能优化(例如使用 CDN 和减少阻塞渲染的子资源)搭配使用时,SXG 的效果最好。实现后,请遵循这些建议,以最大限度发挥预提取 SXG 带来的 LCP 优势。在许多情况下,此类优化可以使 Google 搜索近乎即时地完成网页加载:

Signed Exchange 的影响

根据以往的实验,我们观察到,启用 SXG 的预提取后,LCP 平均缩短了 300 毫秒到 400 毫秒。这有助于网站给用户留下更好的第一印象,并且通常对业务指标产生积极影响。

一些全球品牌和网站已经从 Signed Exchange 中获益。让我们以案例研究的形式来了解实施 Signed Exchange 如何帮助知名内容管理系统 (CMS) RebelMouse 提高其客户的效果和业务指标:

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

Cloudflare 发现,SXG 将其所测试网站的 98% 的 TTFB 提高了,并改善了 85% 的网站的 LCP,使符合 SXG 条件的网页加载速度中位数提高了 20% 以上。

编入索引

系统不会对网页的 SXG 和非 SXG 表示法进行排名或编入索引 会有所不同SXG 最终是一种交付机制,它并不 更改底层内容。

AMP

AMP 内容可以使用 SXG 进行分发。SXG 允许预提取 AMP 内容 并使用规范网址(而非 AMP 网址)展示。AMP 具有自己单独的 用于生成 SXG 的工具。了解如何在 amp.dev.

使用 Chrome 开发者工具调试 SXG

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

<ph type="x-smartling-placeholder">
</ph> 显示“网络”内的 SXG 请求的屏幕截图DevTools 中的面板
开发者工具中的 Network 面板

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

<ph type="x-smartling-placeholder">
</ph> “Preview”的屏幕截图SXG 的标签页
开发者工具中的预览标签页

工具

实现 SXG 包括生成与给定网址对应的 SXG 然后将该 SXG 传送给请求者(通常是抓取工具)。

证书

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

平台专用的 SXG 工具

这些工具支持特定的技术栈。如果您已在使用 所用的工具支持的平台,那么您可能会发现设置比 一种通用工具。

通用 SXG 工具

sxg-rs HTTP 服务器

sxg-rs http_server 充当代理的反向代理 SXG 的服务。对于来自 SXG 抓取工具的请求,http_server 会对 并使用 SXG 进行响应。安装用 请参阅 自述文件

Web Packager 服务器

网络打包器 服务器webpkgserver 是用 Go 编写的 sxg-rs http_server 的替代方法。对于 有关设置 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 类型。此外,您还需要 提供 SXG 证书作为 application/cert-chain+cbor

SXG 库

以下库可用于构建您自己的 SXG 生成器:

  • sxg_rs 是适用于 生成 SXG 的过程它是功能最强大的 SXG 库,用作 cloudflare_workerfastly_compute 工具的基础。

  • libsxg 是适用于以下应用的最小 C 库 生成 SXG 的过程它用作 NGINX SXG 模块和 Envoy SXG 过滤器。

  • go/signed-exchange 是由 webpackage 规范提供的极简 Go 库, 参考信息 实现 生成 SXG 的过程它用作其参考 CLI 工具的基础, gen-signedexchange 以及功能更强大的 Web Packager 工具。

内容协商

当 Accept 标头指示应用/signed-Exchange 的 q 值大于或等于文本/html 的 q 值时,服务器应提供 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 可以通过第三方发行, 保持全面的发布商归因。

深入阅读