لقد عاد SharedArrayBuffer للعمل في المتصفح أخيراً، ولكن فقط عندما تكون الصفحة معزولة عبر الأصول (cross-origin isolated) – وهي حالة تتطلب ترويستين للاستجابة (response headers). أدى إضافة هاتين الترويستين إلى إجباري على التخلي عن كل سكربتات الطرف الثالث في موقعي، وهي خطوة أعادت تشكيل كيفية بناء الواجهة الأمامية بالكامل وما تسربه من بيانات.
لماذا تهم هذه الترويسات
يتيح SharedArrayBuffer تعدد الخيوط الحقيقي (true multithreading) في JavaScript، وهو شرط أساسي لتشغيل ffmpeg داخل علامة تبويب. أعادت المتصفحات الحديثة تمكين هذه الميزة بعد إجراءات التخفيف من مخاطر Spectre، لكنها ربطتها بـ عزل الأصول عبر النطاقات (cross-origin isolation). ولتحقيق هذا العزل، يجب على الخادم إرسال:
Cross-Origin-Opener-Policy: same-originCross-Origin-Embedder-Policy: require-corp
تخبر الترويسة الثانية، require-corp، المتصفح بأن أي مورد خارجي يجب أن يحمل ترويسة Cross-Origin-Resource-Policy أو يتم جلبه باستخدام CORS (Cross-Origin Resource Sharing). معظم خدمات الطرف الثالث لا تضع هذه الترويسات، لذا يتم حظر سكربتاتها وخطوطها وإطاراتها (iframes) مباشرة.
ما الذي فُقد عند تفعيل العزل
في اللحظة التي أصبحت فيها الترويسات مفعلة، ظهرت سلسلة من الإخفاقات:
- التحليلات (Analytics) – يقوم معظم المزودين بتحميل كود التتبع الخاص بهم باستخدام
<script>بسيط يقوم بطلب no-CORS. وبدون ترويسة CORP، يتم رفض الطلب، وبالتالي لا يعمل أداة التتبع أبداً. - Google Fonts – يتم جلب ملف التنسيق (stylesheet) من
fonts.googleapis.comبدون CORS. يقوم المتصفح بالتخلص منه، مما يترك الصفحة بدون خطوطها المخصصة. - الوسائط المضمنة (Embedded media) – تفتقر إطارات YouTube iframe وسكربتات الأدوات (widgets) إلى CORP، لذا تتوقف عن العرض.
- نوافذ OAuth المنبثقة – تنكسر علاقة
window.openerبسبب سياسة "نفس الأصل" (same-origin policy) الصارمة، مما يؤدي إلى تعطل تدفق تسجيل الدخول المعتاد القائم على النوافذ المنبثقة.
باختصار، أي أصل يعتمد على نطاق طرف ثالث قد اختفى ما لم يوافق ذلك النطاق على نظام الترويسات الجديد.
إعادة البناء بدون الوسطاء
بمواجهة موقع معطل، أعدت كتابة حزمة الواجهة الأمامية (front-end stack) حول الأصول المستضافة ذاتياً:
- الخطوط والصور يتم تقديمها الآن من نطاقي الخاص، مما يلغي الحاجة إلى ملفات التنسيق الخارجية.
- واجهات برمجة تطبيقات البيانات (Data APIs) مبنية على خلفية (backend) خاصة أتحكم بها، بحيث تظل كل طلبات داخل نطاقي.
- التحليلات تحولت إلى Cloudflare Worker صغير يقبل أحداث
POSTويخزنها في حاوية (bucket) خاصة. جانب العميل ليس سوى بضعة أسطر من كودfetch. - أدوات الإبلاغ عن الأخطاء وإعادة تشغيل الجلسات مثل Sentry تم التخلي عنها تماماً؛ حيث يتم الآن تسجيل أي عطل في نقطة النهاية (endpoint) الخاصة بي.
إذا كان لا بد من استخدام مورد خارجي، فإن المسار الوحيد الممكن هو تمريره عبر خادم تملكه (proxy)، مع إضافة ترويسة CORP اللازمة قبل أن يراه المتصفح.
مكاسب الخصوصية مقابل التكلفة التشغيلية
الفائدة المباشرة واضحة: لم يعد الموقع يسرب بيانات الاستخدام إلى شبكات الإعلانات، أو مزودي الخطوط، أو منصات الفيديو. تظل جميع بيانات القياس عن بُعد (telemetry) تحت سيطرتي، ويمكنني حذفها متى شئت. هذا المستوى من الخصوصية يصعب تحقيقه مع حزمة الطرف الثالث التقليدية.
المقايضة هي عبء الصيانة الإضافي. استضافة الخطوط، ومعالجة تخزين التحليلات، وإبقاء البروكسي محدثاً هي مهام يستعين معظم المطورين بمصادر خارجية للقيام بها عبر خدمات متخصصة. كما يعني هذا النهج فقدان الميزات التي توفرها تلك الخدمات – على سبيل المثال، تجميع الأخطاء في الوقت الفعلي أو تصورات مسار التحويل (funnel visualisations) المفصلة.
وجهة نظر معارضة: هل سيتكيف النظام البيئي؟
يقول البعض إن بائعي الطرف الثالث سيضيفون في النهاية الترويسات المطلوبة، مما يجعل اعتماد عزل الأصول عبر النطاقات أمراً سهلاً. البعض يفعل ذلك بالفعل، لكن غالبية الخدمات واسعة الاستخدام لا تزال لا تفعل. وإلى أن يلحق النظام البيئي بالركب، يجب على المطورين تحديد ما إذا كانت مزايا الخصوصية تفوق الجهد الهندسي المطلوب للاستضافة الذاتية.
كيف تتحقق من أنك معزول حقاً
قبل أن تبدأ في إعادة الكتابة، تأكد من أن المتصفح يرى صفحتك كصفحة معزولة:
crossOriginIsolated // should be true
typeof SharedArrayBuffer // should be "function"
إذا فشل أي من الفحصين، فهذا يعني أن الترويسات لا يتم تطبيقها بشكل صحيح، وسيبقى SharedArrayBuffer غير متاح.
ما التالي للمطورين؟
مع سعي المزيد من تطبيقات الويب للحصول على دفعة الأداء التي يوفرها JavaScript متعدد الخيوط، سيزداد الضغط على مزودي الطرف الثالث لاعتماد CORP. في هذه الأثناء، يجب على أي مشروع يحتاج إلى SharedArrayBuffer التخطيط لاستراتيجية أصول مستضافة ذاتياً أو طبقة بروكسي خفيفة الوزن. كما سيكون من الضروري مراقبة ملاحظات إصدارات المتصفحات لمعرفة أي تغييرات في متطلبات العزل.
الخلاصة: إن تفعيل عزل المصادر المشتركة (cross-origin isolation) لتمكين استخدام SharedArrayBuffer يفرض خياراً صعباً: إما الحفاظ على سهولة استخدام البرمجيات النصية (scripts) التابعة لجهات خارجية، أو التضحية بها مقابل نموذج خصوصية أكثر صرامة وتحكماً ذاتياً. ويعيد هذا القرار تشكيل كل من البنية التقنية وبصمة تدفق البيانات للمواقع الإلكترونية الحديثة.
