Web Caching — إزاي الويب بيبقى أسرع، وإزاي ممكن يتسبب في ثغرات أمنية؟

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

الحل هنا هو Caching — تخزين مؤقت لنسخة من البيانات أو الصفحات، عشان تقلل عدد الطلبات الفعلية على السيرفر وتحسن سرعة التصفح وتوفر الـ Bandwidth.


أين يحدث الكاش؟ (أنواع الكاش في الويب)

الـ Caching بيحصل في أكتر من طبقة بين المستخدم والسيرفر الرئيسي:

  1. Browser Cache (Client-side): المتصفح بيحتفظ بنسخة من الملفات الثابتة (زي HTML, CSS, JS, Images) محليًا على جهازك. لما تزور الصفحة تاني، المتصفح بيحملها من هارد جهازك مباشرة بدل ما يطلبها من النت.

  2. CDN & Proxy Cache (Edge Cache): شبكات توزيع المحتوى (زي Cloudflare أو Fastly) والسيرفرات الوسيطة (Reverse Proxies) بتحتفظ بنسخة من المحتوى في سيرفرات قريبة جغرافيًا من المستخدم لتقليل الـ Latency.

  3. Server-side Cache: السيرفر نفسه بيحتفظ بنتائج العمليات المعقدة (زي نتائج الـ Database Queries أو الـ API Responses) في الذاكرة (زي Redis أو Memcached) عشان يقلل الضغط على قاعدة البيانات.


الـ HTTP Headers التي تتحكم في الكاش

السيرفر بيستخدم مجموعة من الـ Response Headers عشان يعرّف المتصفح والـ CDNs إزاي يتعاملوا مع الصفحة:

1. Cache-Control (الهيدر الأهم)

ده الهيدر الرئيسي وبيحدد سياسة التخزين:

Cache-Control: no-store          ← ممنوع تخزن أي حاجة خالص (للبيانات الحساسة)
Cache-Control: no-cache          ← خزن، بس افحص مع السيرفر الأول قبل ما تستخدم النسخة المخزنة
Cache-Control: public            ← أي حد يقدر يخزن الصفحة (المتصفح، الـ CDN، الـ Proxies)
Cache-Control: private           ← المتصفح بس اللي يقدر يخزن، ممنوع للـ CDNs (للصفحات الشخصية)
Cache-Control: max-age=3600      ← احتفظ بالنسخة لمدة ساعة (3600 ثانية)

باقي الـ Headers المكمّلة:

  • Expires: بيحدد تاريخ ووقت انتهاء صلاحية المحتوى.
  • ETag: معرف فريد للملف بيُستخدم لمقارنة النسخة المحلية بنسخة السيرفر — لو الملف مش اتغير، السيرفر بيرد بـ 304 Not Modified بدل ما يبعت الملف كامل تاني.
  • Last-Modified: يُستخدم لنفس الفكرة، بس بتوقيت آخر تعديل بدل هاش.

المشاكل الأمنية اللي بتيجي من الكاش

  • عرض محتوى قديم أو حساس: لو صفحة فيها بيانات شخصية (زي dashboard حساب مستخدم) اتخزنت بالغلط في CDN cache عام (Cache-Control: public)، أي مستخدم تاني ممكن يشوف بيانات مستخدم غيره لو طلب نفس الـ URL — الثغرة دي معروفة باسم Web Cache Deception أو Cache Poisoning، وهي من أخطر ثغرات الـ Caching، وطلعت في تقارير bug bounty بمكافآت عالية جدًا لأن الـ impact ممكن يوصل لتسريب بيانات مستخدمين كتير في نفس الوقت مش مستخدم واحد بس.
  • Cache Poisoning: لو المهاجم لقى طريقة يتحكم في جزء من الـ response اللي هيتخزن في الكاش (زي عن طريق header معين بيتعكس في الصفحة)، ممكن “يسمم” النسخة المخزنة، وكل مستخدم يفتح نفس الصفحة بعد كده هياخد المحتوى المسموم ده.