TRACIO היא מערכת זיהוי מסוג לקוח-שרת. הלקוח אוסף אותות מהדפדפן ושולח אותם לשרת, אשר מחשב מזהה מבקר יציב, מריץ אלגוריתמי זיהוי ומחזיר תוצאות מועשרות. פרק זה מסביר כל שלב של הצינור (pipeline).
Browser TRACIO Cloud | | |-- Tracio.init({ publicKey }) ---------> | (init, no network) | | |-- tracio.getResult() ----------------> | | 1. Collect 130+ 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() נקרא, הלקוח אוסף 130+ אותות דפדפן ייחודיים המאורגנים בשכבות (tiers). האיסוף משתמש בצינור רב-שלבי עם Web Workers ו-iframes משותפים לשם ביצועים.
| קטגוריה | מספר אותות | דוגמאות |
|---|---|---|
| Canvas & WebGL | 9 | טביעת אצבע של Canvas, WebGL renderer, פרמטרי WebGL, WebGPU |
| Audio | 3 | טביעת אצבע של AudioContext, base latency, תזמון DRM |
| גופנים ורינדור | 10 | זיהוי גופנים, העדפות גופנים, MathML, רינדור אמוג'י |
| Navigator ופלטפורמה | 25 | User-Agent, שפות, מסך, hardware concurrency, אזור זמן |
| Storage & Cookies | 10 | localStorage, sessionStorage, cookies, מכסת אחסון |
| CSS & Media Queries | 10 | סכמת צבעים, HDR, reduced motion, forced colors |
| רשת ו-WebRTC | 3 | בדיקת TURN, RTT של החיבור, גרסת אפליקציה |
| Bot Detection | 15 | דגל Webdriver, מסגרות אוטומציה, אורך eval |
| Tamper Detection | 8 | אינטרוספקציה של property getter, שרשראות prototype, שלמות פונקציה מקורית |
| Custom Extensions | 14 | טביעת אצבע מתמטית, זיהוי ארכיטקטורה, יכולות WASM |
צינור האיסוף רץ בארבעה שלבים כדי למזער את חסימת ה-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 תואם, הביטחון הוא מקסימלי.מנוע זיהוי הבוטים מריץ מספר גלאים שהפלטים המשוקללים שלהם משולבים לכדי ציון בוט (ספים: bot ≥ 0.70, suspicious ≥ 0.30; אות כשל קשיח (hard-fail) כופה הכרעת בוט). בין הגלאים התורמים:
אותות העשרה בצד השרת מחושבים מנתוני האותות הגולמיים וממודיעין ה-IP. אלה כוללים זיהוי VPN/proxy/Tor, מיקום גיאוגרפי לפי IP, ניתוח שיבוש (tampering) דפדפן, וציון חשד (suspect scoring).
תת-מערכת מודיעין ה-IP מספקת:
השרת מחזיר תגובת JSON המכילה:
{ "visitorId": "X7fh2Hg9LkMn3pQr", "bot": { "detected": false, "confidence": 2, "reasons": [] }}זו התוצאה ש-tracio.getResult() נפתר אליה בדפדפן. האירוע
המלא והמועשר — כולל ה-bot_result הקנוני
(human / bot / uncertain), המיקום הגיאוגרפי וה-smart signals — נמסר
בצד השרת דרך webhooks ומוצג
בלוח הבקרה.
הלקוח מאחסן אסימון מבקר גם ב-cookie מקורי (first-party, תוקף 365 יום, SameSite=Lax) וגם ב-localStorage לשם התמדה בין הפעלות (sessions).
| שלב | מיקום | משך | תיאור |
|---|---|---|---|
| 1 | Browser | ~5ms | אתחול הסוכן, יצירת iframe משותף |
| 2 | Browser | ~50-150ms | איסוף 130+ אותות (מקבילי, רב-שלבי) |
| 3 | Browser | ~5ms | הצפנה ודחיסה של המטען |
| 4 | Network | ~10-50ms | POST לשרת |
| 5 | Server | ~5-20ms | פענוח, חילוץ אותות, חישוב מזהה מבקר |
| 6 | Server | ~5-15ms | הרצת זיהוי בוטים ו-smart signals |
| 7 | Server | ~5ms | בניית התגובה |
| 8 | Network | ~10-50ms | החזרת תגובת JSON |
| 9 | Browser | ~1ms | אחסון cookie המבקר |
סך זמן הלוך-ושוב (round-trip): בדרך כלל 80-300ms, בהתאם לתנאי הרשת וליכולות הדפדפן.