Every time you load a page, your browser hands the site far more than the URL you typed. It volunteers dozens of small technical facts — the fonts you have installed, the exact way your graphics card draws a curve, how many CPU cores you have, your timezone, the precise pixel dimensions of your screen. Individually these facts are boring. Combined, they form a browser fingerprint that can identify your device with startling precision, often without a single cookie.
This guide is a deep, practical walkthrough of device fingerprinting: what each signal class actually measures, why the combination is so powerful, and — the part most articles get wrong — how real browser fingerprint protection works. Spoiler: blocking and randomizing signals usually makes you easier to track, not harder. The thing that matters is consistency. By the end you'll understand exactly what a detector sees, how to test your own fingerprint, and how to change your browser fingerprint the right way.
If you manage multiple accounts, run ad campaigns, do QA across regions, or simply care about privacy, understanding fingerprinting is the difference between looking like a real person and lighting up every fraud model on the internet.
What a browser fingerprint actually is
A fingerprint is a collection of attributes your browser and device expose, hashed or compared together to produce an identifier. Unlike a cookie, nothing is stored on your machine — the site simply reads the traits you already broadcast. Clear your cookies, switch to incognito, use a VPN: the fingerprint often survives all of it, because it's derived from your hardware and software configuration, not from stored state.
The technical foundation is entropy — a measure of how much a signal narrows down who you are. If half the world's browsers report your value, that signal carries about one bit of entropy. If only one in a million shares it, it carries roughly twenty bits. Stack enough moderately-rare signals and the combined entropy easily exceeds what's needed to single out one device among billions. That's why fingerprinting works: no single trait is unique, but the intersection almost always is.
User agent and Client Hints
The user agent (UA) string is the oldest signal — a line of text announcing your browser, version, and operating system, e.g. Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36. On its own it's low entropy (lots of people run the same Chrome on Windows), but it's the anchor every other signal is checked against.
Modern Chromium is migrating detail out of the UA string into User-Agent Client Hints (UA-CH) — structured headers and a JavaScript API (navigator.userAgentData) that report brand, platform, architecture, bitness, and full version list, often on demand. This matters for spoofing: if your UA claims Windows but your Client Hints say macOS, or your platform value contradicts your declared OS, you've created an inconsistency that screams "manipulated." A coherent identity has to update the UA string and every Client Hint together.
Canvas fingerprinting
Canvas is the workhorse of device fingerprinting. A script draws text and shapes to an off-screen <canvas> element, then reads back the pixels with toDataURL() or getImageData(). The result looks identical to your eye, but at the pixel level it's shaped by your GPU, graphics driver, font rasterizer, anti-aliasing, and OS text rendering. Two machines rarely produce byte-identical output.
The script hashes that pixel buffer into a compact value. Because the rendering pipeline is remarkably stable on a given device, your canvas hash tends to persist across sessions — making it one of the highest-value tracking signals. It typically carries several bits of entropy on its own, and combined with WebGL it's often enough to isolate a device.
WebGL: vendor, renderer, and parameters
WebGL exposes your GPU to the web for 3D graphics, and in doing so leaks a lot. Three things get read:
- Unmasked vendor and renderer — strings like
Google Inc. (NVIDIA)andANGLE (NVIDIA, NVIDIA GeForce RTX 3060 Direct3D11 vs_5_0 ps_5_0). These name your actual graphics hardware and driver stack. - WebGL parameters — dozens of numeric limits (max texture size, max render buffer size, supported extensions, shader precision). These vary by GPU and driver and combine into their own sub-fingerprint.
- WebGL canvas rendering — like 2D canvas, a rendered 3D scene read back pixel-by-pixel produces a hardware-specific hash.
The trap here is that a spoofed WebGL renderer string must be plausible for the rest of the device. Claiming a high-end NVIDIA GPU while reporting two CPU cores and a mobile user agent is an instant tell.
Audio context fingerprinting
The Web Audio API can fingerprint you without playing a sound. A script generates a waveform through an OscillatorNode, processes it (typically with a DynamicsCompressorNode), and reads the resulting sample values. Tiny differences in your audio stack — CPU floating-point behavior, the audio subsystem, driver math — produce a consistent, device-specific numeric signature. It's low-effort for the tracker, invisible to you, and stable across sessions.
Installed fonts
The set of fonts installed on your machine is surprisingly identifying. Detectors enumerate fonts two ways: by measuring the width and height of text rendered in candidate fonts (a match changes the dimensions versus a fallback), or via newer APIs where available. Your font list reflects your OS, language packs, installed office suites, design tools, and Adobe/Microsoft products. A designer's machine looks nothing like a fresh Windows install, and that difference is entropy.
Screen and window metrics
Several geometry signals get read together:
- Screen resolution and available screen area (minus the taskbar/dock).
- Color depth and pixel ratio (
devicePixelRatio, which reveals HiDPI/Retina scaling). - Inner and outer window dimensions, which expose your browser chrome and OS.
These are moderately identifying and, importantly, easy to get wrong when spoofing. A window inner size larger than the screen, or a device pixel ratio that doesn't match the claimed device class, is a contradiction detectors look for specifically.
Hardware concurrency and device memory
Two JavaScript properties report your hardware directly:
navigator.hardwareConcurrency— the number of logical CPU cores (commonly 4, 8, 12, 16).navigator.deviceMemory— approximate RAM in gigabytes, rounded (0.5, 1, 2, 4, 8).
Neither is unique alone, but both must line up with the rest of your story. A "flagship phone" reporting 32 cores and 64 GB of RAM is not a flagship phone — it's a spoofed desktop wearing a mobile costume.
Timezone and locale
Your timezone (via Intl.DateTimeFormat().resolvedOptions().timeZone and the Date object's offset) and your locale/language (navigator.language, navigator.languages, and the Accept-Language HTTP header) are gold for cross-checking against your IP address. This is one of the most common ways antidetect setups get caught: the proxy exits in Germany, but the browser reports America/New_York and en-US. That mismatch alone can flag a session. Timezone, locale, and geolocation should all follow your proxy's exit location.
Media devices, battery, and plugins
A few smaller signals round out the picture:
- Media devices —
enumerateDevices()lists cameras, microphones, and speakers (labels hidden until permission is granted, but counts and device IDs still leak). Zero media devices on a "laptop" is suspicious. - Battery — the Battery Status API (where still present) exposes charge level and charging state; its removal in many browsers is itself a signal.
- Plugins and MIME types —
navigator.pluginsonce carried heavy entropy (Flash, Java, PDF viewers). Modern browsers report a small, standardized set, so a browser reporting an exotic plugin list is anomalous.
TLS/JA3 and HTTP header order
The signals above are read by JavaScript. But some of the most robust fingerprinting happens below JavaScript, at the network layer — which is why JavaScript-only spoofing tools fail against sophisticated detectors.
- TLS/JA3 fingerprinting hashes the specifics of your TLS Client Hello — the cipher suites, extensions, elliptic curves, and their exact order. Each browser engine (and version) produces a characteristic JA3/JA4 hash. If your JavaScript claims Chrome 151 but your TLS handshake matches an automation library or a mismatched engine, you're caught before a single script runs.
- HTTP/2 header order and frame settings — the order in which your browser sends headers, and its HTTP/2 SETTINGS frame values, are engine-specific. Real Chrome sends headers in a particular order; a scripted client or a patched browser often doesn't.
These network-layer signals can't be changed by injecting JavaScript into a normal browser. They're baked into the engine itself. This is the single biggest reason serious fingerprint spoofing requires a purpose-built browser rather than an extension.
How signals combine into a near-unique ID
Here's the mental model. Think of each signal as a filter that removes a fraction of the world's devices. The UA leaves you with millions of matches. Add timezone and locale — hundreds of thousands. Add canvas + WebGL hashes — a few hundred. Add fonts, screen geometry, audio, core count, and the network-layer JA3 — and you're frequently down to one.
| Signal class | Approx. entropy | Stability | JS-readable? |
|---|---|---|---|
| User agent / Client Hints | Low–medium | High | Yes |
| Canvas hash | Medium–high | Very high | Yes |
| WebGL vendor/renderer/params | Medium–high | Very high | Yes |
| Audio context | Medium | High | Yes |
| Installed fonts | Medium–high | High | Yes |
| Screen/window metrics | Medium | Medium | Yes |
| CPU cores / device memory | Low–medium | High | Yes |
| Timezone / locale | Medium | Medium | Yes |
| Media devices / battery / plugins | Low | Medium | Yes |
| TLS / JA3 / header order | Medium–high | Very high | No |
The exact entropy numbers shift over time and by population, but the shape holds: no single row identifies you, yet the combination almost always does. Detectors also weigh consistency between rows as heavily as the rows themselves.
The critical mistake: blocking and randomizing
Most privacy advice tells you to block or randomize fingerprinting signals. This is intuitive and usually wrong.
Blocking a signal (returning nothing, or a fixed dummy value) makes you rare in a different way. Almost nobody blocks their canvas. If you do, you now belong to the tiny, conspicuous population of "canvas blockers" — which is itself a highly identifying trait. You didn't disappear; you put on a costume that says "I am hiding."
Randomizing a signal per-page (a different canvas hash on every load) breaks the consistency that real devices have. A genuine laptop returns the same canvas hash every time. If yours changes on every request, you've announced that a spoofing layer is running. Some anti-fraud systems specifically hunt for signals that are too random — instability is a fingerprint of its own.
There's a subtler problem too: randomizing one signal while leaving others real creates internal contradictions. Randomized canvas + real WebGL renderer + real fonts don't describe any coherent device. Detectors don't need to identify you uniquely to act — they just need to notice that your signals don't add up.
The right approach: a coherent, consistent alternate device
The goal isn't to have no fingerprint. It's to present a complete, internally consistent fingerprint of a plausible, different device — and to keep presenting the same one every time.
That means:
- Every signal agrees. The UA, Client Hints, platform, canvas, WebGL, fonts, screen size, core count, timezone, and locale all describe one believable machine. A Windows profile has Windows fonts, a Windows UA, Windows Client Hints, and a Direct3D WebGL renderer.
- It's stable over time. The same profile returns the same canvas and WebGL hash on every visit, like a real device would. Persistence is believability.
- It matches the network layer. The TLS/JA3 handshake and header order match the browser you claim to be, and the timezone/locale/geolocation match the proxy exit IP.
- It reaches every context. The spoof has to hold inside iframes and Web Workers, not just the top page. Detectors deliberately re-read signals from a Worker because many spoofing tools only patch the main thread.
This is exactly why native, engine-level fingerprinting beats JavaScript injection. When the fingerprint is applied in the browser core — as it is in Dual Login, whose custom Chromium engine applies canvas, WebGL, audio, fonts, screen, user-agent, timezone, languages, and geolocation natively — the values are consistent everywhere, including inside Web Workers and iframes, and they don't reveal the tell-tale toString traces that injected JavaScript leaves behind. Each profile also carries its own sealed cookies and storage, and its timezone, locale, and geolocation auto-match the proxy exit IP, with WebRTC masked to that IP so your real address never leaks. If you're weighing tools, our guide to the best antidetect browser breaks down what to look for.
How to test your own browser fingerprint
You can't fix what you can't see. Test your fingerprint before you trust a setup — and re-test after any change.
Step by step:
- Check a baseline. Open a fingerprint checker in your normal browser and note your values. Good options include a general checker like BrowserScan, a Pixelscan-style consistency test, and our own free browser fingerprint checker, which shows exactly what each profile exposes.
- Read the whole report, not the score. A single "uniqueness" number is less useful than the breakdown. Look at each signal class and ask: does this describe a coherent device?
- Hunt for contradictions. The most important thing to read is consistency flags. Does the timezone match the IP? Does the platform in Client Hints match the UA? Does the WebGL renderer suit the claimed OS? Is WebRTC leaking a different IP than your proxy?
- Check the network layer. Look for any TLS/JA3 or "automation detected" /
navigator.webdriverflags. A clean fingerprint haswebdriver: falseand no automation banner. - Re-test in a Worker context. Better checkers re-read canvas/WebGL from a Web Worker. If your main-thread values and Worker values differ, your spoof is incomplete.
How to read the results: green isn't the same as invisible. A report showing you as "unique" but consistent is fine — real devices are unique too. What you never want is incoherence: a mobile UA with desktop metrics, a randomized canvas that changes on reload, a proxy in one country and a timezone in another, or a JA3 that matches an automation tool. Those are the patterns fraud models act on.
Fingerprinting versus IP reputation
One clarification that saves a lot of wasted effort: a perfect fingerprint won't rescue a bad IP, and vice versa. Fingerprinting identifies your device; IP reputation and geolocation identify your network. CAPTCHAs, "unusual activity" prompts, and many blocks are driven by the IP's reputation, not your canvas hash. That's why per-profile proxies matter, and why the proxy type you choose is a separate decision from your fingerprint. Treat them as two layers of the same identity: the device and the network have to tell the same story. If you're running many accounts, see our notes on how to manage multiple accounts cleanly.
A practical checklist
Before you trust any profile for real work, confirm:
- UA, Client Hints, and
platformall name the same OS. - Canvas and WebGL hashes are stable across reloads (not randomized).
- WebGL renderer is plausible for the claimed device.
- Fonts match the OS you're presenting.
- Screen/window geometry and
devicePixelRatiofit the device class. -
hardwareConcurrencyanddeviceMemoryare realistic and coherent. - Timezone, locale, and geolocation match the proxy exit IP.
- WebRTC reports the proxy IP, not your real one.
-
navigator.webdriveris false; no automation banner. - Values hold inside iframes and Web Workers.
FAQ
Is browser fingerprinting legal?
Reading the signals a browser exposes is legal and widespread — analytics, fraud prevention, and bot detection all rely on it. What's regulated is how the resulting data is used and stored (privacy laws like GDPR apply). Using an antidetect browser for legitimate work such as marketing, e-commerce, QA, or research is likewise legal; following each platform's own rules is your responsibility.
Does a VPN change my browser fingerprint?
No. A VPN changes your IP address and can shift your apparent location, but it does nothing to your canvas hash, WebGL renderer, fonts, or any JavaScript-readable signal. Worse, a VPN often creates a contradiction: new IP country, same old timezone and locale. You need to change the fingerprint and the network together.
Will incognito or clearing cookies help?
Not against fingerprinting. Private mode and cookie clearing remove stored identifiers, but a fingerprint is computed live from your hardware and software, so it survives both. That's the whole point — fingerprinting was designed to work without cookies.
Isn't randomizing my canvas the safest option?
No. A canvas that changes on every load is a signal in itself — real devices are stable. Randomization also creates mismatches with your other, non-randomized signals. A stable, coherent alternate value is far safer than a moving target.
How many accounts can one fingerprint safely run?
One. The entire model of fingerprint protection is that each identity is a separate, consistent device. Reusing a single fingerprint across accounts links them together — which is exactly what you're trying to avoid. Give every account its own profile, fingerprint, and proxy.
Can detectors see the network-layer signals too?
Yes — TLS/JA3 and HTTP/2 header order are read server-side, below JavaScript, and can't be patched by a browser extension. This is why serious spoofing needs a purpose-built engine whose handshake matches the browser it claims to be, not a script bolted onto a normal browser.
Final thoughts
Browser fingerprinting isn't magic — it's the accumulation of dozens of small, honest signals your browser volunteers, cross-checked for consistency until they point at one device. Once you understand that, the defense becomes obvious: don't hide, and don't scramble. Present a complete, coherent, stable alternate device, apply it deep enough to reach the network layer and Web Workers, and keep your fingerprint and your proxy telling the same story.
The fastest way to internalize all of this is to test a real profile and read the report yourself. Dual Login's free plan gives you 10 profiles with no credit card, each with a natively-applied, internally consistent fingerprint, per-profile proxy support with auto-matched timezone and locale, and sealed storage that survives restarts and moves between machines. Spin one up, run it through a checker, and watch the signals line up. Create a free account or download the desktop app for Windows, macOS, or Linux — then compare your options on pricing whenever you're ready to scale.