الحصول على الأمان والخصوصية من خلال تقسيم ذاكرة التخزين المؤقت

إيجي كيتامورا
إيجي كيتامورا

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

في Chrome، تُستخدم آلية ذاكرة التخزين المؤقت بطرق مختلفة ومثال على ذلك ذاكرة التخزين المؤقت عبر HTTP.

طريقة عمل ذاكرة التخزين المؤقت عبر HTTP في Chrome حاليًا

اعتبارًا من الإصدار 85، يخزِّن Chrome الموارد التي تم جلبها من الشبكة في ذاكرة التخزين المؤقت، باستخدام عناوين URL للموارد المقابلة لها كمفتاح ذاكرة التخزين المؤقت. (يتم استخدام مفتاح ذاكرة التخزين المؤقت لتحديد مورد مخبأ).

يوضح المثال التالي كيفية تخزين صورة واحدة مؤقتًا والتعامل معها في ثلاثة سياقات مختلفة:

مفتاح ذاكرة التخزين المؤقت: https://x.example/doge.png
مفتاح ذاكرة التخزين المؤقت: { https://x.example/doge.png }

ينتقل مستخدم إلى صفحة (https://a.example) تطلب صورة (https://x.example/doge.png). ويتم طلب الصورة من الشبكة ويتم تخزينها مؤقتًا باستخدام https://x.example/doge.png كمفتاح.

مفتاح ذاكرة التخزين المؤقت: https://x.example/doge.png
مفتاح ذاكرة التخزين المؤقت: { https://x.example/doge.png }

ينتقل المستخدم نفسه إلى صفحة أخرى (https://b.example)، تطلب الصورة نفسها (https://x.example/doge.png). يفحص المتصفح ذاكرة التخزين المؤقت لبروتوكول HTTP لمعرفة ما إذا كان قد تم تخزين هذا المورد مؤقتًا باستخدام عنوان URL للصورة كمفتاح. ويعثر المتصفح على تطابق في ذاكرة التخزين المؤقت، لذا يستخدم النسخة المخبأة من المورد.

مفتاح ذاكرة التخزين المؤقت: https://x.example/doge.png
مفتاح ذاكرة التخزين المؤقت: { https://x.example/doge.png }

لا يهم إذا تم تحميل الصورة من داخل iframe. إذا زار المستخدم موقعًا إلكترونيًا آخر (https://c.example) باستخدام إطار iframe (https://d.example) وطلب إطار iframe الصورة نفسها (https://x.example/doge.png)، سيظل بإمكان المتصفح تحميل الصورة من ذاكرة التخزين المؤقت الخاصة به لأنّ مفتاح ذاكرة التخزين المؤقت هو نفسه في جميع الصفحات.

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

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

للحدّ من هذه المخاطر، سيقسّم Chrome ذاكرة التخزين المؤقت المستندة إلى بروتوكول HTTP بدءًا من الإصدار 86 من Chrome.

كيف سيؤثر تقسيم ذاكرة التخزين المؤقت على ذاكرة التخزين المؤقت عبر HTTP في Chrome؟

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

انظر مرة أخرى إلى المثال السابق للتعرّف على آلية تقسيم ذاكرة التخزين المؤقت في سياقات مختلفة:

مفتاح ذاكرة التخزين المؤقت { https://a.example, https://a.example, https://x.example/doge.png}
مفتاح ذاكرة التخزين المؤقت: { https://a.example، https://a.example، https://x.example/doge.png }

يزور أحد المستخدمين صفحة (https://a.example) تطلب صورة (https://x.example/doge.png). في هذه الحالة، يتم طلب الصورة من الشبكة ويتم تخزينها مؤقتًا باستخدام صف يتكون من https://a.example (الموقع الإلكتروني من المستوى الأعلى) وhttps://a.example (موقع الإطار الحالي) وhttps://x.example/doge.png (عنوان URL للمصدر) كمفتاح. (لاحظ أنه عندما يكون طلب المورد من الإطار ذي المستوى الأعلى، فإن موقع المستوى الأعلى وموقع الإطار الحالي في مفتاح عزل الشبكة يكونان متماثلين).

مفتاح ذاكرة التخزين المؤقت { https://a.example, https://a.example, https://x.example/doge.png}
مفتاح ذاكرة التخزين المؤقت: { https://b.example، https://b.example، https://x.example/doge.png }

يزور المستخدم نفسه صفحة مختلفة (https://b.example) تطلب الصورة نفسها (https://x.example/doge.png). وعلى الرغم من تحميل الصورة نفسها في المثال السابق، لن يكون المفتاح مطابقًا لها لن تكون نتيجة ذاكرة التخزين المؤقت.

يتم طلب الصورة من الشبكة وتخزينها مؤقتًا باستخدام صف يتكون من https://b.example وhttps://b.example وhttps://x.example/doge.png كمفتاح.

مفتاح ذاكرة التخزين المؤقت { https://a.example, https://a.example, https://x.example/doge.png}
مفتاح ذاكرة التخزين المؤقت: { https://a.example، https://a.example، https://x.example/doge.png }

يعود المستخدم الآن إلى https://a.example ولكن هذه المرة تكون الصورة (https://x.example/doge.png) مضمّنة في iframe. في هذه الحالة، يكون المفتاح عبارة عن صف يحتوي على https://a.example وhttps://a.example وhttps://x.example/doge.png، وتتم نتيجة تخزين مؤقت. (لاحظ أنه عندما يكون موقع المستوى الأعلى وإطار iframe في الموقع نفسه، يمكن استخدام المورد المخزن مؤقتًا مع إطار المستوى الأعلى.

مفتاح ذاكرة التخزين المؤقت { https://a.example, https://a.example, https://x.example/doge.png}
مفتاح ذاكرة التخزين المؤقت: { https://a.example، https://c.example، https://x.example/doge.png }

عاد المستخدم إلى https://a.example ولكن هذه المرة تتم استضافة الصورة في إطار iframe من https://c.example.

في هذه الحالة، يتم تنزيل الصورة من الشبكة لعدم وجود مورد في ذاكرة التخزين المؤقت يتطابق مع المفتاح الذي يتألف من https://a.example وhttps://c.example وhttps://x.example/doge.png.

مفتاح ذاكرة التخزين المؤقت { https://a.example, https://a.example, https://x.example/doge.png}
مفتاح ذاكرة التخزين المؤقت: { https://a.example، https://c.example، https://x.example/doge.png }

ماذا لو كان النطاق يحتوي على نطاق فرعي أو رقم منفذ؟ ينتقل المستخدم إلى https://subdomain.a.example، الذي يتضمّن إطار iframe (https://c.example:8080)، والذي يطلب الصورة.

ويتم تجاهل النطاقات الفرعية وأرقام المنافذ لأنّه يتم إنشاء المفتاح استنادًا إلى "scheme://eTLD+1". ومن ثم، تحدث زيارة ذاكرة التخزين المؤقت.

مفتاح ذاكرة التخزين المؤقت { https://a.example, https://a.example, https://x.example/doge.png}
مفتاح ذاكرة التخزين المؤقت: { https://a.example، https://c.example، https://x.example/doge.png }

ماذا لو تم تضمين إطار iframe عدة مرات؟ يزور المستخدم علامة https://a.example، التي تتضمّن إطار iframe (https://b.example) يتضمّن إطار iframe آخر (https://c.example) يطلب الصورة في النهاية.

وبما أنّ المفتاح مأخوذ من الإطار العلوي (https://a.example) والإطار المباشر الذي يُحمِّل المورد (https://c.example)، يتم تسجيل نتيجة لذاكرة التخزين المؤقت.

الأسئلة الشائعة

هل هذه الميزة مفعّلة في متصفّح Chrome؟ كيف يمكنني التحقّق؟

يتم طرح الميزة حتى أواخر عام 2020. للتحقق مما إذا كان مثيل Chrome متوافقًا مع ذلك بالفعل أم لا:

  1. افتح chrome://net-export/ واضغط على بدء التسجيل إلى القرص.
  2. حدِّد مكان حفظ ملف السجلّ على جهاز الكمبيوتر.
  3. يمكنك تصفُّح الويب باستخدام Chrome لمدة دقيقة.
  4. ارجِع إلى chrome://net-export/ واضغط على إيقاف التسجيل.
  5. الانتقال إلى https://netlog-viewer.appspot.com/#import.
  6. اضغط على اختيار ملف لتمرير ملف السجلّ الذي حفظته.

ستظهر لك نتيجة ملف السجلّ.

في الصفحة نفسها، ابحث عن SplitCacheByNetworkIsolationKey. إذا كان متبوعًا بالرمز Experiment_[****]، سيتم تفعيل ميزة تقسيم ذاكرة التخزين المؤقت عبر HTTP على Chrome. وإذا كان متبوعًا بـ Control_[****] أو Default_[****]، لن يتم تفعيله.

كيف يمكنني اختبار تقسيم ذاكرة التخزين المؤقت عبر HTTP على Chrome؟

لاختبار تقسيم ذاكرة التخزين المؤقت عبر HTTP على Chrome، يجب تشغيل Chrome باستخدام علامة سطر الأوامر: --enable-features=SplitCacheByNetworkIsolationKey. اتّبِع التعليمات الواردة في تشغيل Chromium باستخدام العلامات للتعرّف على كيفية تشغيل Chrome باستخدام علامة سطر أوامر على نظامك الأساسي.

بصفتي مطوِّر برامج على الويب، هل هناك أي إجراء يجب أن أتخذه استجابةً لهذا التغيير؟

هذا ليس تغييرًا قد يؤدي إلى عطل، ولكنه قد يفرض اعتبارات متعلّقة بالأداء لبعض خدمات الويب.

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

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

ما تأثير هذا التغيير السلوكي؟

ويزداد إجمالي معدّل الخطأ في ذاكرة التخزين المؤقت بنسبة %3.6 تقريبًا، بينما تزداد التغييرات في سرعة عرض المحتوى على الصفحة (FCP) بنسبة ضئيلة (حوالي %0.3)، ويزيد إجمالي عدد وحدات البايت التي يتم تحميلها من الشبكة بحوالي %4. يمكنك الاطّلاع على مزيد من المعلومات حول تأثير ذلك على الأداء في الشرح حول تقسيم ذاكرة التخزين المؤقت عبر HTTP.

هل هذا موحّد؟ هل تعمل المتصفحات الأخرى بشكل مختلف؟

يتم توحيد "أقسام ذاكرة التخزين المؤقت لبروتوكول HTTP" في مواصفات الجلب على الرغم من اختلاف سلوك المتصفحات:

كيف يتم التعامل مع الجلب من العاملين؟

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

المراجِع