LGTM1

This is an important optimization that will take a small step at evening 
out the playing field for smaller sites (that use 3Ps and distributed 
platforms) compared to large, centralized ones with many repeat visitors. 
It will become even more important once it's integrated with Compression 
Dictionaries, as it would significantly increase cache reusability even 
with high-frequency updates.

While it does taint the security model a bit compared to pure triple-keyed 
cache, I think the benefits outweigh that cost.


On Wednesday, November 19, 2025 at 11:45:47 PM UTC+1 Joe Mason wrote:

My thought was that the risk of fingerprinting is MUCH lower with this 
cache than with 3p cookies in general, so a user that wants to disable 3p 
cookies for better anonymity might be ok with leaving the pervasive cache 
on. Tying it to 3p cookies seems to inflate the danger.

I like the idea of making the top-level name something like "allow me to be 
tracked across websites", but I wouldn't expect the pervasive cache ad 
described to actually allow that so it would be misleading to tie it to 
that language. (Also, I'm wary of a setting called "allow me to be 
tracked", because we can't fully DISALLOW that - information leaks will 
always be possible, we can only make fingerprinting harder or easier.)

What about a "Difficulty of tracking me across websites" slider, from 
"trivial" (3p cookies enabled) to "moderate" (features like pervasive cache 
and other minor fingerprinting risks enabled) to "difficult" (but never 
"impossible").

This is getting far afield, though. I don't want to derail the discussion, 
just noodling.

On Wednesday, November 19, 2025 at 12:49:34 PM UTC-5 Patrick Meenan wrote:

On Wed, Nov 19, 2025 at 12:25 PM Joe Mason <[email protected]> wrote:

Regarding the concern that tying this to 3P cookies will make it harder to 
disable 3P cookies completely: have you considered making this a separate 
UI toggle instead? 


A separate UI toggle would be more confusing than useful to the user.

The link to cookies is because of the risk of explicit user tracking and 
fingerprinting (which is reduced with the protections but non-zero with the 
shared cache). Third-party cookies is a stand-in for "allow me to be 
tracked across websites". It would probably be more accurate to have a more 
friendly top-level name like that and cookies would be a feature that is 
automatically toggled (along with a shared cache) but I don't see there 
being a useful distinction for users to be able to toggle the different 
fingerprinting risks individually (AFAIK, there are a few different 
features linked to cookie tracking for the same reason).
 


On Wednesday, November 19, 2025 at 12:07:48 PM UTC-5 Daniel Bratell wrote:

We had a discussion about this in the API OWNERS meeting and I was asked to 
make my thoughts public. 

There are a couple of aspects to this:

1. This is trying to mitigate some negative effects of a security/privacy 
enhancing change (triple keyed cache). The negative effects are, as far as 
I can determine, in the form of reduced ad revenue ("web ecosystem") 
because some ad network scripts will have to be reloaded from servers.

2. There is a fundamental idea that a browser should treat every resource 
on the web equally (modulo security and some other exceptions). This is 
violating that idea.

3. The list of resources that will be allowed to bypass the third cache key 
was created through a reasonably impartial method. Still, because the web 
is what it is, that resulted in certain entities getting a lot of their 
resources on the list. If I recall correctly, 30% of the list was Google 
resources in one form or another.

4. Every resource on the list opens up the potential for the 
security/privacy issues that the triple keyed cache was meant to protect 
against. Is there a point where the list has undermined enough of the 
benefits that the whole triple keyed cache should be dropped instead?

All of this, and more, has to be weighed against each other to get to a 
solution with an "ideal" balance. I currently do not know what that balance 
is. 

I do not like the look of certain aspects here, but on the other hand I do 
like the security/privacy improvements and it would be sad if those have to 
be reverted because some considered them too costly.

This post does not really change anything, but just so that you know what 
is being voiced. And if someone has more to add, please do add your own 
information and thoughts. Especially if I have misunderstood or 
mischaracterized something. That is what these threads are for.

/Daniel
On 2025-11-09 16:46, Patrick Meenan wrote:



On Sat, Nov 8, 2025 at 1:32 PM Yoav Weiss (@Shopify) <[email protected]> 
wrote:

I'm extremely supportive of this effort, with multiple hats on.

I'd have loved if this wasn't restricted to users with 3P cookies enabled, 
but one can imagine abuse where pervasive resource *patterns* are used, but 
with unique hashes that are not deployed in the wild, and where each such 
URL is used as a cross-origin bit of entropy.


