שיפור פרטיות המשתמשים וחוויית המפתחים באמצעות User-Agent Client Hints

התכונה User-Agent Client Hints היא הרחבה חדשה ל-Client Hints API, והיא מאפשרת למפתחים לגשת למידע על הדפדפן של המשתמש בצורה ארגונומית ושומרת על הפרטיות.

טיפים לגבי לקוחות מאפשרים למפתחים לבקש באופן פעיל מידע על המכשיר או התנאים של המשתמש, במקום לנתח אותו מתוך המחרוזת של סוכן המשתמש (UA). ציון המסלול החלופי הזה הוא השלב הראשון שבסופו של דבר יפחית את רמת הפירוט של המחרוזת של סוכן המשתמש.

כדאי לקרוא איך מעדכנים את הפונקציונליות הקיימת שמבוססת על ניתוח המחרוזת של סוכן המשתמש כדי להשתמש במקום זאת ב-User-Agent Client Hints.

רקע

כשדפדפני אינטרנט שולחים בקשות, הם כוללים מידע על הדפדפן והסביבה שלו, כדי ששרתים יוכלו להפעיל ניתוח נתונים ולהתאים אישית את התגובה. ההגדרה הזו הוגדרה כבר בשנת 1996 (RFC 1945 ל-HTTP/1.0), ושם אפשר למצוא את ההגדרה המקורית של מחרוזת ה-User-Agent, שכוללת דוגמה:

User-Agent: CERN-LineMode/2.15 libwww/2.17b3

הכותרת הזו נועדה לציין, לפי סדר החשיבות, את המוצר (למשל, דפדפן או ספרייה) ואת ההערה (למשל, גרסה).

המצב של המחרוזת של סוכן המשתמש

במהלך העשורים שחלפו, המחרוזת הזו צברה מגוון פרטים נוספים על הלקוח שהגיש את הבקשה (וגם את החיתוך, בגלל תאימות לאחור). אנחנו יכולים לראות שכשבוחנים את המחרוזת הנוכחית של סוכן המשתמש ב-Chrome:

