<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>https://web.dev/</id>
  <title>Devin Mullins on web.dev</title>
  <updated>2026-04-15T23:21:06Z</updated>
  <author>
    <name>Devin Mullins</name>
  </author>
  <link href="https://web.dev/authors/twifkak/feed.xml" rel="self"/>
  <link href="https://web.dev/"/>
  <icon>https://web-dev.imgix.net/image/rULxC7pPw3PFS4o9xr7v8isFmCv1/fDaDWpuKLKDm4mjnt0jV.jpg?auto=format</icon>
  <logo>https://web.dev/images/shared/rss-banner.png</logo>
  <subtitle>Software engineer at Google, signed exchanges integration lead in Search</subtitle>
  
  
  <entry>
    <title>Signed Exchanges (SXGs)</title>
    <link href="https://web.dev/signed-exchanges/"/>
    <updated>2020-10-14T00:00:00Z</updated>
    <id>https://web.dev/signed-exchanges/</id>
    <content type="html" mode="escaped">&lt;p&gt;Signed exchanges (SXG) are a delivery mechanism that makes it possible to authenticate the origin of a resource independently of how it was delivered. Implementing SXG can improve Largest Contentful Paint (LCP) by enabling &lt;a href=&quot;https://web.dev/signed-exchanges/#speeding-up-page-loads-with-signed-exchanges&quot;&gt;privacy-preserving cross-origin prefetch&lt;/a&gt;. Additionally, this decoupling advances a variety of use cases such as offline internet experiences and serving from third-party caches.&lt;/p&gt;
&lt;p&gt;This article provides a comprehensive overview of SXG: how it works, use cases, and tooling.&lt;/p&gt;
&lt;h2 id=&quot;browser-compatibility&quot;&gt;Browser compatibility &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/signed-exchanges/#browser-compatibility&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;SXG is &lt;a href=&quot;https://caniuse.com/#feat=sxg&quot; rel=&quot;noopener&quot;&gt;supported&lt;/a&gt; by Chromium-based browsers
(starting with versions: Chrome 73, Edge 79, and Opera 64).&lt;/p&gt;
&lt;h2 id=&quot;overview&quot;&gt;Overview &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/signed-exchanges/#overview&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As its primary use case, SXG uses a cache to prefetch and serve content that has been cryptographically signed by the origin. This helps speed cross origin navigations from referer sites while also ensuring that pages remain unaltered and properly attributed to their origin. Any potentially identifying information is hidden until after the user navigates to a site thereby protecting the user’s privacy.
Google Search is an early adopter of SXG prefetching capabilities and for sites that receive a large portion of their traffic from Google Search, SXG can be an important tool for delivering faster page loads to users. Over time, we hope this impact will expand to additional referrers.&lt;/p&gt;
&lt;h3 id=&quot;how-it-works&quot;&gt;How it Works &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/signed-exchanges/#how-it-works&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A site signs a request/response pair (an &amp;quot;HTTP exchange&amp;quot;) in a way that makes it possible for
the browser to verify the origin and integrity of the content independently of
how the content was distributed. As a result, the browser can display the URL of
the origin site in the address bar, rather than the URL of the server that
delivered the content.&lt;/p&gt;
&lt;img alt=&quot;Diagram explaining how Signed Exchanges Works. Browser communicating with the cache which communicates with the destination site&quot; decoding=&quot;async&quot; height=&quot;392&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/GiC3si2rdySvEXRggAJBPhgTHFr2/kGUL8NalZ2OaC81a5q8g.PNG?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/GiC3si2rdySvEXRggAJBPhgTHFr2/kGUL8NalZ2OaC81a5q8g.PNG?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/GiC3si2rdySvEXRggAJBPhgTHFr2/kGUL8NalZ2OaC81a5q8g.PNG?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/GiC3si2rdySvEXRggAJBPhgTHFr2/kGUL8NalZ2OaC81a5q8g.PNG?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/GiC3si2rdySvEXRggAJBPhgTHFr2/kGUL8NalZ2OaC81a5q8g.PNG?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/GiC3si2rdySvEXRggAJBPhgTHFr2/kGUL8NalZ2OaC81a5q8g.PNG?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/GiC3si2rdySvEXRggAJBPhgTHFr2/kGUL8NalZ2OaC81a5q8g.PNG?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/GiC3si2rdySvEXRggAJBPhgTHFr2/kGUL8NalZ2OaC81a5q8g.PNG?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/GiC3si2rdySvEXRggAJBPhgTHFr2/kGUL8NalZ2OaC81a5q8g.PNG?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/GiC3si2rdySvEXRggAJBPhgTHFr2/kGUL8NalZ2OaC81a5q8g.PNG?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/GiC3si2rdySvEXRggAJBPhgTHFr2/kGUL8NalZ2OaC81a5q8g.PNG?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/GiC3si2rdySvEXRggAJBPhgTHFr2/kGUL8NalZ2OaC81a5q8g.PNG?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/GiC3si2rdySvEXRggAJBPhgTHFr2/kGUL8NalZ2OaC81a5q8g.PNG?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/GiC3si2rdySvEXRggAJBPhgTHFr2/kGUL8NalZ2OaC81a5q8g.PNG?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/GiC3si2rdySvEXRggAJBPhgTHFr2/kGUL8NalZ2OaC81a5q8g.PNG?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/GiC3si2rdySvEXRggAJBPhgTHFr2/kGUL8NalZ2OaC81a5q8g.PNG?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/GiC3si2rdySvEXRggAJBPhgTHFr2/kGUL8NalZ2OaC81a5q8g.PNG?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/GiC3si2rdySvEXRggAJBPhgTHFr2/kGUL8NalZ2OaC81a5q8g.PNG?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
&lt;p&gt;Historically, the only way for a
site to use a third-party to distribute its content while maintaining
attribution has been for the site to share its SSL certificates with the
distributor. This has security drawbacks; moreover, it is a far stretch from
making content truly portable.&lt;/p&gt;
&lt;h3 id=&quot;the-sxg-format&quot;&gt;The SXG format &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/signed-exchanges/#the-sxg-format&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;An SXG is encapsulated in a &lt;a href=&quot;https://cbor.io/&quot; rel=&quot;noopener&quot;&gt;binary-encoded&lt;/a&gt; file that has two
primary components: an HTTP exchange and a
&lt;a href=&quot;https://developer.mozilla.org/docs/Glossary/Signature/Security&quot; rel=&quot;noopener&quot;&gt;signature&lt;/a&gt;
that covers the exchange. The HTTP exchange consists of a request URL, content
negotiation information, and an HTTP response.&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;
  Here&#39;s an example of a decoded SXG file.
