Privacy and fingerprinting
Browser fingerprinting explained
By Yasir Ahmed, Browser Security Engineer
Technically reviewed by Usman Khan, Lead Chromium Developer
Published Last updated 7 min read

Cookies get most of the attention in discussions about tracking, partly because they are visible and easy to explain. Fingerprinting is less visible and harder to opt out of: it reads characteristics your browser already exposes and combines them into a value that can stay stable across visits.
Research has found fingerprints to be identifying in large samples. The EFF’s 2010 Panopticlick study found about 84% of browsers had a unique fingerprint, and the 2016 AmIUnique study found about 89%. A 2018 study of around two million visitors to a large French website found only about a third were unique. Uniqueness depends heavily on the population measured, but it is rarely low enough to ignore.
What a fingerprint is made of
No single signal below is unique on its own. The technique works by combining many weak signals into one value that narrows down to a small set of browsers, sometimes to one.
| Signal | What it reveals | Why it is hard to hide cleanly |
|---|---|---|
| User-Agent and Client Hints | Browser, version, operating system and sometimes device model | Must match every other signal, or the mismatch stands out |
| Screen and display | Resolution, color depth and device pixel ratio | Sites use these values for layout decisions |
| Canvas rendering | Pixel-level differences from GPU, driver and font rendering | The output still has to look correct to the page, not just different |
| WebGL parameters | GPU vendor and renderer strings, and rendering precision quirks | Many sites query these for compatibility, not just tracking scripts |
| AudioContext output | Small differences in how audio processing is computed on different hardware | Changing it has to preserve normal audio playback |
| Font enumeration | Which fonts are installed, often revealing OS, region and installed software | Removing fonts users need breaks normal page rendering |
| Hardware concurrency and memory | CPU core count and approximate device memory | Sites use these values for performance tuning |
| Time zone and locale | Approximate location and language settings | Has to stay consistent with other reported settings |
| WebRTC | Your public IP address when traffic goes through a browser-level proxy; major browsers now hide local IP addresses by default | WebRTC needs network information to set up calls at all |
| TLS and HTTP/2 handshake (JA3/JA4) | A fingerprint of the browser’s network stack | Set below JavaScript, so only network-stack changes can alter it |
The last column matters more than it might look. Almost every one of these signals exists for a legitimate reason: canvas and WebGL for rendering, AudioContext for audio processing, font enumeration for typography, and WebRTC for calls. Fingerprinting is a side effect of useful APIs, not a single flaw that can be patched out.
Why coherence matters more than any single value
A common assumption is that adding noise to one or two signals, such as canvas output, is enough. In practice, fingerprinting scripts cross-check signals against each other. A browser that claims to be Chrome on Windows but exposes macOS-only fonts, or an iPhone User-Agent paired with a desktop NVIDIA WebGL renderer string, is flagged at once, and more reliably than an unmodified browser would be.
What this means in practice
Effective work in this area treats the browser as one coherent identity, not a list of independent knobs. Time zone, locale, language, hardware values and rendering signatures all need to agree with each other and stay consistent across a session, rather than being randomized independently on every page load.
Two defensive strategies: blend in, or vary consistently
Tor Browser makes every user report the same values where it can, so no one stands out. Brave instead adds small amounts of noise to values such as canvas and audio output, seeded per site and per session, so values stay stable during a visit but cannot be linked across sites. Both work only when every signal agrees with every other. Randomizing each value on every call fails because it is inconsistent, not because it is random.
Why this usually needs engine-level changes, not just an extension
A browser extension runs JavaScript that can intercept some calls, for example wrapping HTMLCanvasElement.prototype.toDataURL to return an altered value. Three problems come up quickly. First, anything the override does not think to touch still leaks the original value. Second, overriding a native function changes what it looks like when a page inspects it (for example through Function.prototype.toString), and some fingerprinting scripts check for exactly that. Third, a page can get untouched copies of the APIs from a fresh iframe, a web worker or an OffscreenCanvas, unless the override reaches those contexts before the page uses them.
Changing the same behavior inside the engine, in Chromium’s or Firefox’s own C++ implementation, means the page sees native functions rather than script overrides, and every context (frames, workers, offscreen canvases) gets the same values. Altered outputs can still be spotted by careful statistical tests, so this is not invisibility. It is the most reliable place to enforce cross-signal coherence: time zone agreeing with locale, and both agreeing with rendering output.
Legitimate reasons teams work on this
- Privacy-focused browsers. Some browsers build fingerprint resistance in directly, as a user-facing privacy feature rather than a hidden default.
- QA across device and browser profiles. Testing how a site or web app behaves across many device, OS and browser combinations without provisioning each one physically.
- Fraud and abuse research. Security teams study these techniques to understand the tools attackers already use, and to build detection that accounts for them.
Fingerprinting itself also has legitimate users: banks and fraud-prevention vendors use it to detect account takeover and bots. In the EU, regulators treat reading device characteristics for tracking as covered by the ePrivacy consent rules (EDPB Guidelines 2/2023).
Whatever the use case, this work should be scoped and documented, not sold as a blanket guarantee. Our browser security and anti-fingerprinting service delivers a written list of which signals a build covers and which it does not. For examples, see the Anti-Fingerprint Chromium Browser and Symphony Browser case studies.
What a written scope for this kind of work looks like
- Which signals are addressed: canvas, WebGL, AudioContext, fonts, hardware and client hints, WebRTC, time zone and locale, or a subset.
- Whether protections are applied at the engine level, and where JavaScript-level fallbacks are used instead, with the tradeoffs of each documented.
- How consistency is verified, ideally with a reproducible test harness that checks signals against each other, not just against a baseline.
- Which public test pages are used as a baseline, for example Cover Your Tracks, AmIUnique and CreepJS.
- What is explicitly out of scope, so a shipped build is never presented as more complete than it is.
Final takeaway
Browser fingerprinting works because it draws on APIs that exist for good reasons, which is why it cannot be switched off with one setting. Useful protection treats a browser’s signals as one coherent identity, does that work where the signals originate, inside the engine, and comes with a written account of what is and is not covered.
Frequently asked questions
Does clearing cookies or using incognito mode stop fingerprinting?
Not on its own. Fingerprinting does not rely on stored data, so clearing cookies or opening a private window leaves most of the signals a script reads unchanged. Private mode can change a few signals, browsers differ in how much they adjust, and some scripts try to detect private browsing itself.
Is browser fingerprinting legal?
It depends on the purpose and the market. In the EU, reading device characteristics to track users generally needs consent under the ePrivacy rules, and the GDPR applies when a fingerprint relates to a person. Rules elsewhere differ. This is not legal advice; check with counsel for the markets you serve.
How can I see my own browser’s fingerprint?
Public test pages such as the EFF’s Cover Your Tracks, AmIUnique and CreepJS show which signals your browser exposes and how unusual they are. Results depend on who else has visited each test site, so treat them as a guide rather than a precise score.
Do Brave, Firefox and Safari already protect against fingerprinting?
Partly. Brave adds per-site, per-session noise to several APIs. Firefox blocks known fingerprinting scripts by default and has a stronger resist-fingerprinting mode, which Tor Browser builds on. Safari limits the data it exposes and adds more protection in Private Browsing. None of them covers every signal.
Working on privacy-focused browser features?
We build fingerprint protection into Chromium and Firefox builds at the engine level, with a written account of what is covered. See our browser security and anti-fingerprinting service.
