تحسين خصوصية المستخدم وتجربة المطوّرين من خلال ميزة User-Agent Client Hints

إنّ تلميحات العميل لوكيل المستخدم هي توسيع جديد لواجهة Client Hints API، تتيح للمطوّرين الوصول إلى معلومات حول متصفّح المستخدم بطريقة مريحة تحافظ على الخصوصية.

تتيح "تلميحات العميل" للمطوّرين طلب معلومات بشكل نشط عن جهاز المستخدم أو شروطه، بدلاً من الحاجة إلى تحليلها من سلسلة "وكيل المستخدم" (UA). يشكّل توفير هذا المسار البديل الخطوة الأولى لتقليل دقة سلسلة وكيل المستخدم.

اطّلِع على كيفية تعديل الوظائف الحالية التي تعتمد على تحليل سلسلة وكيل المستخدم للاستفادة من ميزة "تلميحات عميل وكيل المستخدم" بدلاً من ذلك.

الخلفية

عندما تقدم متصفحات الويب طلبات، فإنها تتضمن معلومات عن المتصفح وبيئته حتى تتمكن الخوادم من تفعيل التحليلات وتخصيص الاستجابة. تم تعريف ذلك منذ عام 1996 (معيار RFC 1945 لبروتوكول HTTP/1.0)، حيث يمكنك العثور على التعريف الأصلي لسلسلة وكيل المستخدم، والذي يتضمن مثالاً:

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، يمكنك معرفة مدى دقة سلسلة وكيل المستخدم الخاصة بك في التعرّف عليك. وكلما انخفضت "نسبة التشابه" الناتجة، كانت طلباتك فريدة من نوعها، كان من الأسهل على الخوادم تتبّعك خفيًا.

تتيح سلسلة وكيل المستخدم العديد من حالات الاستخدام المشروعة، وتخدم غرضًا مهمًا للمطوّرين ومالكي المواقع الإلكترونية. ومع ذلك، من المهم أيضًا حماية خصوصية المستخدِمين من طرق التتبّع الخفية وإرسال معلومات Universal Analytics بشكلٍ تلقائي يخالف هذا الهدف.

هناك أيضًا حاجة إلى تحسين التوافق على الويب عندما يتعلق الأمر بسلسلة User-Agent. إنّها غير مهيكلة، لذا يؤدي تحليلها إلى تعقيد غير ضروري، والذي غالبًا ما يكون سبب أخطاء ومشاكل التوافق مع الموقع التي تؤذي المستخدمين. تضر هذه المشكلات أيضًا مستخدمي المتصفحات الأقل شيوعًا، إذ ربما تعذّر على المواقع الاختبار مقابل التهيئة.

إضافة تلميحات برنامج وكيل المستخدم الجديدة

تتيح تلميحات العميل المستخدم في وكيل المستخدم الوصول إلى المعلومات نفسها ولكن بطريقة تحافظ على الخصوصية بشكل أكبر، يؤدي ذلك بدوره إلى السماح للمتصفّحات بتقليل الإعدادات التلقائية لسلسلة وكيل المستخدم التي تتيح بث كل المحتوى. تفرض Client Hints نموذجًا حيث يجب أن يطلب الخادم من المتصفِّح مجموعة من البيانات حول العميل (التلميحات) ويطبّق المتصفِّح سياساته الخاصة أو إعدادات المستخدم لتحديد البيانات التي يتم عرضها. وهذا يعني أنّه بدلاً من عرض جميع معلومات وكيل المستخدم تلقائيًا، تتم الآن إدارة إمكانية الوصول بشكل واضح وقابل للتدقيق. ويستفيد المطوّرون أيضًا من واجهة برمجة تطبيقات أبسط، وليس تعبيرات عادية أخرى.

تصف المجموعة الحالية من تلميحات العميل بشكل أساسي إمكانيات العرض والاتصال في المتصفّح. يمكنك الاطّلاع على التفاصيل في مقالة تحديد الموارد آليًا باستخدام تلميحات العميل، ولكن إليك تنشيطًا سريعًا للذاكرة حول هذه العملية.

يطلب الخادم تلميحات محددة للعميل عبر عنوان:

