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

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

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

تعرَّف على كيفية تعديل وظائفك الحالية التي تعتمد على تحليل سلسلة User-Agent للاستفادة من User-Agent Client Hints بدلاً من ذلك.

الخلفية

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

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

كان الغرض من هذا العنوان تحديد المنتج (مثل browser أو library) والتعليق (مثل الإصدار) حسب الأهمية.

حالة سلسلة User-Agent

على مدار العقود الماضية، جمعت هذه السلسلة مجموعة متنوعة من التفاصيل الإضافية عن العميل الذي يقدّم الطلب (بالإضافة إلى محتوى غير ضروري بسبب التوافق مع الإصدارات القديمة). يمكننا ملاحظة ذلك عند الاطّلاع على سلسلة User-Agent الحالية في Chrome:

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

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

إنّ الجمع بين هذه المَعلمات والتنوع الكبير للقيم المحتملة يعني أنّ سلسلة User-Agent يمكن أن تحتوي على معلومات كافية للسماح بتحديد هوية المستخدِمين الفرديين بشكلٍ فريد.

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

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

تقديم ميزة "تعديلات برنامج وكيل المستخدم" الجديدة

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

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

يطلب الخادم 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. للاطّلاع على كل التفاصيل، ابدأ بقراءة الشرح ثم اطّلِع على الاقتراح الكامل.

حقول معلومات العميل لوكيل المستخدم من الإصدار 89 من Chromium

تم تفعيل تعديلات برنامج وكيل المستخدم تلقائيًا في 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 للقيمة الصحيحة) أو لا (?0 للقيمة الخطأ).
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" النظام الأساسي للجهاز، وعادةً ما يكون نظام التشغيل
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

إلى جانب الرؤوس، يمكن أيضًا الوصول إلى User-Agent في 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

أين يمكن استخدام "تعديلات برنامج وكيل المستخدم"؟

الإجابة السريعة هي أنّه عليك إعادة صياغة أيّ حالات تُحلِّل فيها إما رأس User-Agent أو تستخدِم أيًّا من طلبات JavaScript التي تحصل على المعلومات نفسها (أي navigator.userAgent أو navigator.appVersion أو navigator.platform) للاستفادة من User-Agent Client Hints بدلاً من ذلك.

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

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

ماذا يحدث لسلسلة User-Agent؟

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

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

يمكنك اختبار إصدار من هذه الميزة من خلال تفعيل العلامة about://flags/#reduce-user-agent من الإصدار 93 من Chrome (ملاحظة: كانت هذه العلامة تُسمى 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

الصورة المصغّرة من إنشاء سيرجي زولكين على Unsplash