Het identificatiesysteem van TRACIO genereert een stabiele bezoekersidentificatie uit meer dan 130 browsersignalen. De identificatie blijft behouden over sessies, incognitomodus, VPN-wijzigingen en het wissen van cookies heen. Deze pagina legt de volledige identificatiepijplijn uit.
De client verzamelt meer dan 130 verschillende browsersignalen verdeeld over 10 categorieën. Elk signaal onderzoekt een ander aspect van de browser en het apparaat, van hardwarekenmerken tot renderinggedrag.
| Groep | Signalen | Stabiliteit | Voorbeelden |
|---|---|---|---|
| Hardware | 12 | Zeer hoog | Schermresolutie, apparaatgeheugen, hardware-parallellisme, touch-ondersteuning |
| Rendering | 9 | Hoog | Canvas-fingerprint (tekst + geometrie), WebGL-renderer, audioverwerking |
| Lettertypen | 5 | Hoog | Beschikbare systeemlettertypen (69 families getest), letterinstellingen, MathML-rendering |
| Platform | 25 | Gemiddeld | User-Agent, navigator-eigenschappen, tijdzone, taal, leverancier |
| CSS-engine | 10 | Gemiddeld | Media-query-antwoorden (kleurenschema, HDR, gereduceerde beweging, geforceerde kleuren) |
| Opslag | 10 | Gemiddeld | Cookie-ondersteuning, localStorage, sessionStorage, opslagquotum |
| WebGL | 9 | Hoog | GPU-leverancier, renderer (ongemaskeerd), shader-precisie, extensie-ondersteuning |
| Netwerk | 3 | Laag | Verbindings-RTT, TURN-probe, app-versie |
| Bot-indicatoren | 15 | N.v.t. | Webdriver-vlag, automatiseringsframeworks, eval-lengte, headless-markeringen |
| Aangepast | 14 | Wisselend | Math-fingerprint, WASM-functies, architectuurdetectie |
Niet alle signalen zijn even nuttig voor identificatie. Signalen worden geclassificeerd op basis van stabiliteit:
Niveau 1 (Bevroren): Hardware- en renderingsignalen die bijna nooit veranderen. Canvas-fingerprint, WebGL-renderer, audio-fingerprint, GPU-parameters, letterenumeratie, wiskundige bewerkingen, architectuurbyte.
Niveau 2 (Semi-stabiel): Signalen die veranderen bij browserupdates of configuratiewijzigingen. User-Agent, Client Hints, plug-ins, CSS-media-queries, opslagmogelijkheden.
Niveau 3 (Vluchtig): Signalen die frequent veranderen. Schermresolutie (monitorwijzigingen), tijdzone (reizen), taalvoorkeuren, verbindingseigenschappen.
De bezoekers-ID wordt berekend met een driegelaagd hashingsysteem dat stabiliteit en uitbreidbaarheid in balans brengt:
Visitor ID = [Tier1Hash][Tier2Hash][Tier3Hash] 20 chars 10 chars 10 chars ──────── ──────── ──────── base62 base62 base62Niveau 1 gebruikt uitsluitend bevroren signalen die inherent zijn aan de hardware en de rendering-engine. Deze signalen veranderen alleen wanneer de gebruiker overstapt naar een ander fysiek apparaat of ingrijpende hardwarewijzigingen aanbrengt.
Opgenomen signalen: Canvas-fingerprint-hash, WebGL-renderer (ongemaskeerd), WebGL-leverancier (ongemaskeerd), audio-fingerprint, letterenumeratie-hash, WebGL-parameter-hash, hash van wiskundige bewerkingen, architectuurbyte (ARM vs. x86).
Algoritme:
key1=value1|key2=value2|... (sleutels alfabetisch gesorteerd)Niveau 1 is bewust bevroren. Er worden nooit nieuwe signalen aan niveau 1 toegevoegd, zodat de identiteitskern stabiel blijft over serverupdates heen.
Niveau 2 legt de browser- en OS-omgeving vast. Deze signalen veranderen wanneer de gebruiker zijn browser bijwerkt, extensies installeert of systeeminstellingen wijzigt.
Opgenomen signalen: User-Agent-gegevens, Client Hints (merken, platform, architectuur), navigator-eigenschappen (leverancier, platform, talen), plug-inlijst, kleurdiepte van het scherm, apparaatgeheugen, hardware-parallellisme.
Niveau 3 legt vluchtige signalen vast die tussen sessies kunnen veranderen. Ze worden gebruikt voor betrouwbaarheidsscoring en fuzzy matching, maar hebben geen invloed op de kernidentiteit.
Opgenomen signalen: Schermresolutie, tijdzone, taal, DOM-blockers, opslagmogelijkheden, CSS-media-query-antwoorden, verbindingseigenschappen.
Elk niveau wordt gehasht met MurmurHash3-x64-128, een snelle, niet-cryptografische hashfunctie die een 128-bits uitvoer produceert. Het algoritme:
MurmurHash3 biedt een uitstekende verdeling (elke bit van de invoer beïnvloedt elke bit van de uitvoer) en is snel genoeg voor realtime berekening. Het is niet cryptografisch veilig, maar dat is voor het hashen van fingerprints ook niet vereist.
Input: "canvas=abc123|webgl_renderer=ANGLE|audio=0.04852" ↓ MurmurHash3-x64-128Output: 0x7f4a8c2d1e3b5f6a 0x9d8c7b6a5e4f3d2c ↓ base62 encodeResult: "X7fh2Hg9LkMn3pQr5tBv"De betrouwbaarheidsscore (0.0 tot 1.0) geeft aan hoe zeker het systeem is over de bezoekersidentificatie:
Wanneer de cookie _vid_t overeenkomt met een bekende bezoeker, wordt de betrouwbaarheid op 1.0 gezet. De cookie bevat de UID van de bezoeker, die de server valideert aan de hand van zijn records. Dit is het snelste en meest betrouwbare identificatiepad.
Nieuwe bezoekers zonder eerdere record krijgen een betrouwbaarheidsscore van 0.90. Er bestaat geen risico op een onterechte overeenkomst, omdat er geen bestaande records zijn om mee te vergelijken.
Voor terugkerende bezoekers zonder cookie-overeenkomst berekent het systeem de betrouwbaarheid op basis van:
Weging op signaalfrequentie (IDF): Signalen die unieker zijn binnen de wereldwijde populatie krijgen een hoger gewicht. Een zeldzame WebGL-renderer is identificerender dan een veelvoorkomende schermresolutie.
Fuzzy matching: Het systeem vergelijkt de huidige fingerprint met opgeslagen fingerprints aan de hand van de Hamming-afstand op bitniveau. Signalen worden per niveau gegroepeerd en de overeenkomstscore van elk niveau wordt onafhankelijk gewogen.
Historische consistentie: Als de signalen van een bezoeker over meerdere bezoeken stabiel zijn geweest, neemt de betrouwbaarheid toe. Als de signalen frequent fluctueren, neemt de betrouwbaarheid af.
| Scenario | Typische score | Toelichting |
|---|---|---|
| Cookie-overeenkomst | 1.000 | UID van cookie _vid_t serverzijdig geverifieerd |
| Eerste bezoek | 0.900 | Geen eerdere records om mee te vergelijken |
| Sterke fingerprint-overeenkomst | 0.990-0.999 | Alle niveau 1-signalen komen overeen, de meeste niveau 2 |
| Gedeeltelijke overeenkomst (browserupdate) | 0.950-0.989 | Niveau 1 komt overeen, niveau 2 gewijzigd (nieuwe UA) |
| Zwakke overeenkomst (ingrijpende wijzigingen) | 0.850-0.949 | Sommige niveau 1-signalen zijn gewijzigd |
| Dubbelzinnig | 0.500-0.849 | Meerdere mogelijke overeenkomsten in de database |
TRACIO gebruikt een first-party cookie (_vid_t) om de bezoekersidentiteit over sessies heen te behouden:
_vid_tSameSite=Lax en Secure op HTTPS (niet HttpOnly — de agent leest het aan de clientzijde)De cookie wordt zowel serverzijdig (via de Set-Cookie response-header) als aan de clientzijde door de agent uitgegeven, en de UID wordt daarnaast als fallback naar localStorage gespiegeld voor het geval cookies geblokkeerd zijn.
De server probeert de cookie op steeds bredere domeinbereiken in te stellen:
app.example.com → example.com → comHet breedste domein waarop de cookie succesvol wordt ingesteld, wordt gebruikt. Zo blijft de cookie over subdomeinen heen behouden.
TRACIO kan dezelfde persoon over verschillende browsers op hetzelfde apparaat identificeren wanneer de niveau 1-signalen overeenkomende hashes produceren. Omdat niveau 1 berust op hardware- en renderingkenmerken (canvas, WebGL, audio, lettertypen), zijn deze signalen vaak identiek bij Chromium-gebaseerde browsers op dezelfde machine en verminderen ze over verschillende engines heen (Chromium vs. Firefox vs. Safari). Het koppelen van een desktopbezoeker aan een mobiele bezoeker is niet te verwachten — de hardware- en renderingoppervlakken verschillen.
Browseroverschrijdende matching is inherent een operatie met lagere betrouwbaarheid en wordt bij de scoring als zodanig behandeld.