Skip to content
All fingerprint checks
HTTP request vs the runtime

A WebSocket handshake carries the no-cache pair every browser sends

Pim· Clearcote Research 2 min readCheck id websocket-handshake-no-cache

The WebSocket upgrade request carries both Pragma: no-cache and Cache-Control: no-cache. Information only (severity: info).

What a detector infers

A WebSocket connection starts as an HTTP request that is never cacheable, and browsers mark it that way. In Chromium the handshake is sent with load flags that switch the cache off, and the HTTP transaction layer turns those flags into two headers, Pragma: no-cache and Cache-Control: no-cache, unconditionally. Every browser measured sends the pair on its upgrade request.

A WebSocket client that is not a browser — a library opening the same connection while presenting a browser's user agent and origin — has to add them on purpose. The probe opens a WebSocket to the audit's own endpoint and reads the headers on the server side, where page script can neither see nor change them. Only one side is measured: the pair was present on every arm tested and no failing client was captured, so the row is information only.

A TLS-terminating proxy that rewrites request headers could also change it, which is one more reason not to score it.

How to resolve it

Nothing to fix in a browser: the headers are added below JavaScript. A non-browser WebSocket client presenting itself as one shows here and in the rest of its handshake; open the connection from the browser instead.

How automation gets caught, layer by layer

Nearby checks in HTTP request vs the runtime

See all 10 checks in HTTP request vs the runtime
Who builds this test

Clearcote is a browser built for fingerprint coherence

It is a Chromium fork, maintained by the same people who wrote this reference. It ships as a compiled browser rather than as a stealth script injected into someone else's — which is a description of how it is built, and is not an argument about how it behaves on this check.

This audit takes no position on how Clearcote scores on HTTP request vs the runtime checks, on this one, or anywhere else. It has no baseline corpus of other people's fingerprints to rank you against and no vendor scoreboard — nearly every check is self-referential, asking one browser the same question through two independent APIs and reporting whether both answers can be true at once. It runs identically on any browser, including ours. Run it on yours and read the result yourself.

See the other checks in HTTP request vs the runtime — the family websocket-handshake-no-cache belongs to.