&lt;/summary&gt;
&lt;div&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;format version: 1b3&lt;br /&gt;request:&lt;br /&gt;  method: GET&lt;br /&gt;  uri: https://example.org/&lt;br /&gt;  headers:&lt;br /&gt;response:&lt;br /&gt;  status: 200&lt;br /&gt;  headers:&lt;br /&gt;    Cache-Control: max-age=604800&lt;br /&gt;    Digest: mi-sha256-03=kcwVP6aOwYmA/j9JbUU0GbuiZdnjaBVB/1ag6miNUMY=&lt;br /&gt;    Expires: Mon, 24 Aug 2020 16:08:24 GMT&lt;br /&gt;    Content-Type: text/html; charset=UTF-8&lt;br /&gt;    Content-Encoding: mi-sha256-03&lt;br /&gt;    Date: Mon, 17 Aug 2020 16:08:24 GMT&lt;br /&gt;    Vary: Accept-Encoding&lt;br /&gt;signature:&lt;br /&gt;    label;cert-sha256=*ViFgi0WfQ+NotPJf8PBo2T5dEuZ13NdZefPybXq/HhE=*;&lt;br /&gt;    cert-url=&quot;https://test.web.app/ViFgi0WfQ-NotPJf8PBo2T5dEuZ13NdZefPybXq_HhE&quot;;&lt;br /&gt;    date=1597680503;expires=1598285303;integrity=&quot;digest/mi-sha256-03&quot;;sig=*MEUCIQD5VqojZ1ujXXQaBt1CPKgJxuJTvFlIGLgkyNkC6d7LdAIgQUQ8lC4eaoxBjcVNKLrbS9kRMoCHKG67MweqNXy6wJg=*;&lt;br /&gt;    validity-url=&quot;https://example.org/webpkg/validity&quot;&lt;br /&gt;header integrity: sha256-Gl9bFHnNvHppKsv+bFEZwlYbbJ4vyf4MnaMMvTitTGQ=&lt;br /&gt;&lt;br /&gt;The exchange has a valid signature.&lt;br /&gt;payload [1256 bytes]:&lt;br /&gt;&lt;span class=&quot;token doctype&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;!&lt;/span&gt;&lt;span class=&quot;token doctype-tag&quot;&gt;doctype&lt;/span&gt; &lt;span class=&quot;token name&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;SXG example&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;charset&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;utf-8&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;http-equiv&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Content-type&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;text/html; charset=utf-8&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;style&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;text/css&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token style&quot;&gt;&lt;span class=&quot;token language-css&quot;&gt;&lt;br /&gt;    &lt;span class=&quot;token selector&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #f0f0f2&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token property&quot;&gt;margin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Hello&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/details&gt;
&lt;p&gt;The &lt;code&gt;expires&lt;/code&gt; parameter in the signature indicates a SXG&#39;s expiration date. A
SXG may be valid for at most 7 days. Find more information on
the signature header in the &lt;a href=&quot;https://wicg.github.io/webpackage/draft-yasskin-http-origin-signed-responses.html#section-3.1&quot; rel=&quot;noopener&quot;&gt;Signed HTTP Exchanges
spec&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&quot;support-for-server-side-personalization&quot;&gt;Support for server-side personalization &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/signed-exchanges/#support-for-server-side-personalization&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;An SXG containing a &lt;code&gt;Vary: Cookie&lt;/code&gt; header will be shown only to users who don&#39;t
have cookies for the signed request URL. If your site presents different HTML
to its logged-in users, you can use this feature to take advantage of SXGs
without altering that experience. See details on &lt;a href=&quot;https://web.dev/blog/sxg-desktop/#support-for-server-side-personalization&quot;&gt;server-side personalization
with Dynamic SXG&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;web-packaging&quot;&gt;Web Packaging &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/signed-exchanges/#web-packaging&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;SXG is part of the broader &lt;a href=&quot;https://github.com/WICG/webpackage&quot; rel=&quot;noopener&quot;&gt;Web
Packaging&lt;/a&gt; spec proposal family. In addition
to SXGs, the other major component of the Web Packaging spec is &lt;a href=&quot;https://web.dev/web-bundles/&quot;&gt;Web Bundles&lt;/a&gt;
(&amp;quot;bundled HTTP exchanges&amp;quot;). Web Bundles are a collection of HTTP resources and
the metadata necessary to interpret the bundle.&lt;/p&gt;
&lt;p&gt;The relationship between SXGs and Web Bundles is a common point of confusion.
SXG and Web Bundles are two distinct technologies that don&#39;t depend on each
other—Web Bundles can be used with both signed and unsigned exchanges. A common
goal advanced by both SXGs and Web Bundles is the creation of a &amp;quot;web packaging&amp;quot;
format that allows sites to be shared in their entirety for offline consumption.&lt;/p&gt;
&lt;h2 id=&quot;speeding-up-page-loads-with-signed-exchanges&quot;&gt;Speeding up Page Loads with Signed Exchanges &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/signed-exchanges/#speeding-up-page-loads-with-signed-exchanges&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Enabling Signed Exchanges can help speed up web page performance and thereby impact your site’s Core Web Vitals, in Particular &lt;a href=&quot;https://web.dev/lcp/&quot;&gt;Largest Contentful Paint (LCP)&lt;/a&gt;. As an early adopter, Google Search uses SXG to provide users with a faster page load experience for pages loaded from the search results page.&lt;/p&gt;
&lt;p&gt;Google Search crawls and caches SXGs when available and prefetches SXG that the user is likely to visit—for example, the page corresponding to the first search result.&lt;/p&gt;
&lt;p&gt;SXG works best in tandem with other performance optimizations such as use of CDNs and reduction of render-blocking subresources. After implementing, follow &lt;a href=&quot;https://developer.chrome.com/blog/optimizing-lcp-using-signed-exchanges/&quot; rel=&quot;noopener&quot;&gt;these recommendations&lt;/a&gt; to maximize the LCP benefit from prefetching SXGs. In many cases, such optimization can result in nearly instant page loads coming from Google Search:&lt;/p&gt;
&lt;p&gt;&lt;video controls=&quot;&quot; poster=&quot;https://web-dev.imgix.net/image/rULxC7pPw3PFS4o9xr7v8isFmCv1/cdP5lEt76GS8N3Bix2X2.jpg?auto=format&quot;&gt;      &lt;source src=&quot;https://storage.googleapis.com/web-dev-uploads/video/rULxC7pPw3PFS4o9xr7v8isFmCv1/MQwtXWQD41XWNTzRHLie.mp4&quot; type=&quot;video/mp4&quot; /&gt;    &lt;/video&gt;&lt;/p&gt;
&lt;h3 id=&quot;impact-of-signed-exchanges&quot;&gt;Impact of Signed Exchanges &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/signed-exchanges/#impact-of-signed-exchanges&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;From past experiments we have observed an average of 300ms to 400ms reduction in LCP from SXG-enabled prefetches. This helps sites make a better first-impression on users and often has a positive impact on business metrics.&lt;/p&gt;
&lt;p&gt;Several global brands and sites have already benefited from Signed Exchanges. As a case study, lets look at how implementing Signed Exchanges helped &lt;a href=&quot;https://www.rebelmouse.com/signed-exchange?utm_medium=post&amp;amp;utm_source=google&amp;amp;utm_campaign=signed-exchange-co-marketing&amp;amp;utm_content=signed-exchange&quot; rel=&quot;noopener&quot;&gt;RebelMouse&lt;/a&gt;, a prominent Content Management System (CMS), improve their customers&#39; performance and business metrics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Narcity &lt;strong&gt;improved LCP by 41%&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Paper Magazine noticed a &lt;strong&gt;27% increase in Sessions per user&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;MLT Blog &lt;strong&gt;decreased Page Load time by 21%&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.cloudflare.com/automatic-signed-exchanges-desktop-android/&quot; rel=&quot;noopener&quot;&gt;Cloudflare found&lt;/a&gt; that SXG &lt;strong&gt;improved TTFB for 98% of sites&lt;/strong&gt; it tested, and &lt;strong&gt;improved LCP for 85% of sites&lt;/strong&gt;, with a median improvement of over 20% in SXG-eligible page loads.&lt;/p&gt;
&lt;aside class=&quot;aside flow bg-state-info-bg color-state-info-text&quot;&gt;&lt;div class=&quot; flow&quot;&gt; SXG enables &lt;a href=&quot;https://developer.chrome.com/blog/cross-origin-prefetch/&quot;&gt;cross-origin prefetching&lt;/a&gt; because it allows prefetch requests via an SXG cache server operated by the referrer, ensuring that the user&#39;s potentially identifying information is not revealed to the origin server until they navigate. This technique is available to any site that wishes to make its outlinks faster or more resilient to limited network access. &lt;/div&gt;&lt;/aside&gt;
&lt;h4 id=&quot;indexing&quot;&gt;Indexing &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/signed-exchanges/#indexing&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;The SXG and non-SXG representations of a page are not ranked or indexed
differently by Google Search. SXG is ultimately a delivery mechanism—it does not
change the underlying content.&lt;/p&gt;
&lt;h3 id=&quot;amp&quot;&gt;AMP &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/signed-exchanges/#amp&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;AMP content can be delivered using SXG. SXG allows AMP content to be prefetched
and displayed using its canonical URL, rather than its AMP URL.AMP has its own separate
&lt;a href=&quot;https://github.com/ampproject/amppackager&quot; rel=&quot;noopener&quot;&gt;tooling&lt;/a&gt; for generating SXGs.Learn how to serve AMP using signed exchanges on
&lt;a href=&quot;https://amp.dev/documentation/guides-and-tutorials/optimize-and-measure/signed-exchange/&quot; rel=&quot;noopener&quot;&gt;amp.dev&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;debugging&quot;&gt;Debugging SXGs with Chrome DevTools &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/signed-exchanges/#debugging&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To see a SXG firsthand, use a Chromium browser, open DevTools, open the Network panel, and visit this &lt;a href=&quot;https://www.google.com/search?q=site%3Asigned-exchange-testing.dev+valid&quot; rel=&quot;noopener&quot;&gt;example search page&lt;/a&gt;. Signed Exchanges can be identified by looking for &lt;code&gt;signed-exchange&lt;/code&gt; in the &lt;strong&gt;Type&lt;/strong&gt; column.&lt;/p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;Screenshot showing a SXG request within the &amp;#x27;Network&amp;#x27; panel in DevTools&quot; decoding=&quot;async&quot; height=&quot;201&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 696px) 696px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/admin/cNdohSaeXqGHFBwD7L3B.png?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/admin/cNdohSaeXqGHFBwD7L3B.png?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/admin/cNdohSaeXqGHFBwD7L3B.png?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/admin/cNdohSaeXqGHFBwD7L3B.png?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/admin/cNdohSaeXqGHFBwD7L3B.png?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/admin/cNdohSaeXqGHFBwD7L3B.png?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/admin/cNdohSaeXqGHFBwD7L3B.png?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/admin/cNdohSaeXqGHFBwD7L3B.png?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/admin/cNdohSaeXqGHFBwD7L3B.png?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/admin/cNdohSaeXqGHFBwD7L3B.png?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/admin/cNdohSaeXqGHFBwD7L3B.png?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/admin/cNdohSaeXqGHFBwD7L3B.png?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/admin/cNdohSaeXqGHFBwD7L3B.png?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/admin/cNdohSaeXqGHFBwD7L3B.png?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/admin/cNdohSaeXqGHFBwD7L3B.png?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/admin/cNdohSaeXqGHFBwD7L3B.png?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/admin/cNdohSaeXqGHFBwD7L3B.png?auto=format&amp;w=1392 1392w&quot; width=&quot;696&quot; /&gt;
  &lt;figcaption&gt;The &lt;b&gt;Network&lt;/b&gt; panel in DevTools&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The &lt;strong&gt;Preview&lt;/strong&gt; tab provides more information about the contents of a SXG.&lt;/p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;Screenshot of the &amp;#x27;Preview&amp;#x27; tab for a SXG&quot; decoding=&quot;async&quot; height=&quot;561&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/admin/E0rBwuxk4BxFmLJ3gXhP.png?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/admin/E0rBwuxk4BxFmLJ3gXhP.png?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/admin/E0rBwuxk4BxFmLJ3gXhP.png?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/admin/E0rBwuxk4BxFmLJ3gXhP.png?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/admin/E0rBwuxk4BxFmLJ3gXhP.png?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/admin/E0rBwuxk4BxFmLJ3gXhP.png?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/admin/E0rBwuxk4BxFmLJ3gXhP.png?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/admin/E0rBwuxk4BxFmLJ3gXhP.png?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/admin/E0rBwuxk4BxFmLJ3gXhP.png?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/admin/E0rBwuxk4BxFmLJ3gXhP.png?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/admin/E0rBwuxk4BxFmLJ3gXhP.png?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/admin/E0rBwuxk4BxFmLJ3gXhP.png?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/admin/E0rBwuxk4BxFmLJ3gXhP.png?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/admin/E0rBwuxk4BxFmLJ3gXhP.png?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/admin/E0rBwuxk4BxFmLJ3gXhP.png?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/admin/E0rBwuxk4BxFmLJ3gXhP.png?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/admin/E0rBwuxk4BxFmLJ3gXhP.png?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/admin/E0rBwuxk4BxFmLJ3gXhP.png?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
  &lt;figcaption&gt;The &lt;b&gt;Preview&lt;/b&gt; tab in DevTools&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;tooling&quot;&gt;Tooling &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/signed-exchanges/#tooling&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Implementing SXGs consists of generating the SXG corresponding to a given URL
