مشاركة المراجع مع نطاقات خارجية بأمان
تمنع سياسة المصدر نفسه في المتصفّح قراءة مرجع من مصدر مختلف. تمنع هذه الآلية المواقع الإلكترونية الضارة من قراءة بيانات المواقع الإلكترونية الأخرى، ولكنها تمنع أيضًا الاستخدامات المشروعة.
غالبًا ما تريد تطبيقات الويب الحديثة الحصول على مراجع من مصدر مختلف، مثلاً، استرداد بيانات JSON من نطاق مختلف أو تحميل صور من موقع إلكتروني آخر في عنصر <canvas>. يمكن أن تكون هذه الموارد عامة ويجب أن تكون متاحة لأي مستخدم، ولكن سياسة المصدر نفسه تمنع استخدامها. استخدم المطوّرون في السابق حلولاً بديلة، مثل
JSONP.
تعالج مشاركة المراجع مع نطاقات خارجية (CORS) هذه المشكلة بطريقة موحّدة. يسمح تفعيل سياسة مشاركة الموارد المتعدّدة المصادر (CORS) للخادم بإخبار المتصفّح أنّه يمكنه استخدام مصدر إضافي.
كيف يعمل طلب المرجع على الويب؟
يمكن للمتصفّح والخادم تبادل البيانات عبر الشبكة باستخدام بروتوكول نقل النص التشعبي (HTTP). يحدّد بروتوكول HTTP قواعد الاتصال بين مقدِّم الطلب والمستجيب، بما في ذلك المعلومات المطلوبة للحصول على مرجع.
يتفاوض عنوان HTTP على تبادل الرسائل بين العميل والخادم، ويُستخدم لتحديد إمكانية الوصول. يتم تقسيم كل من طلب المتصفّح ورسالة استجابة الخادم إلى عنوان ونص.
العنوان
معلومات عن الرسالة، مثل نوعها أو ترميزها. يمكن أن يتضمّن العنوان مجموعة متنوعة من المعلومات المعروضة كأزواج من المفاتيح والقيم. يحتوي عنوان الطلب وعنوان الاستجابة على معلومات مختلفة.
مثال على عنوان الطلب
Accept: text/html
Cookie: Version=1
يعادل هذا العنوان قول "أريد تلقّي HTML في الردّ. إليك ملف تعريف ارتباط لديّ".
مثال على عنوان الاستجابة
Content-Encoding: gzip
Cache-Control: no-store
يعادل هذا العنوان قول "البيانات في هذا الردّ مُرمَّزة باستخدام gzip. لا تخزِّن هذه البيانات مؤقتًا".
النص
الرسالة نفسها. يمكن أن يكون هذا نصًا عاديًا أو صورة ثنائية أو JSON أو HTML أو العديد من التنسيقات الأخرى.
كيف تعمل سياسة مشاركة الموارد المتعدّدة المصادر (CORS)؟
تطلب سياسة المصدر نفسه من المتصفّح حظر الطلبات المتعدّدة المصادر. عندما تحتاج إلى مرجع عام من مصدر مختلف، يُخبر الخادم الذي يوفّر المرجع المتصفّح أنّ المصدر الذي يرسل الطلب يمكنه الوصول إلى المرجع. يتذكّر المتصفّح ذلك ويسمح بمشاركة المراجع مع نطاقات خارجية لهذا المرجع.
الخطوة 1: طلب العميل (المتصفّح)
عندما يقدّم المتصفّح طلبًا من مصدر خارجي، يضيف عنوان Origin مع المصدر الحالي (النظام والمضيف والمنفذ).
الخطوة 2: استجابة الخادم
عندما يرى الخادم هذا العنوان ويريد السماح بالوصول، يضيف عنوان Access-Control-Allow-Origin إلى الاستجابة مع تحديد المصدر الذي يقدّم الطلب (أو * للسماح بأي مصدر).
الخطوة 3: تلقّي المتصفّح للاستجابة
عندما يرى المتصفّح هذه الاستجابة مع عنوان Access-Control-Allow-Origin مناسب، يشارك بيانات الاستجابة مع موقع العميل.
مشاركة بيانات الاعتماد باستخدام سياسة مشاركة الموارد المتعدّدة المصادر (CORS)
لأسباب تتعلّق بالخصوصية، تُستخدم سياسة مشاركة الموارد المتعدّدة المصادر (CORS) عادةً للطلبات المجهولة التي لا يتم فيها تحديد هوية مقدِّم الطلب. إذا كنت تريد إرسال ملفات تعريف الارتباط عند استخدام سياسة مشاركة الموارد المتعدّدة المصادر (CORS)، والتي يمكنها تحديد هوية المُرسِل، عليك إضافة عناوين إضافية إلى الطلب والاستجابة.
طلب
أضِف credentials: 'include' إلى خيارات جلب البيانات كما في المثال التالي.
يتضمّن ذلك ملف تعريف الارتباط مع الطلب على النحو التالي:
fetch('https://example.com', {
mode: 'cors',
credentials: 'include'
})
الردّ
يجب ضبط Access-Control-Allow-Origin على مصدر معيّن (بدون أحرف البدل باستخدام *) ويجب ضبط Access-Control-Allow-Credentials على true.
HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Credentials: true
طلبات مبدئية لمكالمات HTTP المعقّدة
عندما يقدّم تطبيق ويب طلب HTTP معقّدًا، يضيف المتصفّح طلب مبدئي في بداية سلسلة الطلبات.
تحدّد مواصفات سياسة مشاركة الموارد المتعدّدة المصادر (CORS) الطلب المعقّد على النحو التالي:
- طلب يستخدم طرقًا أخرى غير GET أو POST أو HEAD
- طلب يتضمّن عناوين أخرى غير
AcceptأوAccept-LanguageأوContent-Language - طلب يتضمّن عنوان
Content-Typeآخر غيرapplication/x-www-form-urlencodedأوmultipart/form-dataأوtext/plain
تنشئ المتصفّحات تلقائيًا أي طلبات مبدئية ضرورية وتُرسلها قبل رسالة الطلب الفعلية. طلب التحقق المسبق هو طلب OPTIONS مثل المثال التالي:
OPTIONS /data HTTP/1.1
Origin: https://example.com
Access-Control-Request-Method: DELETE
على جانب الخادم، يستجيب التطبيق الذي يتلقّى الطلب لطلب مبدئي بمعلومات عن الطرق التي يقبلها التطبيق من هذا المصدر:
HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET, DELETE, HEAD, OPTIONS
يمكن أن تتضمّن استجابة الخادم أيضًا عنوان Access-Control-Max-Age لتحديد المدة بالثواني لتخزين نتائج الطلب المبدئي مؤقتًا. يسمح ذلك للعميل بإرسال طلبات معقّدة متعددة بدون الحاجة إلى تكرار طلب التحقق المسبق.