Browser fingerprinting tracks you without cookies. It builds a unique profile from your browser’s characteristics — screen resolution, fonts, canvas rendering, WebGL output, timezone, language, and dozens of other signals — that persists even after you clear cookies or use a VPN.
This guide covers the specific fingerprinting vectors, what each one exposes, and the techniques that actually reduce them.
How Fingerprinting Works
Fingerprinting combines many data points to create a unique identifier:
// A simplified example of what fingerprinting scripts collect
const fingerprint = {
userAgent: navigator.userAgent,
screen: `${screen.width}x${screen.height}x${screen.colorDepth}`,
timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
language: navigator.language,
platform: navigator.platform,
hardwareConcurrency: navigator.hardwareConcurrency,
deviceMemory: navigator.deviceMemory,
canvas: getCanvasFingerprint(),
webgl: getWebGLRenderer(),
fonts: getInstalledFonts(),
audioContext: getAudioFingerprint()
};
No single property is unique. The combination is. A 2023 study found that combining just 8-12 properties identified 99%+ of browsers uniquely.
Test Your Current Fingerprint
Before making changes, establish a baseline:
https://coveryourtracks.eff.org— EFF’s fingerprint testhttps://browserleaks.com— detailed breakdown of each fingerprint vectorhttps://amiunique.org— shows how unique your browser is across their dataset
Note your uniqueness score, then test again after each change to see improvement.
Vector 1: Canvas Fingerprinting
Canvas fingerprinting asks your browser to draw text/shapes on an invisible canvas. Subtle differences in font rendering, anti-aliasing, and GPU compositing produce a value unique to your browser+OS+hardware combination.
What It Looks Like in Practice
function getCanvasFingerprint() {
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
ctx.textBaseline = 'top';
ctx.font = '14px Arial';
ctx.fillText('Browser fingerprint: 🌍', 2, 2);
return canvas.toDataURL();
}
Protections
Tor Browser: Randomizes canvas output per session — returns noise instead of true rendering.
Firefox with privacy.resistFingerprinting:
Open about:config and set:
privacy.resistFingerprinting = true
This enables Firefox’s fingerprinting resistance mode, which includes canvas randomization.
Canvas Blocker extension (Firefox/Chrome): Blocks or randomizes canvas API responses.
Brave Browser: Reports a randomized canvas fingerprint per site per session.
Vector 2: WebGL Fingerprinting
WebGL exposes your GPU model and renderer string — a specific combination that narrows down hardware considerably.
const gl = document.createElement('canvas').getContext('webgl');
const renderer = gl.getParameter(gl.RENDERER);
// Returns something like: "ANGLE (NVIDIA, NVIDIA GeForce RTX 3080, OpenGL 4.5.0)"
Protections
- Firefox
privacy.resistFingerprinting: Spoofs WebGL info to a generic value - Tor Browser: Built-in protection
- Brave: Randomizes WebGL info per session
- Manual: Use a browser extension that intercepts
getParameter()calls
In Firefox about:config:
webgl.disabled = true # Disables WebGL entirely (breaks some sites)
webgl.enable-webgl2 = false # Disables WebGL 2 specifically
Vector 3: Font Enumeration
Your browser can be asked to measure text rendered in various fonts. If a font is installed, the text dimensions differ from the fallback font. This reveals which fonts you have installed — a stable, OS-dependent fingerprint.
// Font detection via canvas measurement
function isFontAvailable(font) {
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
const baseline = ctx.measureText('mmmmmmmmmmlli').width;
ctx.font = `72px ${font}, monospace`;
return ctx.measureText('mmmmmmmmmmlli').width !== baseline;
}
Protections
- Firefox
privacy.resistFingerprinting: Reports a limited, consistent font set - Tor Browser: Restricts available fonts to a standard list
- Brave: Randomizes font metrics
There is no good way to install many custom fonts while preventing fingerprinting. If privacy matters, use a browser with built-in resistance rather than trying to manage fonts manually.
Vector 4: Audio Context Fingerprinting
The Web Audio API processes audio through your hardware. Tiny differences in floating-point operations produce a unique value per device.
function getAudioFingerprint() {
const audioCtx = new AudioContext();
const oscillator = audioCtx.createOscillator();
const analyser = audioCtx.createAnalyser();
oscillator.connect(analyser);
analyser.connect(audioCtx.destination);
oscillator.start(0);
const data = new Float32Array(analyser.frequencyBinCount);
analyser.getFloatFrequencyData(data);
return data.slice(0, 10).join(',');
}
Protections
- Firefox
privacy.resistFingerprinting: Adds noise to Audio API output - Tor Browser: Same protection built in
- Brave: Randomizes audio context values per session
Disable Audio API entirely (breaks audio on some sites):
In Firefox about:config:
media.webaudio.enabled = false
Vector 5: Timezone and Language
Your system timezone and browser language are stable identifiers that correlate with your location.
Intl.DateTimeFormat().resolvedOptions().timeZone // "America/New_York"
navigator.language // "en-US"
navigator.languages // ["en-US", "en"]
Protections
In Firefox with privacy.resistFingerprinting:
- Timezone is reported as UTC
- Language is reported as
en-USregardless of actual setting
For manual control without privacy.resistFingerprinting:
javascript.options.wasm = false # Doesn't help with timezone
Better approach: use a browser profile with privacy.resistFingerprinting enabled, or use Tor Browser for sensitive browsing.
Vector 6: Hardware and Browser Properties
navigator.hardwareConcurrency // Number of CPU cores
navigator.deviceMemory // RAM in GB
screen.width, screen.height // Screen resolution
screen.colorDepth // Color depth
These are stable across sessions. Many users have 4-16 CPU cores, 8-32GB RAM, and standard screen resolutions — but the combination narrows things.
Protections
- Firefox
privacy.resistFingerprinting: Reports hardwareConcurrency as 2, deviceMemory as 8 - Tor Browser: Reports standard values
Which Browser Provides the Best Protection?
Tor Browser
Best fingerprinting resistance available. Uses fingerprinting resistance by design — everyone who runs Tor Browser looks the same (the “crowd” approach). Limitations: slow, not for everyday use.
Firefox with Hardening
With privacy.resistFingerprinting = true plus the following about:config settings:
privacy.resistFingerprinting = true
privacy.resistFingerprinting.block_mozAddonManager = true
privacy.trackingprotection.fingerprinting.enabled = true
privacy.trackingprotection.enabled = true
geo.enabled = false
media.navigator.enabled = false
webgl.disabled = false # Keep enabled — disabling it is itself a fingerprint
dom.battery.enabled = false
dom.vibrator.enabled = false
This provides strong protection without being as restrictive as Tor Browser.
Brave Browser
Brave’s “Shields” fingerprinting protection is on by default. It randomizes fingerprint vectors per site per session rather than trying to match a crowd. Effective, but the randomization approach means your fingerprint is inconsistent, not invisible.
Go to brave://settings/shields to configure:
- Fingerprinting blocking: “Block fingerprinting” (default) — use “Strict” for sensitive browsing
Chrome and Edge
No meaningful fingerprinting protection. Do not use these for privacy-sensitive browsing.
Test After Hardening
After applying protections, re-run the fingerprint tests:
# Use curl to check what basic browser info you expose without JavaScript
curl -s -A "Mozilla/5.0" https://browserleaks.com/user-agent | grep -i "unique"
# Or run a headless browser test
npx playwright chromium --screenshot https://coveryourtracks.eff.org screenshot.png
Visit https://coveryourtracks.eff.org and look for:
- “Strong protection against Web tracking” — indicates fingerprinting resistance is working
- Randomized canvas hash — changes on each page reload if protection is active
Realistic Expectations
No browser is completely un-fingerprintable on the open web. The goal is to:
- Blend into a larger crowd (Tor Browser approach)
- Break the stability of the fingerprint so tracking across sessions fails (Brave approach)
- Reduce the number of unique signals so fingerprint confidence is lower
Combining good browser choice with a VPN or Tor removes the network-layer correlation that would otherwise link your anonymized fingerprint to your real IP.
Related Articles
- Tor Browser Screen Size Fingerprint Protection
- Tor Browser Canvas Fingerprinting Protection
- Tor Browser Fingerprinting Protection How It Makes Everyone
- Tor Browser Font Fingerprinting Protection
- Css Fingerprinting Techniques How Stylesheets Can Track You
Built by theluckystrike — More at zovo.one