⬇️ الردّ من الخادم

Accept-CH: Viewport-Width, Width

أو علامة وصفية:

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

يمكن للمتصفح بعد ذلك اختيار إرسال العناوين التالية مرة أخرى في الطلبات اللاحقة:

⬆️ الطلب اللاحق

Viewport-Width: 460
Width: 230

يمكن للخادم اختيار تغيير ردوده، مثلاً من خلال عرض الصور بدرجة دقة مناسبة.

تعمل تلميحات برنامج وكيل المستخدم على توسيع نطاق المواقع الإلكترونية باستخدام البادئة Sec-CH-UA التي يمكن تحديدها من خلال عنوان استجابة الخادم Accept-CH. للاطّلاع على كل التفاصيل، ابدأ بالشرح ثم تعمق في الاقتراح الكامل.

تلميحات برنامج وكيل المستخدم من Chromium 89

تم تفعيل تلميحات عميل وكيل المستخدم تلقائيًا في 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"

JavaScript API

بالإضافة إلى العناوين، يمكن أيضًا الوصول إلى وكيل المستخدم في 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 على جهازك على 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

أين يمكن استخدام تلميحات عميل وكيل المستخدم؟

الإجابة السريعة هي أنّه يجب إعادة بناء أي حالات تقوم فيها بتحليل عنوان وكيل المستخدم أو الاستفادة من أي من طلبات JavaScript التي يمكنها الوصول إلى المعلومات نفسها (مثل navigator.userAgent أو navigator.appVersion أو navigator.platform) للاستفادة من تلميحات عميل وكيل المستخدم بدلاً من ذلك.

بعد ذلك، يجب إعادة فحص استخدامك لمعلومات وكيل المستخدم واستبدالها بأساليب أخرى كلما أمكن ذلك. في كثير من الأحيان، يمكنك تحقيق نفس الهدف عن طريق الاستفادة من التحسين التدريجي أو اكتشاف الميزات أو التصميم سريع الاستجابة. تتمثل المشكلة الأساسية في الاعتماد على بيانات وكيل المستخدم في أنّك تحتفظ دائمًا بربط بين الموقع الذي تفحصه والسلوك الذي يفعّله. يتطلب الأمر إجراء صيانة لضمان أن عملية الرصد شاملة ومُحدَّثة.

مع وضع هذه المحاذير في الاعتبار، يسرد مستودع تلميحات عميل وكيل المستخدم بعض حالات الاستخدام الصالحة للمواقع الإلكترونية.

ماذا يحدث لسلسلة وكيل المستخدِم؟

تهدف الخطة إلى تقليل إمكانية التتبُّع الخفي على الويب عن طريق تقليل مقدار معلومات التعريف التي تعرضها سلسلة وكيل المستخدم الحالية، بدون التسبب في حدوث انقطاع غير مبرَّر على المواقع الإلكترونية الحالية. من خلال تقديم تلميحات العميل لوكيل المستخدم، يمكنك الآن فهم الإمكانات الجديدة واختبارها قبل إجراء أي تغييرات على سلاسل وكيل المستخدم.

في النهاية، سيتم تقليل المعلومات الواردة في سلسلة "وكيل المستخدم" للحفاظ على التنسيق القديم مع توفير نفس المتصفح العالي المستوى ومعلومات الإصدار المهمة فقط وفقًا للتلميحات التلقائية. في Chromium، تم تأجيل هذا التغيير حتى العام 2022 على الأقل لتوفير وقت إضافي للمنظومة المتكاملة من أجل تقييم إمكانات تلميحات عميل وكيل المستخدم الجديدة.

يمكنك اختبار إصدار من هذه العلامة من خلال تفعيل العلامة about://flags/#reduce-user-agent من Chrome 93 (ملاحظة: تمت تسمية هذه العلامة about://flags/#freeze-user-agent في الإصدارات من 84 إلى 92 من Chrome). سيؤدي هذا إلى عرض سلسلة مع الإدخالات السابقة لأسباب تتعلق بالتوافق، ولكن مع تفاصيل تم تصحيحها. على سبيل المثال:

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

صورة مصغّرة من سيرغي زولكين على قناة UnLaunch