Quick Answer

Browser fingerprinting identifies your specific browser by combining dozens of signals — canvas and WebGL rendering quirks, installed fonts, AudioContext output, hardware specs — into one near-unique signature, without ever setting a cookie. Incognito mode only stops local history and cookies from persisting; it doesn't change your GPU, fonts, or audio stack, so the exact same fingerprint gets computed whether you're in a normal or private window.

Tracking You Without Ever Setting a Cookie

Cookie-based tracking works because the server hands your browser a unique ID and asks it to send that ID back on every request. It's trackable, but it's also easy to defeat — clear cookies, use a different browser profile, or block third-party cookies, and the ID is gone. Browser fingerprinting is a completely different mechanism: instead of asking your browser to remember something, it measures dozens of small, mostly-involuntary signals your browser and device already reveal on every page load, combines them, and uses the combination as an identifier. No storage required, nothing to clear.

The signals themselves aren't secret or exotic — they're things like your screen resolution, your installed fonts, your GPU model, your timezone, your browser and OS version, and the exact way your specific hardware and software stack renders certain graphics or audio operations. Individually, most of these signals are shared by thousands or millions of other people (lots of people run Chrome on a 1920x1080 screen). The trick is that fingerprinting combines many weak signals into one strong one — the EFF's foundational research on this (the Panopticlick project, now continued as Cover Your Tracks) measured that the combination carries at least 18.1 bits of entropy, meaning a given fingerprint is, on average, shared by only about 1 in 286,777 other browsers tested. In that same study, 83.6% of browsers tested had a fingerprint unique enough to be individually identifiable, rising to 94.2% once browser plugin data was included.

Canvas Fingerprinting: Making Your GPU Rat You Out

Canvas fingerprinting is the single highest-value technique in most commercial fingerprinting scripts, carrying roughly 5 to 10 bits of entropy on its own depending on the measurement. The mechanism: a script creates an invisible HTML5 <canvas> element, draws some specific text or shapes onto it (often a deliberately unusual string with emoji, special characters, and various font sizes), then reads the resulting image back out as raw pixel data using canvas.toDataURL() or getImageData(), and hashes that pixel data into a short string.

