invisible layer / network-timing
experiment 37 · fetch timing · partial
which sites
know you’re there.
A cached, authenticated resource loads faster than an uncached one. Before 2019, any website could measure this and infer whether you were logged in to other services — from timing alone, with no cookies and no interaction.
Before 2020, any website could detect which social networks you were logged into — from load time alone, in under 100ms, no permission needed. Browsers patched this in 2020–2021 via partitioned caches and SameSite cookie policy. The attack required zero cooperation from the target site and worked across all browsers.
0 probed
ms measured
browser protected
▶ history of login state detection attacks

The timing side-channel attack for login state detection was first documented by Felten and Schneider (2000, “Timing Attacks on Web Privacy”). The key insight: browsers maintain a shared HTTP cache across all origins. If you're logged into Facebook, the Facebook favicon is cached. Any page can try to load it and measure the time — cached = fast = logged in.

The attack was publicly documented, widely known, and remained exploitable for over a decade. Major browsers finally patched it between 2019 and 2021 through a combination of:

  • SameSite cookie policy — cookies no longer sent on cross-site subresource requests by default
  • Partitioned HTTP cache — each origin gets its own cache partition (Chrome 86, 2020; Firefox 85, 2021; Safari 13.1, 2020)
  • CORS restrictions — cross-origin fetch() calls blocked unless the target explicitly allows it

Before these mitigations, the attack required: one malicious webpage, a list of target URLs, fetch() or an <img> tag, and a timer. No user interaction. No permissions. No cookies from the attacker.

Variants using CSS :visited link style detection (history sniffing) remain partially effective. If a user has visited a URL, :visited styling applies and can be measured via getComputedStyle().