Yep, there are 2 risks for explicit tracking (that are effectively moot 
when you can track directly anyway). Differing the content of some of the 
responses some of the time (maybe for a slightly different URL than the 
"current" version that still matches the pattern) and using a broad sample 
of not-current URLs across a bunch of origins as a fingerprint. We can make 
some of that harder but I couldn't think of any way to completely eliminate 
the risk.
 

On Sat, Nov 8, 2025 at 7:04 AM Patrick Meenan <[email protected]> wrote:

The list construction should already be completely objective. I changed the 
manual origin-owner validation to trust and require "cache-control: public" 
instead. The rest of the criteria 
<https://docs.google.com/document/d/1xaoF9iSOojrlPrHZaKIJMK4iRZKA3AD6pQvbSy4ueUQ/edit?tab=t.0>
 
should be well-defined and objective. I'm not sure if they can be fully 
automated yet (though that might just be my pre-AI thinking). 

The main need for humans in the loop right now is to create the patterns so 
that they each represent a "single" resource that is stable over time with 
URL changes (version/hash) and distinguishing those stable files from 
random hash bundles that aren't stable from release to release. That's 
fairly easy for a human to do (and get right).


This is something that origins that use compression dictionaries already do 
by themselves - define the "match" pattern that covers the URL's semantics. 
Can we somehow use that for automation where it exists?


