---
url: 'https://www.corbado.com/ar/blog/client-hints-user-agent-chrome-safari-firefox'
title: 'تلميحات العميل ووكلاء المستخدم في Chrome وSafari وFirefox'
description: 'تعرف على دعم User-Agent وواجهة برمجة تطبيقات تلميحات العميل (Client Hints) في Chrome وSafari وFirefox وكيف نستخدمها لمفاتيح المرور في مكونات JavaScript.'
lang: 'ar'
author: 'Vincent Delitz'
date: '2026-07-27T08:24:31.827Z'
lastModified: '2026-07-27T08:25:49.097Z'
keywords: 'تقليل وكيل المستخدم, وكيل المستخدم, تلميحات العميل, واجهة برمجة تطبيقات تلميحات العميل, دعم المتصفح لتلميحات العميل, سلسلة وكيل المستخدم, chrome, safari, firefox'
category: 'Engineering'
---

# تلميحات العميل ووكلاء المستخدم في Chrome وSafari وFirefox

## Key Facts

- **تقليل User-Agent** اكتمل عبر جميع المتصفحات الرئيسية: Chrome وEdge منذ عام 2023، وFirefox جزئيًا، بينما تم تجميد Safari منذ إصدار iOS 26 في سبتمبر 2025.
- **لا يدعم Firefox تلميحات العميل (Client Hints)** أو `navigator.userAgentData`، مما يتطلب من المطورين الرجوع إلى التحليل الكلاسيكي لسلسلة User-Agent على متصفح Mozilla.
- تصل واجهة برمجة تطبيقات JavaScript **`getHighEntropyValues()`** إلى بيانات الأجهزة عالية الإنتروبيا في متصفحات Chromium فقط. يفتقر Safari وFirefox إلى واجهة برمجة التطبيقات هذه تمامًا.
- يعد التمييز بين **Windows 10 وWindows 11** مستحيلًا عبر سلاسل User-Agent وحدها. فقط تلميحات العميل على Chrome وEdge يمكنها الكشف عن إصدار النظام الأساسي الفعلي.
- تستخدم Corbado تلميحات العميل من أجل **ذكاء مفاتيح المرور (passkey intelligence)**: اكتشاف الأجهزة الجديدة وتقييم الأهلية للمصادقة عبر الأجهزة، خاصة للتمييز بين إصدارات Windows.

## 1. مقدمة: ما هي تلميحات العميل وتقليل User-Agent؟

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

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

النقاط الرئيسية التي سنتناولها:

- **ما هو تقليل User-Agent:** فهم التحول نحو سلاسل User-Agent المخفضة وآثارها.
- **كيف تعمل تلميحات العميل:** استكشاف الآليات الكامنة وراء تلميحات العميل وكيف يمكن تنفيذها بفعالية.

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

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

قبل أن نتعمق في التفاصيل الفنية حول تلميحات العميل، سنستكشف باختصار تاريخ User-Agent وكيف تعمل جهود تقليل User-Agent المختلفة.

### 1.1 نبذة تاريخية عن User-Agent

يمكن تتبع تاريخ سلاسل User-Agent إلى بداية متصفحات الويب الأولى. طور تيم بيرنرز لي أول متصفح ويب، WorldWideWeb (والذي أعيدت تسميته لاحقًا باسم Nexus) في عام 1990. وتلا ذلك قريبًا متصفحات رائدة أخرى مثل Line Mode Browser في عام 1991، ثم ظهرت متصفحات مثل MidasWWW وViolaWWW وErwise وCello.