Mozilla/5.0 (Linux; Android 10; Pixel 3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4076.0 Mobile Safari/537.36

המחרוזת שלמעלה מכילה מידע על מערכת ההפעלה והגרסה של המשתמש, דגם המכשיר, המותג והגרסה המלאה של הדפדפן. יש מספיק רמזים כדי להסיק שמדובר בדפדפן לנייד, וכמובן כמה הפניות לדפדפנים אחרים מסיבות היסטוריות.

השילוב של הפרמטרים האלה עם המגוון העצום של ערכים אפשריים, אומר שהמחרוזת של סוכן המשתמש יכולה להכיל מספיק מידע כדי לאפשר זיהוי ייחודי של משתמשים. אם תבדקו את הדפדפן שלכם ב-AmIUnique, תוכלו לראות עד כמה מחרוזת סוכן המשתמש שלך מזהה את אתם. ככל ש "יחס הדמיון" שמתקבל נמוך יותר, ככל שהבקשות יהיו ייחודיות יותר, כך יהיה לשרתים קל יותר לעקוב אחריכם.

המחרוזת של סוכן המשתמש מאפשרת הרבה תרחישים לדוגמה לגיטימיים, וממלאת תפקיד חשוב למפתחים ולבעלי אתרים. עם זאת, חשוב גם להגן על פרטיות המשתמשים מפני שיטות מעקב נסתרות, וששליחה של נתוני UA כברירת מחדל מנוגדת למטרה הזו.

צריך גם לשפר את התאימות לאינטרנט בכל הנוגע למחרוזת ה-User-Agent. האתר לא מובנה, ולכן ניתוח שלו גורם למורכבות מיותרת, שבדרך כלל גורמת לבאגים ולבעיות תאימות של אתרים שמזיקים למשתמשים. הבעיות האלה גם פגעו באופן לא פרופורציונלי במשתמשים בדפדפנים פחות נפוצים, כי ייתכן שאתרים לא הצליחו לבחון את ההגדרות שלהם.

חדש: User-Agent Client Hints

רמזים על הלקוח (Client Hints) לגבי סוכן המשתמש מאפשרים גישה לאותו מידע, אבל תוך שמירה על הפרטיות. כך הם מאפשרים לדפדפנים בסופו של דבר לצמצם את ברירת המחדל לשידור של הכול במחרוזת של סוכן המשתמש. טיפים ללקוחות אוכפים מודל שבו השרת צריך לבקש מהדפדפן קבוצת נתונים לגבי הלקוח (הרמזים) והדפדפן מחיל מדיניות משלו או הגדרות משתמש משלו כדי לקבוע אילו נתונים מוחזרים. המשמעות היא שבמקום לחשוף את כל המידע של סוכן המשתמש כברירת מחדל, הגישה מנוהלת באופן מפורש וגלוי. בנוסף, המפתחים נהנים מממשק API פשוט יותר – אין יותר ביטויים רגולריים!

הקבוצה הנוכחית של רמזים על הלקוח (Client Hints) שמתארת בעיקר את יכולות התצוגה והחיבור של הדפדפן. אפשר לקרוא פרטים נוספים במאמר Automating Resource Choose with Client Hints – אבל ריכזנו כאן רענון קצר על התהליך.

השרת מבקש רמזי לקוח ספציפיים דרך כותרת:

🎂️ תגובה מהשרת

Accept-CH: Viewport-Width, Width

או מטא תג:

<meta http-equiv="Accept-CH" content="Viewport-Width, Width" />

לאחר מכן הדפדפן יכול לשלוח את הכותרות הבאות בחזרה בבקשות הבאות:

⬆️ בקשה עוקבת

Viewport-Width: 460
Width: 230

השרת יכול לבחור לשנות את התגובות שלו, למשל על ידי הצגת תמונות ברזולוציה מתאימה.

הכלי User-Agent Client Hints מרחיבים את טווח המאפיינים עם הקידומת Sec-CH-UA, שאפשר לציין באמצעות כותרת התגובה Accept-CH של השרת. לכל הפרטים, כדאי להתחיל במסמך ההסבר ולפרט את ההצעה המלאה.

רמזים על הלקוח (Client Hints) מ-Chromium 89

הכלי User-Agent Client Hints הופעל כברירת מחדל ב-Chrome מאז גרסה 89.

כברירת מחדל, אם הלקוח הוא מכשיר נייד, הדפדפן מחזיר את מותג הדפדפן, הגרסה הראשית / משמעותית של הדפדפן, הפלטפורמה ואינדיקטור.

⬆️ כל הבקשות

Sec-CH-UA: "Chromium";v="93", "Google Chrome";v="93", " Not;A Brand";v="99"
Sec-CH-UA-Mobile: ?0
Sec-CH-UA-Platform: "macOS"

כותרת התגובה והבקשה של סוכן המשתמש

🎂️ תשובה Accept-CH
⬆️ כותרת בקשה
⬆️ בקשה
ערך לדוגמה
תיאור
Sec-CH-UA "Chromium";v="84",
"Google Chrome";v="84"
רשימה של מותגי דפדפנים והגרסה המשמעותית שלהם.
Sec-CH-UA-Mobile ?1 ערך בוליאני שמציין אם הדפדפן נמצא במכשיר נייד (?1 עבור true) או לא (?0 עבור false).
Sec-CH-UA-Full-Version "84.0.4143.2" [הוצאה משימוש]הגרסה המלאה של הדפדפן.
Sec-CH-UA-Full-Version-List "Chromium";v="84.0.4143.2",
"Google Chrome";v="84.0.4143.2"
רשימה של מותגי דפדפנים והגרסה המלאה שלהם.
Sec-CH-UA-Platform "Android" הפלטפורמה של המכשיר, בדרך כלל מערכת ההפעלה (OS).
Sec-CH-UA-Platform-Version "10" הגרסה של הפלטפורמה או של מערכת ההפעלה.
Sec-CH-UA-Arch "arm" הארכיטקטורה הבסיסית של המכשיר. אמנם ייתכן שפעולה זו לא רלוונטית להצגת הדף, אך האתר ירצה להציע הורדה שמוגדרת כברירת מחדל בפורמט הנכון.
Sec-CH-UA-Model "Pixel 3" דגם המכשיר.
Sec-CH-UA-Bitness "64" קצב הסיביות של הארכיטקטורה הבסיסית (כלומר, הגודל בסיביות של מספר שלם או כתובת זיכרון)

החלפה לדוגמה

החלפה לדוגמה תיראה כך:

⬆️ בקשה ראשונית מהדפדפן
הדפדפן מבקש את הדף /downloads מהאתר ושולח את הסוכן המשתמש הבסיסי שהוגדר כברירת מחדל.

GET /downloads HTTP/1.1
Host: example.site

Sec-CH-UA: "Chromium";v="93", "Google Chrome";v="93", " Not;A Brand";v="99"
Sec-CH-UA-Mobile: ?1
Sec-CH-UA-Platform: "Android"

🎂️ תגובה מהשרת
השרת שולח חזרה את הדף ומבקש גם את הגרסה המלאה של הדפדפן ואת הפלטפורמה.

HTTP/1.1 200 OK
Accept-CH: Sec-CH-UA-Full-Version-List

⬆️ בקשות עוקבות
הדפדפן מעניק לשרת גישה למידע הנוסף ושולח את הרמזים הנוספים בכל הבקשות הבאות.

GET /downloads/app1 HTTP/1.1
Host: example.site

Sec-CH-UA: " Not A;Brand";v="99", "Chromium";v="98", "Google Chrome";v="98"
Sec-CH-UA-Mobile: ?1
Sec-CH-UA-Full-Version-List: " Not A;Brand";v="99.0.0.0", "Chromium";v="98.0.4738.0", "Google Chrome";v="98.0.4738.0"
Sec-CH-UA-Platform: "Android"

ממשק API של JavaScript

בנוסף לכותרות, אפשר לגשת לסוכן המשתמש גם ב-JavaScript דרך navigator.userAgentData. אפשר לגשת לפרטי ברירת המחדל של הכותרת Sec-CH-UA, Sec-CH-UA-Mobile ו-Sec-CH-UA-Platform דרך המאפיינים brands ו-mobile, בהתאמה:

// Log the brand data
console.log(navigator.userAgentData.brands);

// output
[
  {
    brand: 'Chromium',
    version: '93',
  },
  {
    brand: 'Google Chrome',
    version: '93',
  },
  {
    brand: ' Not;A Brand',
    version: '99',
  },
];

// Log the mobile indicator
console.log(navigator.userAgentData.mobile);

// output
false;

// Log the platform value
console.log(navigator.userAgentData.platform);

// output
"macOS";

אפשר לגשת לערכים הנוספים דרך הקריאה getHighEntropyValues(). המונח "אנטרופיה גבוהה" מתייחס לאנטרופיה של מידע, במילים אחרות – כמות המידע שהערכים האלה חושפים על הדפדפן של המשתמש. בדומה לבקשת הכותרות הנוספות, תלוי בדפדפן אילו ערכים יוחזרו, אם יש כאלה.

// Log the full user-agent data
navigator
  .userAgentData.getHighEntropyValues(
    ["architecture", "model", "bitness", "platformVersion",
     "fullVersionList"])
  .then(ua => { console.log(ua) });

// output
{
   "architecture":"x86",
   "bitness":"64",
   "brands":[
      {
         "brand":" Not A;Brand",
         "version":"99"
      },
      {
         "brand":"Chromium",
         "version":"98"
      },
      {
         "brand":"Google Chrome",
         "version":"98"
      }
   ],
   "fullVersionList":[
      {
         "brand":" Not A;Brand",
         "version":"99.0.0.0"
      },
      {
         "brand":"Chromium",
         "version":"98.0.4738.0"
      },
      {
         "brand":"Google Chrome",
         "version":"98.0.4738.0"
      }
   ],
   "mobile":false,
   "model":"",
   "platformVersion":"12.0.1"
}

הדגמה (דמו)

תוכלו לנסות את הכותרות ואת ה-JavaScript API במכשיר שלכם בכתובת user-agent-client-hints.glitch.me.

רמז: משך החיים ואיפוס

רמזים שצוינו בכותרת Accept-CH יישלחו במהלך הסשן בדפדפן או עד שתציינו קבוצה אחרת של רמזים.

המשמעות היא שאם השרת שולח:

🎂️ תשובה

Accept-CH: Sec-CH-UA-Full-Version-List

לאחר מכן הדפדפן ישלח את הכותרת Sec-CH-UA-Full-Version-List בכל הבקשות לאותו אתר עד לסגירת הדפדפן.

⬆️ בקשות עוקבות

Sec-CH-UA-Full-Version-List: " Not A;Brand";v="99.0.0.0", "Chromium";v="98.0.4738.0", "Google Chrome";v="98.0.4738.0"

עם זאת, אם מתקבלת כותרת Accept-CH אחרת, היא תחליף לחלוטין את הרמזים הנוכחיים שהדפדפן שולח.

🎂️ תשובה

Accept-CH: Sec-CH-UA-Bitness

⬆️ בקשות עוקבות

Sec-CH-UA-Platform: "64"

הפריט Sec-CH-UA-Full-Version-List שביקשת בעבר לא יישלח.

מומלץ להתייחס לכותרת Accept-CH כאל קבוצת הרמזים המלאה שאותה רוצים להציג לדף. כלומר, הדפדפן שולח את הרמזים שצוינו לכל משאבי המשנה בדף. אמנם הרמזים ימשיכו להופיע בניווט הבא, אבל האתר לא צריך להסתמך או להניח שהם יישלחו.

אפשר להשתמש בשיטה הזו גם כדי למחוק ביעילות את כל הרמזים שהדפדפן שולח על ידי שליחת Accept-CH ריק בתגובה. כדאי להוסיף את המידע הזה בכל מקום שבו המשתמש מאפס את ההעדפות או יוצא מהאתר.

הדפוס הזה תואם גם לאופן שבו רמזים פועלים באמצעות התג <meta http-equiv="Accept-CH" …>. הרמזים המבוקשים יישלחו רק בבקשות שיופעלו על ידי הדף, ולא בניווטים עתידיים.

היקף רמזים ובקשות ממקורות שונים

כברירת מחדל, רמזים ללקוח יישלחו רק בבקשות מאותו מקור. כלומר, אם תבקשו רמזים ספציפיים לגבי https://example.com, אבל המשאבים שאתם רוצים לשפר נמצאים ב-https://downloads.example.com הם לא יקבלו רמזים.

כדי לאפשר רמזים בבקשות ממקורות שונים צריך לציין כל רמז ומקור באמצעות כותרת Permissions-Policy. כדי להחיל את המזהה הזה על רמז ללקוח של סוכן משתמש, צריך לרשום את הרמז באותיות קטנות ולהסיר את הקידומת sec-. למשל:

❗️ תשובה של example.com

Accept-CH: Sec-CH-UA-Platform-Version, DPR
Permissions-Policy: ch-ua-platform-version=(self "downloads.example.com"),
                    ch-dpr=(self "cdn.provider" "img.example.com");

⬆️ בקשה אל downloads.example.com

Sec-CH-UA-Platform-Version: "10"

⬆️ בקשות אל cdn.provider או אל img.example.com

DPR: 2

איפה אפשר להשתמש ברמזים על הלקוח (Client Hints) לגבי הסוכן המשתמש?

התשובה המהירה היא שצריך להגדיר מחדש את כל המקרים שבהם אתם מנתחים את הכותרת של סוכן המשתמש או משתמשים בקריאות JavaScript שניגשות לאותו מידע (כלומר navigator.userAgent, navigator.appVersion או navigator.platform) כדי להשתמש ב-User-Agent Client Hints במקום זאת.

לכן, עליך לבדוק מחדש את השימוש שלך במידע של סוכן המשתמש ולהחליף אותו בשיטות אחרות, כשהדבר אפשרי. לעיתים קרובות אפשר להשיג את אותה המטרה באמצעות שיפור הדרגתי, זיהוי תכונות או עיצוב רספונסיבי. הבעיה הבסיסית בהסתמכות על נתוני סוכן המשתמש היא שתמיד מתבצע מיפוי בין הנכס שבודקים לבין ההתנהגות שהוא מאפשר. מדובר בתקורה תחזוקה כדי לוודא שהזיהוי מקיף ועדכני.

על סמך הנקודות האלה, מאגר הרמזים של הלקוח של סוכן המשתמש מפרט כמה תרחישים חוקיים לשימוש באתרים.

מה קורה למחרוזת של סוכן המשתמש?

התוכנית היא לצמצם את היכולת לבצע מעקב סמוי באינטרנט. לשם כך, צריך לצמצם את כמות הפרטים המזהים שנחשף על ידי המחרוזת הקיימת של סוכן המשתמש, מבלי לגרום לשיבושים מיותרים באתרים קיימים. עכשיו, בגרסה החדשה של User-Agent Hints יש אפשרות להבין את היכולת החדשה ולהתנסות בה לפני שמבצעים שינויים במחרוזות של ה-User-Agent.

בסוף המידע במחרוזת של סוכן המשתמש יצומצם, כדי לשמור על הפורמט הקודם ולשמור על הפורמט הקודם, עם אותו דפדפן ברמה גבוהה ופרטי גרסה משמעותיים, בהתאם לרמזים שמוגדרים כברירת מחדל. השינוי הזה ב-Chromium נדחה לפחות לשנת 2022, כדי לתת לסביבה העסקית זמן נוסף לבחון את היכולות החדשות של הכלי 'רמזים ללקוחות בסוכן המשתמש'.

אפשר לבדוק גרסה של הדגל הזה על ידי הפעלת הדגל about://flags/#reduce-user-agent ב-Chrome 93 (הערה: הדגל הזה נקרא about://flags/#freeze-user-agent בגרסאות Chrome 84-92). הפעולה הזו תחזיר מחרוזת עם הרשומות ההיסטוריות מסיבות של תאימות, אבל עם פרטים נקיים. לדוגמה, למשל:

Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.0.0 Mobile Safari/537.36

תמונה ממוזערת מאת סרגיי זולקין ב-UnFlood