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

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

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

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

الخلفية

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

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

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

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

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

حقول معلومات العميل لوكيل المستخدم من الإصدار 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" تمثّل هذه السمة النظام الأساسي للجهاز، وعادةً ما يكون نظام التشغيل (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

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

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

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

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

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

ماذا يحدث لسلسلة 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