في عام 1993، يُنسب الفضل إلى إصدار [NCSA Mosaic](https://en.wikipedia.org/wiki/NCSA_Mosaic)، والذي غالبًا ما يشار إليه ببساطة باسم Mosaic، في إشعال الارتفاع الأولي في شعبية الويب. كانت سلسلة User-Agent الخاصة بـ Mosaic مباشرة تمامًا، وعادةً ما يتم تنسيقها كـ `NCSA_Mosaic/1.0` والتي تتميز باسم المنتج متبوعًا بشرطة مائلة اختيارية ورقم الإصدار.

في البداية، **تم تقديم حقل User-Agent للأغراض التحليلية وللمساعدة في تحديد المشكلات**. تم التوصية صراحة بأن هذا الحقل "يجب تضمينه" في طلبات HTTP، كما هو مذكور في أرشيف W3C HTTP من عام 1992. وفر هذا الحقل المباشر طريقة بسيطة وفعالة لنقل اسم المنتج وإصداره، مما ساعد في فهم واستكشاف المشكلات المتعلقة بالمتصفح.

مع تطور الويب، تطور أيضًا تعقيد واستخدام سلاسل User-Agent. أصبحت أكثر تفصيلاً وبدأت في تضمين ثروة من المعلومات حول المتصفح ونظام التشغيل والجهاز. ورغم أن هذه المعلومات كانت قيمة لتحليلات الويب وتحسين تجارب المستخدم، إلا أنها شكلت أيضًا **مخاوف كبيرة تتعلق بالخصوصية**. سمحت سلاسل User-Agent التفصيلية بـ **بصمات الأجهزة (device fingerprinting)**، مما مكن المعلنين والمتتبعين من إنشاء ملفات تعريف فريدة للمستخدمين وتتبع أنشطتهم عبر الإنترنت عبر مواقع الويب المختلفة.

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

### 1.2 مقدمة عن تقليل User-Agent وتلميحات العميل

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

#### 1.2.1 وكلاء المستخدم في Safari

في عام 2017، أطلقت Apple حركة تقليل User-Agent [بمنشور شهير على Twitter](https://x.com/rmondello/status/943545865204989953) أعلنت فيه أن Safari سيجمد سلسلة User-Agent في Safari Technology Preview 46 (STP 46)، بهدف مكافحة بصمات الأجهزة وتحسين الخصوصية.

![twitter safari user agent reduction](https://www.corbado.com/website-assets/twitter_user_agent_d4776d2a35.png)

ومع ذلك، تم التراجع جزئيًا عن هذا القرار لاحقًا في عام 2021 بسبب مشكلات التوافق الكبيرة مع مواقع الويب التي تعتمد على معلومات User-Agent المحدثة.

#### 1.2.2 وكلاء المستخدم في Chrome (وEdge)

في 2019/2020، [أعلنت Google عن خطط](https://groups.google.com/a/chromium.org/g/blink-dev/c/-2JIRNMWJ7s/m/u-YzXjZ8BAAJ) لتقليل دقة سلاسل User-Agent في Chrome، وقدمت [تلميحات عميل User-Agent (UA-CH)](https://chromestatus.com/feature/5704553745874944) كطريقة مرنة ومحكومة لطلب معلومات محددة عن المتصفح والجهاز. بدأت Google في اختبار تقليل User-Agent في إصدارات Chrome Canary وBeta، وجمعت التعليقات لضمان التوافق والوظائف و[اكتمل ذلك في عام 2023](https://www.chromium.org/updates/ua-reduction/) لنظام Android وجميع منصات Chrome الأخرى. في الوقت نفسه، **قدم Chrome تلميحات العميل** كطريقة جديدة للوصول إلى تلك المعلومات. نظرًا لأن Microsoft Edge يعتمد على Chromium، فإن Microsoft Edge يتصرف مثل Chrome على جميع المنصات.

#### 1.2.3 وكلاء المستخدم في Firefox

في عام 2021، انضمت Mozilla إلى هذا الجهد، وقللت تدريجيًا من دقة سلسلة User-Agent ولكن Mozilla قررت **عدم دعم تلميحات العميل في Firefox**.

#### 1.2.4 وكلاء المستخدم اليوم (مُحدث في سبتمبر 2025)

- **يختلف تقليل User-Agent حسب المتصفح:** نفذ Chromium (Chrome، Edge) تقليلًا كاملاً لـ UA مع دعم تلميحات العميل. ومع ذلك، يستخدم Safari نهجه الخاص في تجميد UA دون اعتماد UA-CH، ولم ينفذ Firefox `navigator.userAgentData`. لا يزال النظام البيئي مجزأً.

- **تطورت تلميحات العميل داخل Chromium:** لا تزال جميع المتصفحات ترسل رأس User-Agent، ولكن في معظمها يتم تجميده إلى إصدار أقدم (انظر الجدول أدناه). بالنسبة لـ Chromium، يمكن استخدام تلميحات العميل للحصول على مزيد من المعلومات.

دعونا نلقي نظرة على ما ترسله المتصفحات حاليًا كوكلاء مستخدم في الفصل التالي.

## 2. ما هو تقليل User-Agent؟

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

### 2.1 ما هو User-Agent الكلاسيكي؟

تضمنت سلسلة User-Agent الكلاسيكية عادةً المكونات التالية، والتي يمكن استخدامها لاكتشاف الوظائف:

`Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.2.1.0 Mobile Safari/537.36`

- **نظام التشغيل:** اسم نظام التشغيل (مثل Windows، macOS، Linux).
- **رقم إصدار نظام التشغيل:** الإصدار المحدد لنظام التشغيل.
- **اسم المتصفح:** اسم المتصفح (مثل Chrome، Firefox، Safari).
- **إصدار المتصفح:** الإصدار المحدد للمتصفح.
- **البنية (Architecture):** بنية النظام (مثل x86، ARM).
- **نوع/طراز الجهاز:** معلومات حول نوع أو طراز الجهاز (مثل iPhone، Pixel).
- **معلومات أخرى:** يمكن أن يشمل ذلك تفاصيل إضافية مثل المنصة، رقم البناء (build number)، إلخ.

#### 2.1.1 لماذا نستخدم User-Agent لاكتشاف الميزات؟

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

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

حتى اليوم، هذا غير ممكن بالكامل حيث يتم تنفيذ واجهات برمجة تطبيقات المتصفح الجديدة لاكتشاف الوظائف في أوقات مختلفة وغالبًا ما يكون هناك نهج مختلف بين فرق المتصفحات الأكبر (مثل المتصفحات القائمة على Chromium) وفرق المتصفحات الأصغر (مثل Firefox).

#### 2.1.2 فهم الإنتروبيا في بصمات الأجهزة: لماذا يُعد تقديم الكثير من المعلومات مشكلة؟

توفر المزيد من المعلومات لموقع الويب إمكانية أوسع لإنشاء بصمة جهاز بـ "إنتروبيا" أكبر. الإنتروبيا في هذا السياق هي مقدار الاختلاف الذي يمكن استخدامه لإنشاء بصمة فريدة بين الزوار المختلفين لموقع ويب.

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

في سياق سلاسل User-Agent، تشير الإنتروبيا إلى مقدار المعلومات الفريدة القابلة للتحديد والتي يمكن استخدامها لتتبع وتمييز المستخدمين الأفراد.

- **المعلومات عالية الإنتروبيا:** مثل إصدارات المتصفح ونظام التشغيل المحددة، تساهم بشكل كبير في تفرد بصمة المستخدم، مما يسهل تتبعهم عبر مواقع الويب المختلفة.
- **المعلومات منخفضة الإنتروبيا:** أسماء المتصفحات العامة أو أسماء أنظمة التشغيل، توفر بيانات أقل تفصيلاً وتساهم بشكل أقل في تتبع المستخدمين حيث يحمل المزيد من المستخدمين تلك المجموعات.

هناك الكثير من المعلومات الإضافية التي يمكن استخدامها كمصدر للإنتروبيا أسفل User-Agent. على سبيل المثال، يمكنك العثور على مصادر مختلفة للإنتروبيا على [https://coveryourtracks.eff.org](https://coveryourtracks.eff.org).

### 2.2 تقليل إنتروبيا User-Agent

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

#### 2.2.1 المثال 1: تقليل User-Agent في Chrome

فيما يلي، تجد مثالًا لتقليل User-Agent في Google Chrome على هاتف Android:

**قبل:**
`Mozilla/5.0 (Linux; Android <span style={{color: '#016F01' }}>13; Pixel 7</span>) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.0.0 Mobile Safari/537.36`

**بعد:**
`Mozilla/5.0 (Linux; Android <span style={{color: '#016F01' }}>10; K</span>) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.0.0 Mobile Safari/537.36`

ظل تنسيق User-Agent دون تغيير لكي لا يتداخل مع منطق التحليل الحالي للمكتبات. تم تقليل القيم التالية:

- إصدار نظام التشغيل
- الإصدار الفرعي للمتصفح
- طراز الأجهزة ![user agent](https://www.corbado.com/website-assets/user_agent_0fe7987aff.png)

يوضح الرسم البياني القيم التي سيستمر تحديثها بناءً على نظام التشغيل، وتُظهر القيم الخضراء القيم التي ستظل ثابتة على جميع المنصات. بالنسبة لقيم أنظمة التشغيل المختلفة، لن يتوفر سوى متغير يظل ثابتًا:

| **نظام التشغيل** | **الاسم المخفض/الثابت**             |
| ---------------- | ----------------------------------- |
| Mac              | Macintosh; Intel Mac OS X 10_15_7   |
| Windows          | Windows NT 10.0; Win64; x64         |
| ChromeOS         | X11; CrOS x86_64 14541.0.0          |
| Linux            | X11; Linux x86_64                   |
| Android          | Linux; Android 10; K                |
| iOS              | مخفض (iOS 26+)                      |

#### 2.2.2 المثال 2: تقليل User-Agent في Firefox

فيما يلي، تجد مثالًا لتقليل User-Agent في Mozilla Firefox والذي يتبع معظم مواقف Google بشأن تقليل User-Agent.

إليك مثال على User-Agent على Windows 11 بإصدار Firefox الحالي:

`Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:127.0) Gecko/20100101 Firefox/127.0`

في هذا الـ User-Agent، تم تجميد بنية وحدة المعالجة المركزية، وإصدار نظام التشغيل، والإصدار الفرعي للمتصفح.

#### 2.2.3 المثال 3: تقليل User-Agent في Safari على macOS

فيما يلي، تجد مثالًا على تقليل User-Agent في Safari على macOS.

أولاً، لنبدأ بـ **User-Agent لـ Safari على macOS Sonoma الإصدار 14.5** على Mac Silicon M2.

`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15`

يمكنك أن ترى أن إصدار macOS محدد بـ `10_15_07` والبنية ثابتة أيضًا على `Intel` ولا تُبلغ عن بنية وحدة المعالجة المركزية لـ Mac. هذا ينطبق أيضًا على Firefox و [Chrome](https://issues.chromium.org/issues/40167872) على macOS.

#### 2.2.4 المثال 4: User-Agent لـ Safari على iOS (مخفض الآن في iOS 26+)

قبل iOS 26 (الصادر في سبتمبر 2025)، كان Safari على iOS يعرض الإصدار الفعلي لنظام التشغيل. ومع ذلك، **قامت Apple الآن بتجميد User-Agent لـ iOS/iPadOS** في Safari 26، بشكل مشابه لـ macOS. يوضح المثال أدناه User-Agent ما قبل iOS 26:

`Mozilla/5.0 (iPhone; CPU iPhone OS 17_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1`

**ملاحظة:** اعتبارًا من iOS 26، أصبحت جميع المتصفحات على iOS (Chrome، Firefox، Safari) تمتلك الآن سلاسل User-Agent مجمدة، على غرار macOS. توضح الأمثلة أدناه سلوك ما قبل iOS 26:

`Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/126.0.6478.153 Mobile/15E148 Safari/604.1`

`Mozilla/5.0 (iPhone; CPU iPhone OS 17_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) FxiOS/127.1 Mobile/15E148 Safari/605.1.15`

### 2.3 قيود الاكتشاف مع تقليل User-Agent

بشكل عام، من الواضح أن User-Agent يتم تقليله تحديدًا في المعلومات عالية الإنتروبيا. توضح النظرة العامة التالية تركيبات المنصات / أنظمة التشغيل التي يتم فيها تقليل User-Agent.

| **المتصفح**        | **Windows** | **MacOS** | **iOS**                    | **Android**                 |
| ------------------ | ----------- | --------- | -------------------------- | --------------------------- |
| Chrome             | مخفض        | مخفض      | مخفض (iOS 26+)             | مخفض                        |
| Edge               | مخفض        | مخفض      | مخفض (iOS 26+)             | مخفض                        |
| Firefox            | مخفض        | مخفض      | مخفض (iOS 26+)             | مخفض                        |
| Safari             | -           | مخفض\*    | مخفض (Safari 26+)\*\*      | -                           |
| Samsung Internet   | -           | -         | -                          | مخفض                        |
| WebViews           | -           | -         | مخفض (iOS 26+)             | غير مخفض (≥ 16: مخفض)       |

لذلك، فإن أهم مشاكل الاكتشاف مع User-Agent المخفض هي (\* = انظر الملاحظات أدناه لإصدار macOS):

- **لا يمكن التمييز بين Windows 10 وWindows 11:** لا يمكنك التمييز بين أنظمة Windows 10 وWindows 11 استنادًا إلى User-Agent بعد الآن.
- **لا يمكن التمييز بين أجهزة وإصدار نظام تشغيل Android:** على النقيض من Apple، كان Android يدرج طراز الأجهزة الفعلي في User-Agent. لم يعد هذا هو الحال. لذلك، لا يمكن التمييز بين طرز الأجهزة المختلفة بعد الآن عبر User-Agent فقط. مع Apple لم يكن هذا ممكنًا أبدًا.
- **لا يمكن التمييز بين إصدار وبنية macOS:** لا توجد طريقة للتمييز بين إصدارات macOS وبنيات المنصة بناءً على User-Agent.
- **(\*) إصدار macOS على Safari:** قام Safari بتجميد إصدار نظام التشغيل ولكنه يستمر في إظهار إصدار Safari. في وقت الكتابة للإصدار 10.15 وما فوق، من الآمن طرح ثلاثة من إصدار Safari لاكتشاف الإصدار الرئيسي لـ MacOS.
- **(\*\*) إصدار iOS على Safari 26+:** اعتبارًا من iOS 26 (سبتمبر 2025)، جمدت Apple الـ User-Agent لـ iOS/iPadOS، على غرار macOS. لم يعد يتم كشف إصدار نظام التشغيل.

إليك جدول يربط إصدارات macOS بإصدارات Safari المقابلة لها:

| **إصدار macOS**        | **إصدار Safari** | **سنة الإصدار** |
| ---------------------- | ---------------- | --------------- |
| macOS Sequoia (15)     | Safari 18        | 2024            |
| macOS Sonoma (14)      | Safari 17        | 2023            |
| macOS Ventura (13)     | Safari 16        | 2022            |
| macOS Monterey (12)    | Safari 15        | 2021            |
| macOS Big Sur (11)     | Safari 14        | 2020            |
| macOS Catalina (10.15) | Safari 13        | 2019            |

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

## 3. كيف تعمل تلميحات العميل؟

تُمكّن تلميحات العميل مواقع الويب من الوصول إلى المعلومات عالية الإنتروبيا التي تمت إزالتها من سلسلة User-Agent بطريقة تحترم الخصوصية. هناك طريقتان أساسيتان للوصول إلى تلميحات العميل:

- **رأس HTTP (HTTP Header)**: استخدام رؤوس طلب HTTP، وهي متاحة فقط في سياقات الطرف الأول (first-party contexts).
- **واجهة برمجة تطبيقات JavaScript**: استخدام واجهة برمجة تطبيقات JavaScript، والتي يمكن استخدامها بواسطة برنامج نصي (script) مضمن.

يمكن استخدام تلميحات العميل أيضًا لاسترداد المعلومات منخفضة الإنتروبيا المضمنة بالفعل في User-Agent. هذا يعني أنه على Chrome، حيث تُدعم تلميحات العميل، لم تعد هناك حاجة لـ User-Agents.

### 3.1 ما هي تلميحات العميل المتوفرة؟

اعتمادًا على طريقة الوصول المستخدمة، تختلف تسمية تلميحات العميل قليلاً. لقد قمنا بإدراج أهم أسماء تلميحات العميل:
![client hints](https://s3.eu-central-1.amazonaws.com/corbado-cloud-staging-website-assets/client_hints_f186bae2e2.jpg)

| **رمز HTTP UA-CH**         | **واجهة برمجة تطبيقات UA-CH JS** | **الإنتروبيا** |
| -------------------------- | -------------------------------- | -------------- |
| Sec-CH-UA-Platform-Version | UADataValues.platformVersion     | عالية          |
| Sec-CH-UA-Mobile           | NavigatorUAData.mobile           | منخفضة         |
| Sec-CH-UA-Model            | UADataValues.model               | عالية          |
| Sec-CH-UA                  | NavigatorUAData.brands           | منخفضة         |
| Sec-CH-UA-Arch             | UADataValues.architecture        | عالية          |

### 3.2 كيفية الوصول إلى تلميحات العميل عبر رؤوس طلبات HTTP

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

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

- رؤوس تلميحات العميل العادية (Regular Client Hint Headers)
- رؤوس التلميحات (العميل) الحرجة (Critical (Client) Hint Headers)

#### 3.2.1 كيفية استخدام رؤوس تلميحات العميل العادية؟

تلميحات العميل العادية هي رؤوس يمكن للخادم طلبها من المتصفح لجمع معلومات حول بيئة المستخدم **في الطلبات اللاحقة**.

**مثال: Chrome على macOS 14.5 مع تلميحات العميل العادية على corbado.com**

1. في الطلب الأول لـ Corbado.com، سيقوم Chrome بالفعل بتضمين الرؤوس منخفضة الإنتروبيا التالية نظرًا لأن هذه المعلومات مضمنة أيضًا في User-Agent.

| **الرأس**          | **القيمة**                                                        |
| ------------------ | ----------------------------------------------------------------- |
| Sec-Ch-Ua          | "Google Chrome";v="125", "Chromium";v="125", "Not.A/Brand";v="24" |
| Sec-Ch-Ua-Mobile   | ?0                                                                |
| Sec-Ch-Ua-Platform | "macOS"                                                           |

2. لنفترض أن Corbado.com يرغب في تلقي إصدار نظام التشغيل (إصدار النظام الأساسي) في **الطلبات اللاحقة**. لذلك، سيقوم بعد ذلك بتعيين رأس "Sec-CH-UA-Platform-Version" المناسب في الاستجابة للطلب الأول:

| **الرأس**  | **القيمة**                 |
| ---------- | -------------------------- |
| Accept-CH  | Sec-CH-UA-Platform-Version |

3. في **الطلبات اللاحقة**، سيتلقى Corbado.com بعد ذلك رأسًا إضافيًا واحدًا يحتوي على إصدار النظام الأساسي:

| **الرأس**          | **القيمة**                                                        |
| ------------------ | ----------------------------------------------------------------- |
| Sec-Ch-Ua          | "Google Chrome";v="125", "Chromium";v="125", "Not.A/Brand";v="24" |
| Sec-Ch-Ua-Mobile   | ?0                                                                |
| Sec-Ch-Ua-Platform | "macOS"                                                           |
| Sec-Ch-Ua-Platform | "14.5.0"                                                          |

في الوقت نفسه، سيبقى User-Agent لهذا الطلب كما هو (بدون إصدار المنصة):

`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36`

باستخدام [https://user-agent-client-hints.glitch.me/headers](https://user-agent-client-hints.glitch.me/headers)، يمكنك فعليًا تجربة كيف ستبدو تخطيطات مختلفة من المعلومات للتلميحات العادية (ضع في اعتبارك **يجب عليك استخدام Chrome**). انظر [هنا](https://github.com/WICG/ua-client-hints) لمزيد من التفاصيل. في حال احتاج corbado.com إلى هذه المعلومات في أول طلب للصفحة، فإن استخدام تلميحات العميل العادية لن يكون كافيًا، ولكن هناك طريقة لتسريع هذه العملية من خلال التلميحات (العميل) الحرجة.

#### 3.2.2 كيفية استخدام رؤوس التلميحات (العميل) الحرجة؟

لنفترض أن [corbado.com](https://corbado.com) يحتاج إلى إصدار النظام الأساسي (platform-version) في الطلب الأول لعرض صفحة تنزيل مناسبة مصممة خصيصًا لإصدار macOS الدقيق. يمكنه استخدام التلميحات (العميل) الحرجة والتي قد تؤدي إلى **إعادة محاولة الطلب فورًا** فقط لعرض الصفحة التي تتضمن الرأس:

**مثال: Chrome على macOS 14.5 مع تلميحات العميل الحرجة على corbado.com**

1. في الطلب الأول لـ corbado.com، سيقوم Chrome بالفعل بتضمين الرؤوس منخفضة الإنتروبيا التالية لأن هذه المعلومات مضمنة أيضًا في User-Agent.

| **الرأس**          | **القيمة**                                                        |
| ------------------ | ----------------------------------------------------------------- |
| Sec-CH-UA          | "Google Chrome";v="125", "Chromium";v="125", "Not_A/Brand";v="24" |
| Sec-CH-UA-Mobile   | ?0                                                                |
| Sec-CH-UA-Platform | "macOS"                                                           |

2. لنفترض أن corbado.com يرغب في تلقي إصدار نظام التشغيل (إصدار المنصة) عند **أول عرض (rendering) للصفحة**. سيقوم بعد ذلك بتعيين رأس تلميح العميل الحرج "Sec-CH-UA-Platform-Version" في الاستجابة للطلب الأول:

| **الرأس**  | **القيمة**                 |
| ---------- | -------------------------- |
| Accept-CH  | Sec-CH-UA-Platform-Version |

3. لن يبدأ Chrome في العرض وسيعيد محاولة الطلب فورًا، بحيث **يكون الرأس متاحًا عند العرض الأول** لـ corbado.com. سيتلقى بعد ذلك الرأس الإضافي مع إصدار النظام الأساسي:

| **الرأس**                  | **القيمة**                                                        |
| -------------------------- | ----------------------------------------------------------------- |
| Sec-CH-UA                  | "Google Chrome";v="125", "Chromium";v="125", "Not_A/Brand";v="24" |
| Sec-CH-UA-Mobile           | ?0                                                                |
| Sec-CH-UA-Platform         | "macOS"                                                           |
| Sec-CH-UA-Platform-Version | "14.5.0"                                                          |

في الرسوم البيانية التالية، **نرى مثالاً آخر** حيث يطلب موقع الويب طراز الجهاز كجزء حرج مع رأس Critical-CH. وكما نرى، يعيد العميل محاولة الطلب كما في المثال أعلاه (مخطط التسلسل الأيسر).

![chromium user agent flow complete](https://www.corbado.com/website-assets/chromium_user_agent_flow_complete_cfbf688661.png)_تلميحات العميل مع Chromium: [https://developers.google.com/privacy-sandbox/protections/User-Agent](https://developers.google.com/privacy-sandbox/protections/User-Agent)_

لذلك فإن استخدام تلميحات العميل الحرجة يضيف زمن وصول (latency) لأن المتصفح يجب أن يبدأ طلبًا ثانيًا على الفور مما يضيف رحلات ذهاب وإياب. توجد طريقة لتحسين النقل عن طريق **تسهيل مصافحة TLS (TLS handshake)** (المربع الأخضر أعلى المخطط) لنقل التفاصيل مسبقًا. يمكن العثور على هذا النهج الذي يسهل **[ALPN](https://en.wikipedia.org/wiki/Application-Layer_Protocol_Negotiation) (تفاوض بروتوكول طبقة التطبيق)** [هنا](https://docs.google.com/document/d/1HQd3vosjFls2jp6DwpkNMUN4CBdmmxZJJz0WhhcqOPw/edit) بالتفصيل ولكنه يتجاوز الغرض من هذه المقالة.

لتلقي معلومات إضافية باستخدام الرؤوس، يجب إضافة التكوين (configuration) إما إلى الواجهة الخلفية أو إلى خادم الويب / موازنات التحميل (load balancers). يتم ذلك بسهولة في سياق الطرف الأول، عندما يكون لديك تحكم كامل في موقع الويب كشركة. على سبيل المثال، تتطلب مكونات واجهة المستخدم الخاصة بنا في corbado.com إصدار المنصة لزيادة دقة [ذكاء مفاتيح المرور (passkey intelligence)](https://docs.corbado.com/corbado-connect/features/passkey-intelligence) لدينا. يقوم المطورون بدمج مكوناتنا في صفحات مختلفة، وسيكون مطالبتهم بإضافة الرؤوس ثم تمرير هذه المعلومات إلى مكوناتنا عبئًا غير مستحب. بالنسبة لـ SPAs وتطبيقات JavaScript المضمنة الأخرى، توجد واجهة أخرى يمكن استخدامها، والتي سيتم شرحها في القسم التالي.

### 3.3 كيفية الوصول إلى تلميحات العميل عبر واجهة برمجة تطبيقات JavaScript (البرامج النصية المضمنة)

باستخدام وظيفة [navigator.userAgentData.getHighEntropyValues()](https://developer.mozilla.org/en-US/docs/Web/API/NavigatorUAData/getHighEntropyValues)، يمكن أيضًا الوصول إلى تلميحات العميل عبر واجهة برمجة تطبيقات JavaScript، مما يوفر طريقة مرنة وديناميكية لطلب معلومات محددة حول متصفح المستخدم وجهازه. تتضمن هذه الطريقة استخدام كائن `navigator.userAgentData` ضمن البرنامج النصي لصفحة الويب للاستعلام عن تلميحات العميل. **لا تتطلب هذه الطريقة تعيين رؤوس تلميح العميل، ولكنها تعمل فقط في المتصفحات التي تدعم `navigator.userAgentData` (المتصفحات القائمة على Chromium مثل Chrome وEdge). لا يدعم Firefox وSafari واجهة برمجة التطبيقات هذه، لذلك يجب على المطورين اكتشاف الميزات وتوفير البدائل (fallbacks).**

على سبيل المثال، عند تنفيذ هذه التعليمة البرمجية في Chrome Console على macOS:

```javascript
if (navigator.userAgentData) {
    navigator.userAgentData
        .getHighEntropyValues(["architecture", "model", "platformVersion"])
        .then((ua) => {
            console.log(ua);
        });
}
```

عندما يُحل الوعد (promise resolves)، يتم إرجاع المعلومات ذات الصلة. كما أوضحنا أعلاه، فإن الأسماء ليست متطابقة تمامًا مع الرؤوس ولكنها قريبة جدًا.

![platform version](https://www.corbado.com/website-assets/platform_version_6111c471f1.png)

يتم بعد ذلك إرجاع `platformVersion` في الوعد ويمكن الوصول إليه مباشرة من كود JavaScript المضمن. تغطية هذه الوظيفة أقل بكثير من تقليل User-Agent الفعلي:

![get high entropy list](https://www.corbado.com/website-assets/get_high_entropy_list_75834fcb30.png)

بالإضافة إلى ذلك، لا يقدم Chrome هذه الوظيفة على iOS لأنه ينشر WebKit على iOS بسبب قيود Apple.

لقد قمنا الآن بتجميع أهم الحقائق حول تقليل User-Agent وكيف تقدم تلميحات العميل طريقة للتغلب عليه في Chrome.

## 4. توصية للتعامل مع User-Agents اليوم

اعتمادًا على حالة الاستخدام الخاصة بك، يجب عليك استخدام نهج مختلف لضمان حصول تطبيقك على أفضل نتيجة ممكنة:

- **اكتشاف الميزات (Feature Detection): استخدم واجهات برمجة تطبيقات JavaScript للمتصفح الحالية حيثما أمكن**. كلما كان ذلك ممكنًا، اعتمد على واجهات برمجة تطبيقات المتصفح لاكتشاف الوظائف مباشرة، بدلاً من استخدام User-Agent. هذا أكثر موثوقية وأكثر مقاومة للمستقبل.
- **للمعلومات منخفضة الإنتروبيا، مثل نوع الجهاز: User-Agent كافٍ**. إذا كان تطبيقك يحتاج فقط إلى تحديد نوع الجهاز أو غيرها من التفاصيل منخفضة الإنتروبيا، فستكون سلسلة User-Agent مفصلة بما يكفي. يمكنك أيضًا استخدام واجهات برمجة التطبيقات الحالية لهذه الأغراض.
- **للمعلومات عالية الإنتروبيا والتحكم في النطاق: استخدم نهج الرأس**. إذا كنت بحاجة إلى معلومات مفصلة ولديك تحكم في النطاق، فاستخدم نهج رأس HTTP لطلب معلومات عالية الإنتروبيا حيثما كانت مدعومة (Chrome، Edge). في جميع المتصفحات الأخرى (التي لا ترسل رؤوس تلميحات العميل) استخدم User-Agent الكلاسيكي. قرر ما إذا كنت بحاجة إلى استخدام تلميحات العميل الحرجة بناءً على ما إذا كنت بحاجة إلى المعلومات على الفور أو يمكنك تحمل تأخير طفيف.
- **لمكتبات JavaScript: استخدم getHighEntropyValues**. إذا كنت تقوم بتطوير مكتبة JavaScript، فإن الخيار الأفضل هو استخدام وظيفة navigator.userAgentData.getHighEntropyValues() لطلب معلومات محددة ديناميكيًا حول متصفح المستخدم وجهازه متى تم تحديد هذه الوظيفة، واللجوء إلى مكتبات تحليل User-Agent في الحالات الأخرى.

يلخص الجدول التالي الأماكن التي لا تزال قادرًا فيها على اكتشاف إصدار نظام التشغيل إذا كان لديك وصول إلى User-Agent (UA) وتلميحات العميل (CH):

| **المتصفح**        | **Windows** | **MacOS**    | **iOS**         | **Android**      |
| ------------------ | ----------- | ------------ | --------------- | ---------------- |
| Chrome             | ✅ CH        | ✅ CH        | ❌ (iOS 26+)    | ✅ CH            |
| Edge               | ✅ CH        | ✅ CH        | ❌ (iOS 26+)    | ✅ CH            |
| Firefox            | ❌          | ❌           | ❌ (iOS 26+)    | ❌               |
| Safari             | -           | ✅ UA-Safari | ❌ (Safari 26+) | -                |
| Samsung Internet   | -           | -            | -               | ✅ CH            |
| WebViews           | -           | -            | ❌ (iOS 26+)    | ✅ UA (≥ 16: ❌) |

من خلال اختيار الطريقة المناسبة بناءً على احتياجاتك الخاصة، يمكنك الموازنة بفعالية بين الحاجة إلى معلومات المستخدم التفصيلية واعتبارات الخصوصية والأداء. إذا كنت تعتمد بشكل كبير على معلومات يصعب استخراجها أو تعتمد حقًا على الجهاز، فارجع إلى المكتبات الاحترافية مثل [wurfl](https://web.wurfl.io/) أو [51degrees.com](https://51degrees.com) التي تقوم بالعمل الشاق نيابة عنك. تدعم كلتا المكتبتين دمج تلميحات العميل في الاكتشاف ولها أيضًا طريقتها الخاصة لاكتشاف طرازات iPhone.

## 5. كيفية استخدام User-Agents وتلميحات العميل لمفاتيح المرور

في Corbado، نركز على تطوير حلول حول مفاتيح المرور باستخدام مكونات واجهة المستخدم التي تم تطويرها بشكل أساسي باستخدام React. يتم دمج مكوناتنا في مواقع ويب مختلفة، لذا نتبع توصيتنا الخاصة ونستخدم getHighEntropyValues() أينما كانت متاحة، مع اللجوء إلى التحليل الكلاسيكي لـ User-Agent لجميع الحالات الأخرى. نستخدم هذا بشكل أساسي من أجل:

- **إدارة مفاتيح المرور:** في موقع إدارة مفاتيح المرور الخاص بنا، نعرض جميع المعلومات المتاحة حول الجهاز الذي تم إنشاء مفتاح المرور عليه.
- **المصادقة عبر الأجهزة (Cross-Device-Authentication):** بالنسبة للمصادقة عبر الأجهزة، نستخدم معلومات حول نظام التشغيل لتحديد مدى احتمال دعم العميل للاستفادة من CDA. هذا مهم بشكل خاص عند التمييز بين Windows 10 و11، وهو أمر ممكن فقط مع تلميحات العميل على Chrome وEdge:

![get high entropy value](https://www.corbado.com/website-assets/get_high_entropy_value_538459bd28.png)_مزيد من التفاصيل على: [https://learn.microsoft.com/en-us/microsoft-edge/web-platform/how-to-detect-win11](https://learn.microsoft.com/en-us/microsoft-edge/web-platform/how-to-detect-win11)_

- **ذكاء مفاتيح المرور (Passkey intelligence):** نعتقد أن المنصة يجب أن تقرر ما إذا كان سيتم بدء تسجيل الدخول بمفتاح المرور. لذلك، نقوم بدمج أكبر قدر ممكن من المنطق في مكوناتنا لاكتشاف ما إذا كان يتم استخدام جهاز جديد. في مثل هذه السيناريوهات، يعد إصدار نظام التشغيل الجديد أو الأصغر تلميحًا قيمًا بأن الأشياء ربما تغيرت.

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

## 6. الخاتمة

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

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

تستمر تلميحات العميل في التطور، وقد يزداد اعتمادها مع إدراك المزيد من المتصفحات والمطورين لفوائدها. ومع ذلك، يبقى أن نرى ما إذا كان دعمها سيصبح واسع الانتشار أو ما إذا كان الويب سيستمر في التباعد حول هذا الموضوع.

## الأسئلة المتداولة (FAQ)

### كيف يمكنني الحصول على إصدار iOS الفعلي في تطبيق الويب الخاص بي بعد iOS 26؟

جمدت Apple سلسلة User-Agent الخاصة بـ iOS/iPadOS في Safari 26، الذي تم إصداره في سبتمبر 2025، مما يعني أن إصدار نظام التشغيل لم يعد مكشوفًا عبر User-Agent على أي متصفح يعمل على iOS. على عكس Chrome على Android أو سطح المكتب، لا تتوفر واجهة برمجة تطبيقات تلميحات العميل (Client Hints) على متصفحات iOS، لذا لم يعد إصدار iOS الفعلي قابلاً للوصول برمجيًا.

### ما هو الفرق بين تلميحات العميل العادية وتلميحات العميل الحرجة؟

يتم تضمين تلميحات العميل العادية، المطلوبة عبر رأس الاستجابة `Accept-CH`، فقط في الطلبات اللاحقة وتكون غير متوفرة عند تحميل الصفحة الأولي. تؤدي تلميحات العميل الحرجة إلى إعادة محاولة المتصفح فورًا قبل العرض، مما يضمن توفر التلميح في العرض الأول، ولكن هذا يضيف رحلة ذهاب وإياب من زمن الوصول إلى دورة الطلب.

### لماذا تراجعت Apple عن قرارها الأصلي لعام 2017 بتجميد Safari User-Agent؟

أعلنت Apple عن تجميد User-Agent في Safari Technology Preview 46 في عام 2017 ولكنها تراجعت جزئيًا عن القرار في عام 2021 بسبب مشكلات التوافق الكبيرة مع مواقع الويب التي تعتمد على معلومات User-Agent المحدثة. نفذت Apple لاحقًا نهجًا تدريجيًا لتجميد UA بدلاً من التجميد الكامل الفوري في ذلك الوقت.

### كيف يمكنني اكتشاف إصدار macOS في Safari إذا كانت تلميحات العميل غير مدعومة؟

لا يدعم Safari تلميحات العميل، ولكن يمكن استنتاج إصدار macOS من رقم إصدار Safari في سلسلة User-Agent. يؤدي طرح ثلاثة من الإصدار الرئيسي لـ Safari إلى تعيين الإصدار الرئيسي لـ macOS بشكل موثوق لنظام التشغيل macOS 10.15 وما فوق، بناءً على محاذاة الإصدار المتسقة بين إصدارات Safari وmacOS.

### ما النهج الذي يجب أن يستخدمه مطورو مكتبات JavaScript لاكتشاف الأجهزة عبر المتصفحات؟

النهج الموصى به هو استدعاء `navigator.userAgentData.getHighEntropyValues()` عندما تكون الوظيفة محددة، لتغطية المتصفحات القائمة على Chromium، واللجوء إلى مكتبات تحليل سلسلة User-Agent لـ Firefox وSafari. بالنسبة للحالات التي تتطلب تحديدًا دقيقًا جدًا لطراز الجهاز، توفر المكتبات الاحترافية مثل wurfl أو 51degrees إمكانات اكتشاف إضافية تتجاوز ما تكشفه سلاسل User-Agent.