We can use the match patterns for script and style destinations as an input 
when defining the patterns. If the resource URL matches the match pattern 
and the match pattern is reasonably long (not /app/*.js) then it's probably 
a good pattern (and could be validated across months of HTTP Archive logs). 
There are patterns where dictionaries aren't used as strict delta updates 
for the same file (i.e. a script with a lot of common code that portions of 
which might be in other scripts used on other pages) so I wouldn't want to 
use it blindly but it is a very strong possibility.
 

 




On Fri, Nov 7, 2025 at 4:47 PM Rick Byers <[email protected]> wrote:

Thanks Pat. I am personally a big fan of things which increase publisher ad 
revenue across the web broadly without hurting (or ideally improving) the 
user experience, and this seems likely to do exactly that. In particular I 
recall all the debate around stale-while-revalidate 
<https://web.dev/articles/stale-while-revalidate> and am proud that we 
pushed 
<https://groups.google.com/a/chromium.org/g/blink-dev/c/rspPrQHfFkI/m/c5j3xJQRDAAJ?e=48417069>
 
through it with urgency and confirmed it indeed increased publisher ad 
revenue across the web 
<https://web.dev/case-studies/ads-case-study-stale-while-revalidate>. 

Reading the Mozilla feedback carefully the point that resonates most with 
me is the risk of "gatekeeping" and the potential to mitigate that by 
establishing objective rules for inclusion. Is it plausible to imagine a 
version of this where the list construction would be entirely objective? 
What would the tradeoffs be?

Thanks,
   Rick 




On Thu, Oct 30, 2025 at 3:50 PM Patrick Meenan <[email protected]> wrote:

Reaching out to site owners was mostly for a sanity check that the resource 
is not expecting to be partitioned for some reason (even though the 
payloads are known to be identical). If it helps, we can replace the 
reach-out step with a requirement that the responses be "Cache-Control: 
public" (and hard-enforce it in the browser by not writing the resource to 
cache if it isn't). That is an explicit indicator that the resources are 
cacheable in shared upstream caches. 

I removed the 2 items from the design doc that were specifically targeted 
at direct fingerprinting since that's moot with the 3PC link (as well as 
the fingerprinting bits from the validation with resource owners). 

On the site-preferencing concern, it doesn't actually preference large 
sites but it does preference currently-popular third-party resources (most 
of which are provided by large corporations). The benefit is spread across 
all of the sites that they are embedded in (funnily enough, most large 
sites won't benefit because they don't tend to use third-parties).

Determining the common resources at a local level exposes the same XS Leak 
issues as allowing all resources (i.e. your local map tiles will show up in 
multiple cache partitions because they all reference your current location 
but they can be used to identify your location since they are not globally 
common). Instead of using the HTTP Archive to collect the candidates, we 
could presumably build a centralized list based on aggregated common 
resources that are seen across cache partitions by each user but that feels 
like an awful lot of complexity for a very small number of resulting 
resources.

On the test results, sorry, I thought I had included the experiment results 
in the I2S but it looks like I may not have.

The test was specifically just with the patterns for the Google ads scripts 
because we aren't expecting this feature to impact the vitals for the main 
page/content since most of the pervasive resources are third-party content 
that is usually async already and not critical-path. It's possible some 
video or map embeds might trigger LCP in some cases but that's the 
exception more than the norm. This is more geared to making those 
supporting things work better while maintaining the user experience. Ads 
has the kind of instrumentation that we'd need to be able to get visibility 
into the success (or failure) of that assumption and to be able to measure 
small changes.

The results were stat-sig positive but relatively small. The ad iframes 
displayed their content slightly faster and transmitted fewer bytes for 
each frame (very low single digit percentages).

The guardrail metrics, including vitals) were all neutral which is what we 
were hoping for (improvement without a cost of increased contention).

If you'd feel more comfortable with gathering more data, I wouldn't be 
opposed to running the full list at 1% to check the guardrail metrics again 
before fully launching. We won't necessarily expect to see positive 
movement to justify a launch since the resources are still async but we can 
validate that assumption with the full list at least (if that is the only 
remaining concern).


On Thu, Oct 30, 2025 at 5:28 PM Rick Byers <[email protected]> wrote:

Thanks Erik and Patrick, of course that makes sense. Sorry for the naive 
question. My naive reading of the design doc suggested to me that a lot of 
the privacy mitigations were about preventing the cross-site tracking risk. 
Could the design be simplified by removing some of those mitigations? For 
example, the section about reaching out to the resource owners, to what 
extent is that really necessary when all we're trying to mitigate is XS 
leaks? Don't the popularity properties alone mitigate that sufficiently? 

What can you share about the magnitude of the performance benefit in 
practice in your experiments? In particular for LCP, since we know 
<https://wpostats.com/> that correlates well with user engagement (and 
against abandonment) and so presumably user value. 

The concern about not wanting to further advantage more popular sites over 
less popular ones resonates with me. Part of that argument seems to apply 
broadly to the idea of any LRU cache (especially one with a reuse bias 
which I believe ours has 
<https://www.chromium.org/developers/design-documents/network-stack/disk-cache/#eviction>?).
 
But perhaps an important distinction here is that the benefits are 
determined globally vs. on a user-by-user basis? But I think any solution 
that worked on a user-by-user basis would have the XS leak problem, right? 
Perhaps it's worth reflecting on our stance on using crowd-sourced data to 
try to improve the experience for all users while still being fair to sites 
broadly. In general I think this is something Chromium is much more open to 
(where it brings significant user benefit) than other engines. For example, 
our Media Engagement Index <https://developer.chrome.com/blog/autoplay> 
system has some similar properties in terms of using aggregate user 
behaviour to help decide which sites have the power to play audio on page 
load and which don't. I was personally uncertain at the time if the 
complexity would prove to be worth the benefit, but now I'm quite convinced 
it is. Playing audio on load is just something users and developers want in 
a few cases, but not most cases. I wonder if perhaps cross-site caching is 
similar?

Rick

On Thu, Oct 30, 2025 at 9:09 AM Matt Menke <[email protected]> wrote:

Note that even with Vary: Origin, we still have to load the HTTP request 
headers from the disk cache to apply the vary header, which leaks timing 
information, so "Vary: Origin" is not a sufficient security mechanism to 
prevent that sort of cross-site attack.

On Wednesday, October 29, 2025 at 5:08:42 PM UTC-4 Erik Anderson wrote:

My understanding was that there was believed to be a meaningful security 
benefit with partitioning the cache. That’s because it would limit a party 
from being able to inferr that you’ve visited some other site by measuring 
a side effect tied to how quickly a resource loads. That observation could 
potentially be made even if that specific adversary doesn’t have any of 
their own content loaded on the other site.

 

Of course, if there is an entity with a resource loaded across both sites 
with a 3p cookie *and* they’re willing to share that info/collude, there’s 
not much benefit. And even when partitioned, if 3p cookies are enabled, 
there are potentially measurable side effects that differ based on if the 
resource request had some specific state in a 3p cookie.

 

Does that incremental security benefit of partitioning the cache justify 
the performance costs when 3p cookies are still enabled? I’m not sure.

 

Even if partitioning was eliminated, a site could protect themselves a bit 
by specifying Vary: Origin, but that probably doesn’t sufficiently cover 
iframe scenarios (nor would I expect most sites to hold it right).

 

*From:* Rick Byers <[email protected]> 
*Sent:* Wednesday, October 29, 2025 11:56 AM
*To:* Patrick Meenan <[email protected]>
*Cc:* Mike Taylor <[email protected]>; blink-dev <[email protected]>
*Subject:* [EXTERNAL] Re: [blink-dev] Intent to ship: Cache sharing for 
extremely-pervasive resources

 

If this is enabled only when 3PCs are enabled, then what are the tradeoffs 
of going through all this complexity and governance vs. just broadly 
coupling HTTP cache keying behavior to 3PC status in some way? What can a 
tracker credibly do with a single-keyed HTTP cache that they cannot do with 
3PCs? Are there also concerns about accidental cross-site resource sharing 
which could be mitigated more simply by other means, eg. by scoping to just 
to ETag-based caching?

 

I remember the controversy and some real evidence of harm to users and 
businesses in 2020 when we partitioned the HTTP cache, but I was convinced 
that we had to accept that harm in order to credibly achieve 3PCD. At the 
time I was personally a fan of a proposal like this (even for users without 
3PCs) in order to mitigate the harm. But now it seems to me that if we're 
going to start talking about poking holes in that decision, perhaps we 
should be doing a larger review of the options in that space with the 
knowledge that most Chrome users are likely to continue to have 3PCs 
enabled. WDYT?

 

Thanks,

   Rick

 

On Mon, Oct 27, 2025 at 10:27 AM Patrick Meenan <[email protected]> wrote:

I don't believe the security/privacy protections actually rely on the 
assertions (and it's unlikely those would be public). It's more for 
awareness and to make sure they don't accidentally break something with 
their app if they were relying on the responses being partitioned by site.

 

As far as query params go, the browser code already only filters for 
requests with no query params so any that do rely on query params won't get 
included anyway.

 

The same goes for cookies. Since the feature is only enabled when 
third-party cookies are enabled, adding cookies to these responses or 
putting unique content in them won't actually pierce any new boundaries but 
it goes against the intent of only using it for public/static resources and 
they'd lose the benefit of the shared cache when it gets updated. Same goes 
for the fingerprinting risks if the pattern was abused.

 

On Mon, Oct 27, 2025 at 9:39 AM Mike Taylor <[email protected]> wrote:

On 10/22/25 5:48 p.m., Patrick Meenan wrote:

The candidate list goes down to 20k occurrences in order to catch resources 
that were updated mid-crawl and may have multiple entries with different 
hashes that add up to 100k+ occurrences. In the candidate list, without any 
filtering, the 100k cutoff is around 600, I'd estimate that well less than 
25% of the candidates make it through the filtering for stable pattern, 
correct resource type and reliable pattern. First release will likely be 
100-200 and I don't expect it will ever grow above 500.

Thanks - I see the living document has been updated to mention 500 as a 
ceiling. 

 

As far as cadence goes, I expect there will be a lot of activity for the 
next few releases as individual patterns are coordinated with the origin 
owners but then it will settle down to a much more bursty pattern of 
updates every few Chrome releases (likely linked with an origin changing 
their application and adding more/different resources). And yes, it is 
manual.

As far as the process goes, resource owners need to actively assert that 
their resource is appropriate for the single-keyed cache and that they 
would like it included (usually in response to active outreach from us but 
we have the external-facing list for owner-initiated contact as well).  The 
design doc has the documentation for what it means to be appropriate (and 
the doc will be moved to a readme page in the repository next to the actual 
list so it's not a hard-to-find Google doc):

Will there be any kind of public record of this assertion? What happens if 
a site starts using query params or sending cookies? Does the person in 
charge of manual list curation discover that in the next release? Does that 
require a new release (I don't know if this lives in component updater, or 
in the binary itself)? 

 

*5. Require resource owner opt-in*
For each URL to be included, reach out to the team/company responsible for 
the resource to validate the URL pattern and get assurances that the 
pattern will always serve the same content to all sites and not be abused 
for tracking (by using unique URLs within the pattern mask as a bit-mask 
for fingerprinting). They will also need to validate that the URLs covered 
by the pattern will not rely on being able to set cookies over HTTP using a 
Set-Cookie HTTP response header because they will not be re-applied across 
cache boundaries (the set-cookie is not cached with the resource).

 

On Wed, Oct 22, 2025 at 5:31 PM Mike Taylor <[email protected]> wrote:

On 10/18/25 8:34 a.m., Patrick Meenan wrote:

Sorry, I missed a step in making the candidate resource list public. I have 
moved it to my chromium account and made it public here 
<https://docs.google.com/spreadsheets/d/1TgWhdeqKbGm6hLM9WqnnXLn-iiO4Y9HTjDXjVO2aBqI/edit?usp=sharing>.
 


 

Not everything in that list meets all of the criteria - it's just the first 
step in the manual curation (same URL served the same content across > 20k 
sites in the HTTP Archive dataset).

 

The manual steps frome there for meeting the criteria are basically:

 

- Cull the list for scripts, stylesheets and compression dictionaries.

- Remove any URLs that use query parameters.

- Exclude any responses that set cookies.

- Identify URLs that are not manually versioned by site embedders (i.e. the 
embedded resource can not get stale). This is either in-place updating 
resources or automatically versioned resources.

- Only include URLs that can reliably target a single resource by pattern 
(i.e. ..../<hash>-common.js but not ..../<hash>.js)

- Get confirmation from the resource owner that the given URL Pattern is 
and will continue to be appropriate for the single-keyed cache

A few questions on list curation:

Can you clarify how big the list will be? The privacy review at 
https://chromestatus.com/feature/5202380930678784?gate=5174931459145728 
mentions 
~500, while the design doc mentions 1000. I see the candidate resource list 
starts at ~5000, then presumably manual curation begins to get to one of 
those numbers.

What is the expected list curation/update cadence? Is it actually manual?

Is there any recourse process for owners of resources that don't want to be 
included? Do we have documentation on what it mean to be appropriate for 
the single-keyed cache?

thanks,
Mike

-- 
You received this message because you are subscribed to the Google Groups 
"blink-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an 
email to [email protected].
To view this discussion visit https://groups.google.com/a/
chromium.org/d/msgid/blink-dev/CAPq58w6UFSnxxzhGKBnY1BJKiZZeH
7BUm7PmcjQm_%2BLjGyrtYg%40mail.gmail.com 
<https://groups.google.com/a/chromium.org/d/msgid/blink-dev/CAPq58w6UFSnxxzhGKBnY1BJKiZZeH7BUm7PmcjQm_%2BLjGyrtYg%40mail.gmail.com?utm_medium=email&utm_source=footer>
.

-- 
You received this message because you are subscribed to the Google Groups 
"blink-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an 
email to [email protected].

To view this discussion visit https://groups.google.com/a/
chromium.org/d/msgid/blink-dev/CAFUtAY9Nffq00r-
xbiu2BO00y%2B_2knAi-zheMs9hrE-dB%2BTZ3w%40mail.gmail.com 
<https://groups.google.com/a/chromium.org/d/msgid/blink-dev/CAFUtAY9Nffq00r-xbiu2BO00y%2B_2knAi-zheMs9hrE-dB%2BTZ3w%40mail.gmail.com?utm_medium=email&utm_source=footer>
.

-- 
You received this message because you are subscribed to the Google Groups 
"blink-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an 
email to [email protected].
To view this discussion visit https://groups.google.com/a/
chromium.org/d/msgid/blink-dev/CAPq58w4ceQ4Df%2BzFCYwFM5MSAh4APVXtCHj9Q7o5CP
_B%3DKs1kA%40mail.gmail.com 
<https://groups.google.com/a/chromium.org/d/msgid/blink-dev/CAPq58w4ceQ4Df%2BzFCYwFM5MSAh4APVXtCHj9Q7o5CP_B%3DKs1kA%40mail.gmail.com?utm_medium=email&utm_source=footer>
.

-- 
You received this message because you are subscribed to the Google Groups 
"blink-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an 
email to [email protected].

To view this discussion visit https://groups.google.com/a/
chromium.org/d/msgid/blink-dev/CAPq58w5R56xfGBsnOknw1Ha0ns%
2BQW%2BQhtvPkR0aqHZAmnhiOOg%40mail.gmail.com 
<https://groups.google.com/a/chromium.org/d/msgid/blink-dev/CAPq58w5R56xfGBsnOknw1Ha0ns%2BQW%2BQhtvPkR0aqHZAmnhiOOg%40mail.gmail.com?utm_medium=email&utm_source=footer>
.

-- 
You received this message because you are subscribed to the Google Groups 
"blink-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion visit 
https://groups.google.com/a/chromium.org/d/msgid/blink-dev/f77a8ce1-17c5-49b0-8569-937d31a338ean%40chromium.org.

Reply via email to