and then serving that SXG to requestors (usually crawlers).&lt;/p&gt;
&lt;h3 id=&quot;certificates&quot;&gt;Certificates &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/signed-exchanges/#certificates&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;To generate a SXG you will need a certificate that can sign SXGs, although some tools acquire these automatically. &lt;a href=&quot;https://github.com/google/webpackager/wiki/Certificate-Authorities&quot; rel=&quot;noopener&quot;&gt;This page&lt;/a&gt; lists the certificate authorities that can issue this type of certificate.
Certificates can be obtained automatically from the Google certificate authority using any ACME client. Web Packager Server has a built-in ACME client, and sxg-rs will soon.&lt;/p&gt;
&lt;aside class=&quot;aside flow bg-state-info-bg color-state-info-text&quot;&gt;&lt;div class=&quot; flow&quot;&gt; Production use of SXGs requires a certificate that supports the &lt;code&gt;CanSignHttpExchanges&lt;/code&gt; extension. Per &lt;a href=&quot;https://wicg.github.io/webpackage/draft-yasskin-http-origin-signed-responses.html#section-4.2&quot;&gt;spec&lt;/a&gt;, certificates with this extension must have a validity period no longer than 90 days and require that the requesting domain have a &lt;a href=&quot;https://en.wikipedia.org/wiki/DNS_Certification_Authority_Authorization&quot;&gt;DNS CAA record&lt;/a&gt; configured. &lt;/div&gt;&lt;/aside&gt;
&lt;h3 id=&quot;platform-specific-sxg-tooling&quot;&gt;Platform-specific SXG tooling &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/signed-exchanges/#platform-specific-sxg-tooling&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;These tools support specific technology stacks. If you are already using a
platform supported by one of these tools, you may find it easier to set up than
a general-purpose tool.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/google/sxg-rs/tree/main/cloudflare_worker&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;sxg-rs/cloudflare_worker&lt;/code&gt;&lt;/a&gt;
runs on &lt;a href=&quot;https://workers.cloudflare.com/&quot; rel=&quot;noopener&quot;&gt;Cloudflare Workers&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/google/sxg-rs/tree/main/fastly_compute&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;sxg-rs/fastly_compute&lt;/code&gt;&lt;/a&gt;
runs on &lt;a href=&quot;https://www.fastly.com/products/edge-compute/serverless&quot; rel=&quot;noopener&quot;&gt;Fastly
Compute@Edge&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.cloudflare.com/automatic-signed-exchanges/&quot; rel=&quot;noopener&quot;&gt;Automatic Signed
Exchanges&lt;/a&gt; is a
Cloudflare feature that automatically acquires certificates and generates
Signed Exchanges.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/google/nginx-sxg-module&quot; rel=&quot;noopener&quot;&gt;NGINX SXG module&lt;/a&gt; generates
and serves SXGs for sites that use &lt;a href=&quot;https://nginx.org/&quot; rel=&quot;noopener&quot;&gt;nginx&lt;/a&gt;. Setup
instructions can be found &lt;a href=&quot;https://web.dev/how-to-set-up-signed-http-exchanges/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_filters/sxg_filter&quot; rel=&quot;noopener&quot;&gt;Envoy SXG
Filter&lt;/a&gt;
generates and serves SXGs for sites that use
&lt;a href=&quot;https://www.envoyproxy.io/&quot; rel=&quot;noopener&quot;&gt;Envoy&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;general-purpose-sxg-tooling&quot;&gt;General-purpose SXG tooling &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/signed-exchanges/#general-purpose-sxg-tooling&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&quot;sxg-rs-http-server&quot;&gt;sxg-rs HTTP server &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/signed-exchanges/#sxg-rs-http-server&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/google/webpackager/blob/main/cmd/webpkgserver/README.md&quot; rel=&quot;noopener&quot;&gt;sxg-rs
http_server&lt;/a&gt;
acts as a &lt;a href=&quot;https://en.wikipedia.org/wiki/Reverse_proxy&quot; rel=&quot;noopener&quot;&gt;reverse proxy&lt;/a&gt; for
serving SXGs. For requests from SXG crawlers, &lt;code&gt;http_server&lt;/code&gt; will sign the
responses from the backend and respond with an SXG. For installation
instructions, see &lt;a href=&quot;https://github.com/google/webpackager/blob/main/cmd/webpkgserver/README.md&quot; rel=&quot;noopener&quot;&gt;the
README&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&quot;web-packager-server&quot;&gt;Web Packager Server &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/signed-exchanges/#web-packager-server&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/google/webpackager/blob/main/cmd/webpkgserver/README.md&quot; rel=&quot;noopener&quot;&gt;Web Packager
Server&lt;/a&gt;,
&lt;code&gt;webpkgserver&lt;/code&gt;, is an alternative to sxg-rs http_server, written in Go. For
instructions on setting up the Web Packager server, see &lt;a href=&quot;https://web.dev/signed-exchanges-webpackager&quot;&gt;How to set up signed
exchanges using Web Packager&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&quot;web-packager-cli&quot;&gt;Web Packager CLI &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/signed-exchanges/#web-packager-cli&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/google/webpackager&quot; rel=&quot;noopener&quot;&gt;Web Packager CLI&lt;/a&gt; generates a SXG
corresponding to a given URL.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;webpackager &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;&lt;br /&gt;    --private&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;_key&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;private.key &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;&lt;br /&gt;    --cert&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;_url&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;https://example.com/certificate.cbor &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;&lt;br /&gt;    --url&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;https://example.com&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Once the SXG file has been generated, upload it to your server and serve it with
the &lt;code&gt;application/signed-exchange;v=b3&lt;/code&gt; MIME type. In addition, you will need to
serve the SXG certificate as &lt;code&gt;application/cert-chain+cbor&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;sxg-libraries&quot;&gt;SXG libraries &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/signed-exchanges/#sxg-libraries&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;These libraries could be used to build your own SXG generator:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/google/sxg-rs/tree/main/sxg_rs&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;sxg_rs&lt;/code&gt;&lt;/a&gt; is a Rust library for
generating SXGs. It is the most featureful SXG library and is used as the
basis for the &lt;code&gt;cloudflare_worker&lt;/code&gt; and &lt;code&gt;fastly_compute&lt;/code&gt; tools.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/google/libsxg&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;libsxg&lt;/code&gt;&lt;/a&gt; is a minimal C library for
generating SXGs. It is used as the basis for the NGINX SXG module and the
Envoy SXG Filter.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/WICG/webpackage/tree/main/go/signedexchange&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;go/signed-exchange&lt;/code&gt;&lt;/a&gt;
is a minimal Go library provided by the webpackage specification as a
&lt;a href=&quot;https://en.wikipedia.org/wiki/Reference_implementation&quot; rel=&quot;noopener&quot;&gt;reference
implementation&lt;/a&gt; of
generating SXGs. It is used as the basis for its reference CLI tool,
&lt;a href=&quot;https://github.com/WICG/webpackage/tree/main/go/signedexchange&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;gen-signedexchange&lt;/code&gt;&lt;/a&gt;
and the more featureful Web Packager tools.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;content-negotiation&quot;&gt;Content negotiation &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/signed-exchanges/#content-negotiation&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Servers should serve SXG when the Accept header indicates that the q-value for application/signed-exchange is greater than or equal to the q-value for text/html. In practice, this means that an origin server will serve SXG to crawlers, but not browsers. Many of the above tools do this by default, but for other tools, the following regular expression can be used to match the Accept header of requests that should be served as SXG:&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-http&quot;&gt;&lt;code class=&quot;language-http&quot;&gt;&lt;span class=&quot;token header&quot;&gt;&lt;span class=&quot;token header-name keyword&quot;&gt;Accept&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token header-value&quot;&gt;/(^|,)\s\*application\/signed-exchange\s\*;\s\*v=[[:alnum:]\_-]+\s\*(,|$)/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/google/webpackager/blob/main/cmd/webpkgserver/README.md#content-negotiation&quot; rel=&quot;noopener&quot;&gt;This recommendation&lt;/a&gt; includes examples for Apache and nginx.&lt;/p&gt;
&lt;aside class=&quot;aside flow bg-state-info-bg color-state-info-text&quot;&gt;&lt;div class=&quot; flow&quot;&gt; SXG can deliver superior performance when used with caching or prefetching. However, for content that is loaded directly from the origin server without the benefit of these optimizations, text/html delivers better performance than SXG. Serving content as SXG allows crawlers and other intermediaries to cache SXGs for faster delivery to users. &lt;/div&gt;&lt;/aside&gt;
&lt;h3 id=&quot;update-cache-api&quot;&gt;Update cache API &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/signed-exchanges/#update-cache-api&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The Google SXG Cache has an API that site owners can use to remove SXGs from the cache before they&#39;ve expired due to &lt;code&gt;Cache-Control: max-age&lt;/code&gt;. See the &lt;a href=&quot;https://github.com/google/webpackager/blob/main/docs/update_cache_api.md&quot; rel=&quot;noopener&quot;&gt;update cache API reference&lt;/a&gt; for details.&lt;/p&gt;
&lt;h3 id=&quot;linking-to-sxg&quot;&gt;Linking to SXG &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/signed-exchanges/#linking-to-sxg&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Any site can cache, serve, and prefetch SXGs of the pages that it links to, where available, using the &lt;link /&gt; and &lt;a&gt; tags:&lt;/a&gt;&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://example.com/article.html.sxg&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;prefetch&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;document&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://example.com/article.html.sxg&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;&lt;a href=&quot;https://web.dev/how-to-distribute-signed-http-exchanges/&quot;&gt;This article&lt;/a&gt; illustrates how to use nginx to distribute SXGs.&lt;/p&gt;
&lt;h2 id=&quot;unique-advantages&quot;&gt;Unique Advantages &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/signed-exchanges/#unique-advantages&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;SXG is one of many possible technologies to enable cross-origin prefetching. When deciding which technology to use, you may need to trade off between optimizing different aspects. The following sections illustrate a few of the unique values that SXG provides in the space of possible solutions. These factors may change over time as the space of available solutions evolves.&lt;/p&gt;
&lt;h3 id=&quot;fewer-requests-to-serve&quot;&gt;Fewer requests to serve &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/signed-exchanges/#fewer-requests-to-serve&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;With cross-site prefetching, your server may need to serve additional requests. This corresponds to cases where a page was prefetched, but either the user didn&#39;t visit the page, or the prefetched bytes couldn&#39;t be shown to the user. For SXG, these additional unused requests can be significantly reduced:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SXGs are cached and may be sent to users until they expire. Thus, many prefetches can be handled solely by the cache server.&lt;/li&gt;
&lt;li&gt;SXGs can be shown to users both with and without cookies on your site. Thus, there are fewer times when the page will need to be fetched again after navigation.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;page-speed-improvement&quot;&gt;Page speed improvement &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/signed-exchanges/#page-speed-improvement&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;You may see additional page speed improvement due to the prefetch surfaces and capabilities it currently supports:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SXGs can be shown to users with cookies for your site.&lt;/li&gt;
&lt;li&gt;SXG also prefetches subresources for your pages, such as JavaScript, CSS, fonts, and images, when specified using a &lt;code&gt;Link&lt;/code&gt; header.&lt;/li&gt;
&lt;li&gt;In the near future, SXG prefetching from Google Search will be available on more search result types.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/signed-exchanges/#conclusion&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Signed Exchanges are a delivery mechanism that make it possible to verify the
origin and validity of a resource independently of how the resource was
delivered. As a result, SXGs can be distributed by third-parties while
maintaining full publisher attribution.&lt;/p&gt;
&lt;h2 id=&quot;further-reading&quot;&gt;Further reading &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/signed-exchanges/#further-reading&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://wicg.github.io/webpackage/draft-yasskin-http-origin-signed-responses.html&quot; rel=&quot;noopener&quot;&gt;Draft spec for Signed HTTP Exchanges&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/WICG/webpackage/tree/main/explainers&quot; rel=&quot;noopener&quot;&gt;Web Packaging explainers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/search/docs/advanced/experience/signed-exchange&quot; rel=&quot;noopener&quot;&gt;Get started with signed exchanges on Google Search&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/signed-exchanges-webpackager&quot;&gt;How to set up Signed Exchanges using Web Packager&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://signed-exchange-testing.dev/&quot; rel=&quot;noopener&quot;&gt;Demo of Signed Exchanges&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    <author>
      <name>Katie Hempenius</name>
    </author><author>
      <name>Devin Mullins</name>
    </author>
  </entry>
</feed>
