spyderproxy

How Browser Fingerprints Are Detected (2026 Breakdown)

D

Daniel K.

|
Published date

Sun May 10 2026

Quick verdict: Modern browser fingerprinting collects 30+ signals from your browser and network and combines them via entropy weighting to produce a near-unique identifier. The dominant signals are canvas hash, WebGL renderer, audio context, TLS ClientHello, and HTTP/2 settings — together they fingerprint you with 99%+ uniqueness across a 100K-user pool. Defeating fingerprinting requires consistent spoofing of ALL layers simultaneously; spoofing one (e.g., User-Agent) while leaving the others intact actually makes you MORE identifiable as a bot.

The Fingerprinting Stack

Anti-bot services and fraud-prevention tools collect signals at three layers:

LayerSignal sourceExample signals
NetworkTCP/TLS/HTTP handshakeJA3 hash, HTTP/2 SETTINGS frame, IP/ASN reputation
Browser environmentJavaScript queriesCanvas, WebGL, audio context, fonts, plugins, screen, timezone
BehavioralUser interaction patternsMouse path, scroll velocity, keystroke timing, click accuracy

Signals from all three layers are combined to score the request. A high-entropy combination = high confidence in identification. Low entropy = "could be many users" but still useful as a session linker.

JavaScript-Layer Signals (the most numerous)

Canvas Fingerprint

Renders a hidden image, hashes pixel data. ~99% uniqueness when combined with other signals. See Canvas fingerprinting deep-dive.

WebGL Renderer

WebGLRenderingContext.getParameter(WebGLRenderingContext.RENDERER) returns a string like "ANGLE (NVIDIA, NVIDIA GeForce RTX 3080 (0x00002484) Direct3D11 vs_5_0 ps_5_0, D3D11)". Reveals: GPU model, driver, OS rendering backend. Very high entropy.

Audio Context Fingerprint

Generate an audio signal, run it through the Web Audio API's processing pipeline, sample the output. Different OS audio implementations + CPU floating-point behavior produce slightly different signals. ~95% uniqueness.

Font List

Enumerate installed system fonts by trying to render text in each and measuring width. Most users have ~50-200 fonts; the specific set is fairly unique. Privacy-focused browsers limit access to this; commercial browsers do not.

Hardware Properties

  • navigator.hardwareConcurrency — CPU core count (typically 4, 8, 12, 16)
  • navigator.deviceMemory — RAM tier (0.25, 0.5, 1, 2, 4, 8 GB)
  • navigator.maxTouchPoints — touch screen support
  • screen.width/height/colorDepth/pixelRatio

Plugins and Mime Types

navigator.plugins and navigator.mimeTypes used to be highly identifying (Flash, Java, PDF readers); now mostly empty in modern browsers. Their EMPTINESS itself is a signal — a browser with NO PDF plugin is unusual.

WebRTC IPs

WebRTC reveals the local IP behind NAT and the public IP — even through a VPN if WebRTC is not blocked. Common privacy leak. Anti-bot services use this to detect VPN/proxy use.

Timezone & Language

Intl.DateTimeFormat().resolvedOptions().timeZone returns "America/Los_Angeles" or similar. navigator.language returns "en-US". A user with US English language but Asian timezone → suspicious.

Network-Layer Signals (hardest to fake)

JA3 TLS Fingerprint

A hash of the TLS ClientHello: cipher suite list, supported elliptic curves, extensions, signature algorithms. Python's requests and most non-browser HTTP clients produce a JA3 that is recognizably non-Chrome. Even spoofing the User-Agent does not change JA3.

This is why anti-bot services trivially distinguish Python scrapers from real browsers. Defeating it requires libraries that impersonate Chrome's TLS stack (curl_cffi, tls-client, undici with custom settings).

HTTP/2 SETTINGS Frame

HTTP/2 connections start with a SETTINGS frame announcing client preferences (max concurrent streams, header table size, initial window size). The values and ORDER are part of the fingerprint. Chrome's order is distinctive; Python libraries use different defaults.

Header Order

Browsers send HTTP headers in a specific order (Host, Connection, sec-ch-ua, sec-ch-ua-mobile, sec-ch-ua-platform, Upgrade-Insecure-Requests, User-Agent, Accept, ...). Curl and requests use different orders. Detectable.

IP / ASN Reputation

The IP itself is a signal. AWS/GCP/Azure ASNs are flagged automatically. Mobile carrier ASNs are trusted. Residential ISP ASNs are middle. This is why residential proxies matter — they shift you from "obviously bot" to "ambiguous."

Behavioral Signals

  • Mouse path entropy: real users move the mouse in Bezier-like curves; bots move in straight lines or instantly.
  • Click accuracy: real users miss the target by a few pixels then correct; bots click dead center.
  • Scroll velocity: real users scroll non-uniformly; bots use scrollTo with instant changes.
  • Time on page: bots often hit Next in < 1 second; humans take longer.
  • Keystroke timing: real typing has variable inter-key latency; bot-filled forms have uniform or instant filling.

Behavioral signals fire AFTER you arrive on the page, supplementing the network/JS fingerprint with "how does this user behave."

Combining Signals: Entropy Math

Each signal has an "entropy" — the information it contributes about which user you are. Approximate values:

SignalEntropy (bits)Notes
User-Agent~7Coarse: OS family + browser version
Screen resolution~5~30 common values
Timezone~3~24 main values
Language list~6Plus dialect
Canvas hash~17Near-unique among ~100K users
WebGL renderer~12GPU + driver
Audio context~9OS audio stack
Font list~1350-200 fonts varies
Plugins/MIME~5Mostly empty modern
JA3 TLS~12Browser+version
HTTP/2 settings~5Library detection

Total: ~94 bits combined. To uniquely identify one user in a 100K population needs only ~17 bits. The fingerprinting system has 5x more entropy than it needs — even with several signals spoofed, you remain identifiable.

This is why partial spoofing is worse than no spoofing. Real browser-A has consistent signals across all 30 dimensions. Bot pretending to be browser-A has Chrome UA + Chrome canvas + Linux WebGL + Python TLS — the INCONSISTENCY itself is a flag.

The Major Fingerprinting Services

  • FingerprintJS / Fingerprint Pro: open-source library + commercial API. Used by many sites to identify returning users.
  • ThreatMetrix (now LexisNexis): enterprise fraud detection, banking-grade.
  • iovation (TransUnion): device-based fraud prevention.
  • Sift: e-commerce fraud / account abuse detection.
  • FingerprintJS Bot Detection (different product than the user identifier): specifically targets bot detection.
  • Built into: Cloudflare Bot Management, DataDome, PerimeterX (HUMAN), Akamai Bot Manager. They all roll their own fingerprinting on top of the above.

How Bots Defeat Fingerprinting

  1. Antidetect browsers spoof JS-layer signals consistently per profile. See top antidetect browsers.
  2. TLS-impersonating libraries (curl_cffi) match Chrome's JA3.
  3. Residential / mobile proxies defeat IP reputation. See LTE proxies.
  4. Real browsers via Playwright (with stealth plugins) give correct network-layer signals automatically.
  5. Human-like behavioral patterns — randomized delays, mouse movement before clicks, slow scroll.

For tough targets, you need ALL of the above. Spoofing the UA alone is worse than nothing.

Related: Canvas fingerprinting, Browser fingerprinting explained, Top antidetect browsers, Verify your fingerprint.