TRACIO היא מערכת זיהוי מסוג לקוח-שרת. הלקוח אוסף אותות מהדפדפן ושולח אותם לשרת, אשר מחשב מזהה מבקר יציב, מריץ אלגוריתמי זיהוי ומחזיר תוצאות מועשרות. פרק זה מסביר כל שלב של הצינור (pipeline).
Browser TRACIO Cloud | | |-- Tracio.init({ publicKey }) ---------> | (init, no network) | | |-- tracio.getResult() ----------------> | | 1. Collect 300+ browser signals | | 2. Encrypt (XOR + deflate + B64) | | 3. POST to ingress endpoint | | | | |-- Decrypt & extract signals | |-- Compute visitor ID (MurmurHash3-128) | |-- Run bot detection (weighted scoring) | |-- Run smart signals (server-side enrichment) | |-- Run IP intelligence (VPN/proxy/Tor) | |-- Store visit event | | |<-- JSON response ------------------- | | visitorId, confidence, | | bot detection, smart signals | | | |-- Store visitor cookie (_vid_t) -----> | (365-day persistence)כאשר tracio.getResult() נקרא, הלקוח אוסף 300+ אותות דפדפן ייחודיים המאורגנים בשכבות (tiers). האיסוף משתמש בצינור רב-שלבי עם Web Workers ו-iframes משותפים לשם ביצועים.
הסוכן כולל 300+ אותות ב-15 קטגוריות:
| קטגוריה | מספר אותות | קטגוריה | מספר אותות |
|---|---|---|---|
| Tamper | 82 | Fonts | 15 |
| Navigator | 72 | Network | 15 |
| Bot | 32 | Persistence | 14 |
| Canvas | 26 | Intl | 13 |
| CSS | 19 | Audio | 12 |
| Privacy | 17 | Storage | 12 |
| Crypto | 16 | Behavioral | 5 |
| Display | 15 |
Canvas מכסה גם את WebGL ואת WebGPU לצד רינדור דו-ממדי; Tamper היא הקטגוריה הגדולה ביותר משום שזיהוי סביבה ששונתה דורש יותר בדיקות מאשר קריאה של סביבה שלא נגעו בה.
צינור האיסוף רץ בארבעה שלבים כדי למזער את חסימת ה-main thread:
שלב 1 (מיידי): אותות בעדיפות גבוהה שמהירים לאיסוף (מאפייני navigator, מסך, אזור זמן). בדיקת ה-TURN מתחילה גם היא כאן, מכיוון שהיא רצה במקביל.
שלב 2 (Idle Callback): אותות סינכרוניים שנהנים מתקופת חוסר פעילות (CSS media queries, בדיקות אחסון, בדיקות cookie).
שלב 3 (אסינכרוני): אותות הדורשים ממשקי API אסינכרוניים או רינדור (canvas, WebGL, טביעת אצבע של audio, זיהוי גופנים, רינדור אמוג'י).
Web Worker: איסוף אותות מבודד ב-thread ייעודי (זיהוי יכולות WASM, doNotTrack).
iframe נסתר משותף נוצר פעם אחת ומשמש שוב על ידי אספנים מרובים (אמוג'י, MathML, צבעי מערכת, גופנים, מסגרת מסך) כדי להימנע מהתקורה של יצירת iframes נפרדים לכל אות.
כל אות עוקב אחר מבנה עקבי:
interface Signal<T> { s: number // Status code v: T // Value (when successful)}קודי סטטוס:
| Code | משמעות |
|---|---|
0 | הצלחה |
-1 | לא זמין (מאפיין undefined) |
-2 | בדיקה משנית נכשלה |
-3 | התנהגות בלתי צפויה |
-4 | Timeout |
-5 | מושבת |
-6 | נחסם על ידי CSP |
-7 | שגיאת אבטחה |
האותות שנאספו מסודרים ל-JSON, ואז מוצפנים ונדחסים לפני השידור:
סריאליזציה ל-JSON: כל ערכי האותות נארזים לאובייקט JSON ממופתח לפי אות, בתוספת שדות מטא-נתונים (c עבור מפתח ה-API, t עבור התג, lid עבור ה-linked ID).
דחיסה: אם המטען (payload) חורג מ-1024 בתים, הוא נדחס באמצעות CompressionStream("deflate-raw").
הצפנת XOR: המטען עטוף במעטפת הצפנה:
קידוד Base64: המטען המוצפן מקודד ב-Base64url ונשלח כגוף בקשת ה-POST.
הבקשה נשלחת לנקודת הקצה של ה-ingress עם פרמטרי query עבור גרסת הלקוח ומפתח ה-API. אישורי CORS נכללים כדי לשלוח cookies מקוריים (first-party).
השרת מקבל את המטען המוצפן ומעבד אותו דרך מספר תת-מערכות:
השרת מפענח את מעטפת ה-XOR, מבצע דחיסה חוזרת (decompress) במידת הצורך, ומנתח את נתוני אותות ה-JSON. קוד הסטטוס והערך של כל אות מחולצים ומאומתים.
מזהה המבקר מחושב באמצעות גישת hashing מדורג (V3):
Tier 1 (Frozen): 20 base62 characters - Stable hardware signals that rarely change - Canvas, WebGL renderer, audio fingerprint, fonts - Provides long-term visitor identity
Tier 2 (Semi-stable): 10 base62 characters - Signals that change with browser updates - User-Agent data, Client Hints, plugins - Extensible without breaking Tier 1
Tier 3 (Volatile): 10 base62 characters - Signals that change frequently - Screen resolution, timezone, language - Used for confidence scoring, not identityכל שכבה מחלצת את האותות המיועדים לה, בונה מחרוזת קנונית ומבצעת עליה hash באמצעות MurmurHash3-x64-128. שלושת ה-hashes של השכבות משורשרים ומקודדים ב-base62 כדי לייצר את מזהה המבקר הסופי.
ציון הביטחון (0.0 עד 1.0) מציין עד כמה המערכת בטוחה שמבקר זה זוהה כראוי:
_vid_t תואם למבקר מוכר, הביטחון הוא מקסימלי.מנוע זיהוי הבוטים מריץ מספר גלאים ומשלב את הפלטים המשוקללים שלהם לכדי ציון בוט; אות כשל קשיח (hard-fail) כופה הכרעת בוט בפני עצמו. הערך הפומבי bot.score הוא בסולם 0..100, וההכרעה מגיעה אליך כ-bot.result. הספים המדויקים אינם מתפרסמים — סף שאפשר לקרוא הוא סף שאפשר להתכייל אליו. בין הגלאים התורמים:
גלאי אינסטרומנטציה (Frida), root/jailbreak ואפליקציות משוכפלות אכן קיימים בפלטפורמה, אך חריצי הקלט שלהם נייטיביים בלבד — הסוכן בדפדפן אינו אוסף אותם, ולכן הם אינם משתתפים בהכרעה בווב. ראו זיהוי בוטים לגבי מה שפעיל במלואו בווב.
אותות העשרה בצד השרת מחושבים מנתוני האותות הגולמיים וממודיעין ה-IP. אלה כוללים זיהוי VPN/proxy/Tor, מיקום גיאוגרפי לפי IP, ניתוח שיבוש (tampering) דפדפן, וציון חשד (suspect scoring).
תת-מערכת מודיעין ה-IP מספקת:
השרת מחזיר תגובת JSON המכילה:
{ "visitorId": "X7fh2Hg9LkMn3pQr5tBvQw3xZa9mK2pL4nR8dT6y", "bot": { "detected": false, "confidence": 2, "reasons": [] }}זו התוצאה ש-tracio.getResult() נפתר אליה בדפדפן. האירוע
המלא והמועשר — כולל ה-bot_result הקנוני
(human / bot / uncertain), המיקום הגיאוגרפי וה-smart signals — נמסר
בצד השרת דרך webhooks, ניתן לקריאה דרך
Data API ומוצג בלוח הבקרה.
הלקוח מאחסן אסימון מבקר גם ב-cookie מקורי (first-party, תוקף 365 יום, SameSite=Lax) וגם ב-localStorage לשם התמדה בין הפעלות (sessions).
| שלב | מיקום | תיאור |
|---|---|---|
| 1 | Browser | אתחול הסוכן, יצירת iframe משותף |
| 2 | Browser | איסוף 300+ אותות (מקבילי, רב-שלבי) |
| 3 | Browser | הצפנה ודחיסה של המטען |
| 4 | Network | POST לשרת |
| 5 | Server | פענוח, חילוץ אותות, חישוב מזהה מבקר |
| 6 | Server | הרצת זיהוי בוטים ו-smart signals |
| 7 | Server | בניית התגובה |
| 8 | Network | החזרת תגובת JSON |
| 9 | Browser | אחסון cookie המבקר |
סך זמן הלוך-ושוב (round-trip): אלפיות שנייה. את רובו תופס איסוף האותות — מעברי הרשת והעבודה בצד השרת הם החלק הקטן יותר — והוא משתנה בהתאם למכשיר ולחיבור של המבקר. שום דבר מכל זה אינו חוסם את רינדור הדף: הסוכן נטען באופן אסינכרוני, וכל בדיקה שעלולה להתארך מוגבלת בזמן קצוב משלה.