Why does this work as an identifier at all? Because "drawing text" isn't actually a deterministic operation across machines. The exact pixels that come out depend on your GPU model and driver, your operating system's font rendering engine (ClearType on Windows behaves differently from macOS's font rasterizer), anti-aliasing settings, and even floating-point rounding differences in the graphics pipeline. Two people running the identical browser version on identical operating systems can still produce subtly different pixel-level output if their underlying graphics hardware differs. The script never needs to know why the pixels differ — it just hashes whatever comes out and uses that hash as a stable per-device signature. WebGL fingerprinting is the same idea applied to 3D rendering instead of 2D canvas text: render a specific 3D scene, read back the pixels, hash them, and the GPU/driver-specific rendering quirks do the identifying work.

Fonts, AudioContext, and the Rest of the Signal Stack

Canvas and WebGL are the highest-entropy individual signals, but real fingerprinting scripts stack many more on top:

  • Font enumeration: the script measures the rendered width and height of text strings in dozens of font names. If a font isn't installed, the browser silently substitutes a default, and the measured dimensions reveal which fonts are actually present. Your installed font list is a strong signal because it reflects software you've installed (Adobe products, regional language packs, design tools) that most other people haven't.
  • AudioContext fingerprinting: the script generates an audio signal (often through an OscillatorNode) entirely in software, processes it through the browser's audio pipeline, and reads back the resulting waveform. Like canvas rendering, the exact floating-point output varies subtly by hardware, OS audio stack, and browser audio implementation, producing yet another stable per-device hash without ever playing an audible sound.
  • Hardware and environment signals: screen resolution and color depth, number of logical CPU cores (navigator.hardwareConcurrency), device memory, timezone, installed browser plugins, and the precise set of HTTP headers and their ordering. None of these alone identify you, but a script collecting 20+ of them is accumulating entropy from every single one.

None of this requires special permissions or looks like malware — every one of these APIs exists for legitimate reasons (canvas for drawing, AudioContext for web audio, font measurement for layout). Fingerprinting is a side-channel use of ordinary web platform features, which is exactly what makes it hard to block without breaking real functionality.

Why Incognito Mode Doesn't Stop Any of This

Private/incognito browsing modes were built to solve a specific, different problem: preventing your browsing history, cookies, and local storage from persisting on the device after you close the window, so the next person using the same computer can't see where you've been. That's a storage problem, and incognito solves it by not writing that storage to disk (or clearing it on close).

Fingerprinting doesn't depend on storage at all — it depends on measuring your actual hardware and software environment fresh, on every page load. Opening an incognito window doesn't change your GPU, doesn't change which fonts your OS has installed, doesn't change how your audio stack processes an oscillator signal, and doesn't change your screen resolution. All of the signals a fingerprinting script reads are properties of the real device running the browser, and incognito mode has no mechanism to alter any of them. A site running a fingerprinting script against you in a normal window and against you in an incognito window will, in the large majority of cases, compute the same or a near-identical fingerprint both times — which is precisely the gap between what people assume incognito does ("stop tracking") and what it actually does ("don't save local history").

This is also why fingerprinting is considered a more durable tracking mechanism than cookies from the tracker's perspective: clearing cookies, using a VPN to change your IP, or switching to a private window all leave the underlying device fingerprint completely untouched, because none of those actions touch hardware rendering behavior, installed fonts, or audio pipeline characteristics.

What Actually Makes a Dent in This

Since the problem is entropy accumulation across many signals, the only real defenses either reduce how many distinguishing signals you expose, or make large numbers of unrelated users look identical to each other (reducing the uniqueness of any one fingerprint rather than hiding it):

  • Standardizing rendering: browsers like Tor Browser deliberately make canvas and WebGL readback return a uniform, non-distinguishing result (or prompt the user before allowing a script to read canvas pixel data at all), specifically because this is the highest-entropy channel.
  • Font restriction: limiting the set of fonts a page can detect, rather than exposing your full real font list, directly cuts one of the stronger signals.
  • Reducing signal precision: some privacy-focused browsers round or quantize values like device memory and hardware concurrency rather than reporting exact figures, trading a small amount of legitimate functionality for a less precise fingerprint.
  • Blending into a large anonymity set: using a very common, unmodified browser/OS/screen-resolution combination makes your individual contribution to entropy lower, because more other people share each of your individual signal values. Paradoxically, a heavily customized "privacy-hardened" browser with unusual settings can sometimes stand out more, not less, if the customization itself becomes a distinguishing signal.

None of these fully eliminate fingerprinting; they reduce the entropy available to it. That's a meaningfully different, more realistic claim than "blocks fingerprinting," and it's the same honest framing the EFF's own Cover Your Tracks tool uses when it reports your fingerprint's uniqueness as a probability rather than a binary safe/unsafe result.

Frequently Asked Questions

Does clearing cookies remove my browser fingerprint? No. Cookies are storage the server asks your browser to keep; a fingerprint is recalculated fresh from your hardware and software signals on every visit, so clearing cookies has no effect on it.
Can a VPN prevent browser fingerprinting? A VPN changes your IP address and apparent location, but it does nothing to your GPU rendering behavior, installed fonts, screen resolution, or audio stack, which are the actual signals fingerprinting measures.
Is browser fingerprinting the same thing as the bot-detection scoring reCAPTCHA uses? No, they're different mechanisms with different goals. Fingerprinting identifies and tracks a specific browser across visits using passive hardware/software signals; reCAPTCHA-style bot detection scores behavior (mouse movement, interaction timing) to decide if a session is human, though some bot-detection systems do use fingerprinting as one input signal among many.
Is browser fingerprinting illegal? It depends on jurisdiction and use case. Regulations like GDPR generally treat device fingerprinting as requiring the same kind of consent as cookies when used for tracking, since it serves the same purpose, but enforcement and exact legal treatment vary by region.
Why does canvas fingerprinting work if I'm not running any unusual software? It doesn't rely on unusual software — it relies on your specific GPU, GPU driver, and OS font rasterizer producing subtly different pixel output when rendering the same text or shapes, which happens even on completely standard, unmodified systems.