איך מעקב אחר טביעת רגל דיגיטלית עובד מאחורי הקלעים
מלחיצות ידיים של TLS ועד רינדור canvas — כך אנחנו משחזרים את טביעת הרגל הדיגיטלית של מכשיר בעזרת יותר מ-130 אותות פסיביים, בלי עוגיות ובלי אחסון.
כל מכשיר שמתחבר לאינטרנט מותיר אחריו שובל של עקבות טכניות — טביעת רגל דיגיטלית. ב-tracio.ai אנחנו משחזרים את טביעת הרגל הזו מתוך יותר מ-130 אותות פסיביים הנאספים במהלך טעינת עמוד יחידה, בלי להסתמך על עוגיות, localStorage או כל צורה של אחסון מתמשך בצד הלקוח. מאמר זה מסביר בדיוק כיצד התהליך הזה עובד.
שכבת איסוף האותות
כאשר סוכן ה-JavaScript שלנו נטען בדפדפן של המבקר, הוא מתחיל לאסוף אותות על פני מספר קטגוריות בו-זמנית. רינדור canvas, שאילתות פרמטרים של WebGL, עיבוד AudioContext, מניית גופנים וקריאת מאפייני navigator — כולם רצים במקביל. כל תהליך האיסוף מסתיים בפחות מ-50 מילישניות על חומרה מודרנית.
התובנה המרכזית היא שכל אות לוכד היבט שונה של מחסנית החומרה והתוכנה של המכשיר. רינדור canvas משקף את ה-GPU, מנהל ההתקן ומנוע רינדור הגופנים. פרמטרים של WebGL חושפים את דגם כרטיס המסך ואת יכולותיו. AudioContext חושף הבדלים באופן שבו ה-DSP של האודיו מעבד פעולות נקודה צפה. מאפייני navigator מדווחים על ליבות מעבד, זיכרון, פלטפורמה והגדרות שפה.
הצוות שלנו מדד זאת על פני 2 מיליארד אירועים בחודש שעבר: זמן האיסוף החציוני היה 38ms, ואחוזון 99 היה 52ms. למעשה ניסינו קודם את הגישה הנאיבית — איסוף אותות באופן סדרתי. זה היה איטי פי 40. איסוף מקבילי עם גדר timeout היה אחת מהחלטות הארכיטקטורה הראשונות שקלענו בהן.
טביעת אצבע של TLS: השכבה הראשונה
עוד לפני שה-JavaScript שלנו בכלל מתבצע, הדפדפן כבר חשף מידע משמעותי דרך לחיצת היד של TLS. הודעת ה-Client Hello מכילה את חבילות הצפנים שהדפדפן תומך בהן, את הרחבות ה-TLS שהוא משתמש בהן, את העקומים האליפטיים שהוא מעדיף ואת אלגוריתמי החתימה שהוא מקבל. מידע זה נקבע על ידי ספריית ה-TLS של הדפדפן ומשתנה באופן משמעותי בין משפחות דפדפנים, גרסאות ומערכות הפעלה.
אנחנו לוכדים את טביעת האצבע הזו של TLS בעזרת גיבוב JA4 — תחליף מודרני ל-JA3 המספק רזולוציה טובה יותר ויציבות חוצת-גרסאות. גיבוב ה-JA4 לבדו יכול להבחין בין Chrome ל-Firefox ל-Safari, ולעיתים קרובות מצמצם את הזיהוי לטווח גרסאות ספציפי של דפדפן. בשילוב עם האותות שלנו בצד הלקוח, הוא מספק שכבת אימות-צולב שקשה מאוד לזייף.
טביעת אצבע של Canvas ו-GPU
טביעת אצבע של canvas מנצלת את העובדה שכרטיסי GPU שונים מרנדרים את אותן הוראות ציור עם הבדלים דקים ברמת הפיקסל. Canvas API מאפשר לנו לצייר סצנה שתוכננה בקפידה — מחרוזות טקסט ספציפיות במספר גופנים, צורות גיאומטריות עם קואורדינטות מסוימות, ומעברי צבע עם נקודות עצירה מדויקות — ואז לחשב גיבוב של נתוני הפיקסלים המתקבלים.
הבדלי הרינדור נובעים מווריאציות באלגוריתמי החלקת שוליים (anti-aliasing), רינדור תת-פיקסלי, מיזוג צבעים ו-hinting של גופנים בין דגמי GPU וגרסאות מנהל התקן. אפילו שני מכשירים עם אותו דגם GPU עשויים להפיק פלטי canvas שונים אם הם מריצים גרסאות שונות של מנהל התקן או מערכות הפעלה. הדבר הופך את גיבוב ה-canvas לאחד האותות המובחנים ביותר שלנו.
פרופיל חומרה של WebGL
WebGL API
חושף מידע מפורט על תת-מערכת הגרפיקה, הרבה מעבר למחרוזות ה-renderer וה-vendor. אנחנו מבצעים שאילתות על גדלי מרקם מרביים, פורמטים של דיוק shader, הרחבות נתמכות, מימדי viewport ועשרות פרמטרים נוספים המשתנים בין דגמי GPU ותצורות מנהל התקן.
השילוב של הפרמטרים הללו יוצר פרופיל חומרה מפורט. מכשיר עם NVIDIA RTX 4070, למשל, ידווח על גדלי מרקם מרביים שונים, דיוק shader שונה ותמיכה בהרחבות שונה ממכשיר עם AMD RX 7800 XT. פרופיל חומרה זה יציב מטבעו — הוא אינו משתנה עם עדכוני דפדפן, אלא רק עם שינויי חומרה או מנהל התקן.
טביעת אצבע של עיבוד אודיו
ה-Web Audio API מספק מקור אות נוסף התלוי בחומרה. אנחנו יוצרים צומת oscillator, מחברים אותו ל-dynamics compressor ומודדים את מאגר הפלט. הבדלים בדיוק נקודה צפה, במימוש ה-DSP ובאלגוריתמי דגימה מחדש בין חומרות אודיו ומערכות הפעלה מפיקים וריאציות מדידות בפלט.
לטביעות אצבע של אודיו יש ייחודיות בינונית אך יציבות יוצאת דופן. צינור עיבוד האודיו כמעט אינו משתנה אלא אם המשתמש מחליף חומרת אודיו או מתקין מחדש את מערכת ההפעלה. הדבר הופך את אותות האודיו לעוגנים בעלי ערך במערכת הזיהוי הרב-שכבתית שלנו.
מיזוג אותות ופתרון זהות
האותות הגולמיים מוצפנים ומשודרים לשרת שלנו, שם מנוע זיהוי המכשיר מעבד אותם דרך מערכת גיבוב תלת-שכבתית. אותות ברמת החומרה (canvas, WebGL, audio) מרכיבים את Tier 1 — ליבת הזהות היציבה. אותות ברמת הדפדפן (זיהוי תכונות, מאפייני CSS, יכולות מדיה) מרכיבים את Tier 2, המעובד דרך התאמה חוצת-הפעלות כדי להתמודד עם סחיפה צפויה מעדכוני דפדפן. אותות תנודתיים (user agent, אזור זמן, שפה) מרכיבים את Tier 3, ותורמים לניקוד הביטחון בלי להכתיב את החלטות הזהות.
אלגוריתם המיזוג משקלל כל אות לפי ייחודיותו ויציבותו. התאמה על גיבוב canvas נדיר נושאת משקל רב בהרבה מהתאמה על רזולוציית מסך נפוצה. גישה משוקללת זו מבטיחה שהזיהוי נשאר מדויק גם כאשר תת-קבוצה של אותות משתנה.
בלי אחסון, בלי עוגיות
עיקרון עיצוב קריטי במערכת שלנו הוא שהזיהוי אינו תלוי בשום צורה של אחסון בצד הלקוח. איננו מציבים עוגיות, איננו כותבים ל-localStorage ואיננו משתמשים ב-IndexedDB למטרות מעקב. מזהה המבקר נגזר כולו מהמאפיינים המובנים של המכשיר — החומרה, מחסנית התוכנה, תצורת הרשת. משמעות הדבר היא שהזיהוי שורד ניקוי עוגיות, מצב גלישה בסתר ואפילו התקנה מחדש של הדפדפן.
פרטיות מעצם הארכיטקטורה
מכיוון שאנחנו אוספים רק מאפיינים טכניים של הדפדפן — בלי היסטוריית גלישה, בלי נתוני טפסים ובלי תוכן אישי — ההשפעה על הפרטיות מזערית. הנחיות W3C לטביעות אצבע מתוות שיטות עבודה מיטביות לשימוש אחראי באותות דפדפן, והארכיטקטורה שלנו מתיישרת עם עקרונות אלה. עם פריסה מבוססת ענן, כל העיבוד מתרחש על התשתית שלכם. שום נתוני מבקר אינם מגיעים לעולם לשרתים שלנו. ארכיטקטורה זו הופכת את העמידה ב-GDPR, ב-CCPA ובתקנות פרטיות אחרות לפשוטה.