Device fingerprinting zonder cookies: hoe het werkt
Cookies verdwijnen. Zo biedt device fingerprinting persistente identificatie die het wissen van cookies, incognitomodus en browserupdates overleeft.
De cookie is stervende. Safari's Intelligent Tracking Prevention (ITP) beperkt de levensduur van cookies tot 7 dagen. Firefox' Enhanced Tracking Protection blokkeert third-party cookies volledig. Chrome's Privacy Sandbox schaft third-party cookies af. GDPR-toestemmingsvereisten zorgen ervoor dat gebruikers cookiebanners steeds vaker weigeren.
Voor fraudepreventie is dit een probleem. Als je apparaten niet persistent kunt identificeren, kun je recidivisten niet volgen, multi-accounting niet detecteren en verdachte sessies niet aan elkaar koppelen. Device fingerprinting lost dit op door apparaten te herkennen aan hun technische kenmerken in plaats van aan iets wat de browser moet onthouden.
Om precies te zijn over wat dat in ons geval betekent: Tracio plaatst geen third-party cookies en slaat niets op dat over sites heen werkt. Het plaatst wel één first-party cookie, _vid_t, met een geldigheid van 365 dagen, plus een kopie van dezelfde ondoorzichtige identifier in localStorage. Die cookie is een snelle route, niet het mechanisme — als die aanwezig is, is de match onmiddellijk en zeker; wist de bezoeker die, surft hij in incognitomodus of blokkeert hij opslag volledig, dan wordt de identifier opnieuw opgebouwd uit de apparaatsignalen zelf, met een iets lagere betrouwbaarheid. Het onderscheid doet ertoe: een systeem dat van opslag afhangt, raakt de bezoeker kwijt zodra die opslag wordt gewist, en dit systeem niet.
De signaalcategorieën
Passieve fingerprinting (geen JavaScript vereist)
Nog voordat je pagina wordt geladen, geeft de browser informatie prijs via signalen op netwerkniveau:
TLS-fingerprinting (JA4). Het TLS Client Hello-bericht bevat cipher suites, extensies, elliptische curven en handtekeningalgoritmen. We gebruiken JA4-hashing — een moderne vervanger van JA3 met een fijnere granulariteit.
TCP/IP-stackanalyse. TCP-vensterformaat, TTL-waarden en MSS-instellingen verschillen per besturingssysteem. Linux, Windows en macOS hebben elk hun kenmerkende TCP-stackconfiguraties.
HTTP-headeranalyse. De volgorde van headers, Accept-Language-waarden en verbindingsvoorkeuren verschillen tussen browsers.
Actieve fingerprinting (JavaScript aan de clientzijde)
Canvas-fingerprinting. We tekenen een zorgvuldig ontworpen scène — specifieke tekst, geometrische vormen en gradiënten. Verschillende GPU's renderen dit met subtiele verschillen op pixelniveau door anti-aliasing, sub-pixel-rendering en variaties in kleurmenging. We hashen de pixeldata.
WebGL-fingerprinting. WebGL onthult de vendor/renderer-strings van de GPU, maximale textuurformaten, ondersteunde extensies en shadermogelijkheden. Deze data identificeert het GPU-model en de driverversie sterk.
AudioContext-fingerprinting. We genereren een testsignaal en analyseren hoe het wordt verwerkt. Verschillende audiohardware produceert meetbaar verschillende output door verschillen in floating-pointprecisie.
Font-enumeratie. De beschikbare systeemlettertypen verschillen per besturingssysteem, taalpakket en geïnstalleerde software. We testen op ~300 diagnostische lettertypen met behulp van canvas-meettechnieken.
Navigator-eigenschappen. CPU-cores, apparaatgeheugen, platform, taal, tijdzone, schermresolutie, kleurdiepte, aanwijs- en aanraakmogelijkheden.
Entropie-analyse
Niet alle signalen wegen even zwaar. We meten de entropie van elk signaal:
| Signaalcategorie | Benaderde entropie |
|---|---|
| Canvas + WebGL gecombineerd | ~18 bits |
| Lettertypelijst | ~8 bits |
| AudioContext | ~5 bits |
| Navigator-eigenschappen | ~7 bits |
| TLS-fingerprint | ~6 bits |
| Scherm + weergave | ~4 bits |
| Tijdzone + taal | ~3 bits |
Gecombineerd leveren onze 300+ signalen ongeveer 50+ bits aan entropie op — genoeg om meer dan 1 biljard verschillende apparaten uniek te identificeren.
Van signalen naar een stabiele hash
Het verzamelen van ruwe signalen is slechts de helft van het probleem. Browserupdates wijzigen user-agentstrings. Driverupdates veranderen WebGL-parameters. Het installeren van lettertypen wijzigt de lettertypelijst.
Fuzzy matching
In plaats van exacte overeenkomsten te vereisen, gebruiken we een fuzzy-matching-algoritme dat signalen weegt op stabiliteit en entropie. Stabiele signalen (canvas, GPU-model) wegen zwaarder dan volatiele signalen (user agent, schermresolutie).
Kandidaatgeneratie gebruikt locality-sensitive hashing (LSH) op de meest stabiele signalen om potentiële overeenkomsten te vinden. Overeenkomstscoring berekent een gewogen score over alle signaalcategorieën, gekalibreerd zodat normale apparaatwijzigingen de bezoekers-ID niet veranderen, terwijl daadwerkelijke apparaatwijzigingen dat wel doen.
Dit behaalt 99,5% nauwkeurigheid — het correct herkennen van terugkerende bezoekers na browserupdates, het wissen van cookies, in incognitomodus en bij het wisselen van browser.
Privacybeschermende architectuur
Verwerking aan de serverzijde. Alle fingerprint-berekeningen vinden plaats op onze servers. De agent aan de clientzijde verzamelt ruwe signalen, maar berekent of bewaart de fingerprint-hash niet.
Geen opslag van PII. We bewaren fingerprint-hashes, geen ruwe signalen. De hash is een eenrichtingsfunctie.
Dataresidentie. Data van EU-klanten wordt verwerkt en opgeslagen in datacenters in de EU. GDPR-artikel 6(1)(f) dekt fraudepreventie als gerechtvaardigd belang.
Cross-browser-identificatie
De grootste uitdaging is het identificeren van hetzelfde apparaat in verschillende browsers. We steunen op browseronafhankelijke signalen: GPU-hardware, schermkenmerken, tijdzone, taalinstellingen, geïnstalleerde lettertypen (op OS-niveau) en TCP/IP-stackkenmerken.
De nauwkeurigheid van cross-browser-koppeling is ongeveer 94% — lager dan bij identificatie binnen dezelfde browser, maar voldoende om multi-accounting over meerdere browsers op hetzelfde apparaat te detecteren.
Integratie
Het toevoegen van device fingerprinting kost drie regels code. De agent laadt asynchroon en stuurt de verzamelde signalen naar onze API; de browser ontvangt de bezoekers-ID en het botverdict. De volledige verrijking aan de serverzijde — 35+ Smart Signals — wordt via de webhook-payload en de Data API aan je backend geleverd, zodat het gedetailleerde risicobeeld nooit langs de client gaat, waar het gelezen of gemanipuleerd zou kunnen worden.