اختبار مرونة الأداء والأمان
المرونة هي ما يفعله المنتج حين تتوقف الظروف عن كونها مثالية: تتضاعف الحركة، أو تنتهي مهلة مزوّد الدفع، أو يقصف روبوت نموذج تسجيل الدخول، أو يُعاد إرسال رمز بعد انتهاء صلاحيته. الاختبارات الوظيفية تثبت أن المنتج يعمل؛ واختبار المرونة يثبت أنه يستمر في العمل، ويتدهور بأمان، ويتعافى — تحت الحمل وتحت الفشل وتحت الهجوم.
يتناول هذا الدليل الأجزاء الثلاثة معاً لأنها تفشل معاً في الإنتاج. يعرّف أنواع الاختبار، ويحدد ما يُقاس وكيف يبدو «الجيد» كرقم، ويستعرض خط أساس OWASP لتطبيقات الويب والواجهات البرمجية، ويختم بخطة من صفحة واحدة يمكن للفريق تنفيذها قبل الإطلاق.
ما هو اختبار المرونة؟
اختبار المرونة مجموعة من الأنشطة تقيس كيف يتصرف النظام خارج ظروف تشغيله الاعتيادية. يغطيه المعيار ISO/IEC 25010 تحت ثلاث خصائص جودة — كفاءة الأداء (السلوك الزمني واستخدام الموارد والسعة)، والموثوقية (التوافر وتحمّل الأعطال والقدرة على التعافي)، والأمان (السرية والسلامة والأصالة والمساءلة). وقد يحرز المنتج درجة عالية في الملاءمة الوظيفية ودرجة سيئة في الثلاث كلها.
تختلف عائلات الاختبار الثلاث في الطريقة لكنها تشترك في قاعدة واحدة: يحتاج كل منها إلى هدف مكتوب كرقم قبل تشغيل الاختبار. «ينبغي أن تكون الواجهة البرمجية سريعة» ليس هدفاً؛ أما «زمن استجابة عند المئين 95 أقل من 400 مللي ثانية عند 200 طلب في الثانية مع معدل خطأ أقل من 0.1%» فهو هدف. وبدون الرقم ينتج الاختبار تقريراً لا يستطيع أحد اجتيازه أو الإخفاق فيه.
- الأداء — اختبارات الحمل والإجهاد والتحمّل والذروة المفاجئة: كيف يتصرف النظام مع ارتفاع الطلب، وبعد تجاوز حده، وعلى مدى الزمن.
- الفشل — ما يحدث حين تكون الاعتمادية بطيئة أو خاطئة أو غائبة، وهل يتعافى النظام من تلقاء نفسه.
- الأمان — هل نقاط الضعف الشائعة التي يصنّفها OWASP موجودة، وهل تصمد الضوابط (المصادقة والجلسات والترويسات ومعالجة المدخلات).
اختبار الأداء: الحمل والإجهاد والتحمّل والذروة المفاجئة
يطبّق اختبار الحمل الحركة المتوقعة — نموذج عبء العمل — ويقيس زمن الاستجابة والإنتاجية ومعدل الخطأ مقابل الأهداف. ويرفع اختبار الإجهاد الحمل فوق الذروة المتوقعة حتى ينكسر شيء ما، لإيجاد الحد ورؤية كيف يفشل النظام: ببطء وأمان، أو دفعة واحدة. ويُبقي اختبار التحمّل حملاً واقعياً لساعات لكشف التسريبات والطوابير المتنامية واستنفاد الاتصالات التي لا يراها اختبار العشر دقائق أبداً. ويقفز اختبار الذروة المفاجئة من السكون إلى الذروة في ثوانٍ، وهو ما تفعله حملة تسويقية أو إشارة في الأخبار.
- اختبار الحملالحركة المتوقعة (نموذج عبء العمل)، مع قياس زمن الاستجابة والإنتاجية ومعدل الخطأ مقابل الأهداف.
الخط المرجعي:الذروة المتوقعة
- اختبار الإجهادفوق الذروة المتوقعة حتى ينكسر شيء ما: هل يفشل النظام ببطء وأمان أم دفعة واحدة؟
الخط المرجعي:الذروة المتوقعة
ينكسر شيء ما
- اختبار التحمّلحمل واقعي لساعات لكشف التسريبات والطوابير المتنامية واستنفاد الاتصالات.الزمن · ساعات
الخط المرجعي:الذروة المتوقعة
- اختبار الذروة المفاجئةمن السكون إلى الذروة في ثوانٍ، كما يحدث بعد حملة تسويقية أو إشارة في الأخبار.
الخط المرجعي:الذروة المتوقعة
أشكال توضيحية على مقياس حمل واحد مشترك: الارتفاعات والمدد الزمنية للتوضيح فقط.
نموذج عبء العمل أهم من الأداة. ينبغي أن يأتي من الحركة الحقيقية — أي نقاط النهاية، وبأي مزيج، وبأي بيانات، وبأي تزامن — لا من نقطة نهاية واحدة تُضرب في حلقة. تقبل Apache JMeter وk6 والأدوات المشابهة ملف بيانات للمستخدمين والرموز والحمولات؛ وتوليد تلك البيانات بالتنوع الصحيح (مستخدمون مختلفون وأحجام سجلات مختلفة ومدخلات غير صالحة مختلطة) هو معظم التحضير. شغّل الاختبار على بيئة بحجم الإنتاج، وإلا وصفت الأرقام نظاماً آخر.
- سجّل زمن الاستجابة عند المئينات 50 و95 و99 لا المتوسط — فالمتوسط يخفي الذيل البطيء الذي يشعر به المستخدمون فعلاً.
- سجّل معدل الخطأ ونوعه بشكل منفصل: النظام الذي يبقى سريعاً بإرجاع أخطاء 500 لم ينجح.
- قِس قبل التغيير وبعده بعبء العمل نفسه، لتكون المقارنة صادقة.
- لواجهات الويب أضف مؤشرات Core Web Vitals (LCP وINP وCLS) مقاسة على أجهزة حقيقية؛ فزمن الخادم جزء فقط مما ينتظره المستخدم.
جرّبها: مولّد بيانات اختبار التحميل جرّبها: مولّد بيانات اختبار JMeter جرّبها: مولّد اختبارات الطلبات المتزامنة جرّبها: قياس أداء طلبات HTTP جرّبها: محلّل زمن الاستجابة جرّبها: مقارنة أداء API
الفشل والتعافي: اختبار ما يحدث حين تموت اعتمادية
معظم الانقطاعات لا يسببها النظام قيد الاختبار بل شيء يعتمد عليه: قاعدة بيانات تصبح بطيئة، أو واجهة برمجية خارجية تبدأ بإرجاع 503، أو طابور يمتلئ. الأنماط التي تُبقي الفشل محلياً موثقة جيداً — مهلة لكل استدعاء صادر، وإعادة محاولات بتراجع أسّي وسقف، وقواطع دارة تتوقف عن استدعاء اعتمادية فاشلة، وحواجز تمنع مجمّعاً مستنفَداً من إسقاط البقية، وتدهور رشيق يقدّم نتيجة مختصرة بدل صفحة خطأ. ويبقى كتاب Release It! لمايكل نايجارد المرجع القياسي لأنماط الاستقرار هذه.
اختبار هذه الأنماط يعني إحداث الفشل عمداً. وعلى مستوى الواجهة البرمجية الأمر بسيط: وجّه النظام إلى محاكاة تعيد 500 أو 503 أو 429 مع ترويسة Retry-After، أو تجيب بعد 30 ثانية، أو تعيد جسماً مشوّهاً، وراقب سلوك النظام — هل تنتهي مهلته، ويعيد المحاولة بعقلانية، ويعيد خطأ واضحاً لمستدعيه، ويتعافى حين تعود المحاكاة؟ ويستحق تحديد المعدل اختباراً خاصاً: يعرّف RFC 6585 الحالة 429 Too Many Requests، والعميل الذي يعيد محاولة 429 فوراً يفاقم المشكلة.
- لكل استدعاء صادر مهلة أقصر من مهلة المستدعي نفسه.
- إعادة المحاولات محدودة، وتستخدم التراجع، ولا تعيد الطلبات غير المتكافئة (non-idempotent) على نحو أعمى.
- الاعتمادية الفاشلة تنتج خطأً محدداً مسجَّلاً — لا خطأ 500 عاماً ولا تعليقاً.
- التعافي تلقائي: حين تعود الاعتمادية تستأنف الحركة دون إعادة تشغيل.
جرّبها: محاكي رموز حالة API جرّبها: مولّد استجابات خطأ وهمية جرّبها: مولّد حمولات خطأ وهمية
اختبار الأمان: خط أساس OWASP
اختبار الأمان قبل الإطلاق ليس اختبار اختراق يجريه فريق متخصص — فذلك يأتي لاحقاً ويذهب أعمق. إنه خط أساس: التحقق من غياب نقاط الضعف التي تُكتشف أكثر من غيرها في الاختراقات الحقيقية. تسردها قائمة OWASP Top 10 لتطبيقات الويب (التحكم المعطّل في الوصول، وسوء الإعداد الأمني، والحقن، وإخفاقات المصادقة، وإخفاقات سلسلة توريد البرمجيات، وغيرها) وقائمة OWASP API Security Top 10 للواجهات البرمجية، حيث التفويض المعطّل على مستوى الكائن — مستخدم يقرأ سجل مستخدم آخر بتغيير معرّف — هو الاكتشاف الأكثر شيوعاً. ويحوّل معيار OWASP ASVS هذه إلى متطلبات قابلة للاختبار، ودليل WSTG إلى إجراءات اختبار.
يمكن فحص حصة مفيدة من خط الأساس من الخارج دون أي صلاحية خاصة. تُظهر ترويسات الاستجابة ما إذا كانت HSTS وContent-Security-Policy وX-Content-Type-Options وحماية الإطارات مضبوطة. وتُظهر ملفات تعريف الارتباط ما إذا كان ملف الجلسة يحمل Secure وHttpOnly وSameSite. وتُظهر الرموز ما إذا كانت الخوارزمية مثبّتة والصلاحية قصيرة والجمهور مفحوصاً. ويُظهر CORS ما إذا كانت هناك سياسة أصل أم أن حرف البدل يقوم بعملها. كل واحد من هذه فحص من عشر دقائق، وكل واحد منها تسبب في حوادث حقيقية.
- التحكم في الوصول — كل نقطة نهاية تُختبر برمز صالح للمستخدم الخطأ وللدور الخطأ.
- الحقن — المدخلات التي تصل إلى SQL أو الصدفة أو LDAP أو القوالب تُختبر بقيم عدائية؛ والاستعلامات المعلمية مؤكدة.
- المصادقة والجلسات — قواعد كلمات المرور، والقفل، وعمر الرمز، وتسجيل خروج يبطل الجلسة فعلاً.
- الإعداد — ترويسات الأمان موجودة، والأخطاء المفصّلة معطلة، وبيانات الاعتماد الافتراضية مزالة، وTLS حديث.
- البيانات — البيانات الشخصية مشفرة أثناء النقل وفي التخزين، ولا توجد أبداً في السجلات أو بيئات الاختبار.
جرّبها: محلّل ترويسات الأمان جرّبها: محلّل ملفات تعريف الارتباط (Cookies) جرّبها: مختبِر مصادقة API جرّبها: مفكّك ترميز JWT جرّبها: فاحص CORS
القياس: أهداف مستوى الخدمة وميزانيات الخطأ وما يُحتفظ به
هدف مستوى الخدمة (SLO) هو الهدف المكتوب — «99.9% من الطلبات تنجح خلال 400 مللي ثانية على مدى 30 يوماً» — وميزانية الخطأ هي الفشل الذي يسمح به. تستخدم ممارسة هندسة موثوقية المواقع الموصوفة في كتاب Google SRE هذه الأرقام لتقرير متى يشحن الفريق ميزات ومتى يتوقف لإصلاح الموثوقية؛ والأرقام نفسها هي ما يُفحص اختبار الأداء مقابله قبل الإطلاق وما تراقبه المراقبة بعده.
التخزين المؤقت أرخص عمل للأداء ومن أقلها اختباراً. الاستجابة التي تحمل ترويسات Cache-Control وETag الصحيحة تقدمها المتصفحات وشبكات CDN دون لمس الأصل؛ والتي لا تحمل شيئاً تُجلب في كل مرة. وفحص ترويسات التخزين المؤقت لأثقل نقاط النهاية ينتمي إلى جلسة اختبار الحمل نفسها، لأنه يغيّر الحمل الذي يراه الأصل.
- احتفظ بنموذج عبء العمل ووصف البيئة والنتائج الخام لكل تشغيل؛ فالرقم بلا سياقه لا يمكن مقارنته في الربع القادم.
- أطلق التنبيه على هدف مستوى الخدمة لا على المعالج: المستخدمون يشعرون بزمن الاستجابة والأخطاء لا برسوم الموارد.
- أعد تشغيل حزمة المرونة مع كل إصدار يمس البنية التحتية أو المصادقة أو مساراً ساخناً — لا قبل الإطلاق الأول فقط.
جرّبها: محلّل ترويسات التخزين المؤقت جرّبها: محلّل حجم الاستجابة
السياق التنظيمي في المملكة العربية السعودية
بالنسبة للجهات في المملكة، اختبار المرونة نشاط امتثال أيضاً. تتضمن الضوابط الأساسية للأمن السيبراني (ECC) الصادرة عن الهيئة الوطنية للأمن السيبراني ضوابط لإدارة الثغرات واختبار الاختراق والإعداد الآمن للأنظمة المشمولة، وينظّم نظام حماية البيانات الشخصية كيفية استخدام البيانات الشخصية — وهو ما يستبعد نسخ بيانات العملاء إلى مجموعة بيانات اختبار الحمل. والبيانات الاصطناعية بالشكل الصحيح (صيغ الهواتف السعودية والعناوين الوطنية وأرقام IBAN) تلبي الاختبار والنظام معاً.
- اربط كل نشاط مرونة بضابط ECC الذي يثبته؛ فتقرير الاختبار هو الدليل.
- ولّد بيانات اختبار الحمل والأمان؛ ولا تشتقها أبداً من سجلات الإنتاج.
جرّبها: بيانات اختبار العناوين السعودية جرّبها: مولّد IBAN للاختبار جرّبها: مولّد أرقام هواتف وهمية
خطة اختبار مرونة في صفحة واحدة
- الأهداف: زمن الاستجابة عند المئينين 95 و99، والإنتاجية ومعدل الخطأ عند الحمل المتوقع وحمل الذروة، مكتوبة قبل الاختبار.
- نموذج عبء العمل: مزيج نقاط النهاية وتنوع البيانات والتزامن مأخوذة من الحركة الحقيقية أو توقعات العمل.
- اختبار حمل عند الحمل المتوقع؛ واختبار إجهاد حتى نقطة الانكسار؛ واختبار تحمّل لساعتين على الأقل؛ واختبار ذروة مفاجئة من السكون إلى الذروة.
- حقن الأعطال: كل اعتمادية حرجة تُجعل بطيئة وخاطئة وغير متاحة؛ ويُراقب التعافي.
- خط أساس OWASP: التحكم في الوصول، والحقن، والمصادقة والجلسات، والترويسات وملفات تعريف الارتباط، وCORS، وتسريب البيانات.
- ترويسات التخزين المؤقت متحقق منها على أثقل نقاط النهاية.
- النتائج محفوظة مع سياقها؛ وأهداف مستوى الخدمة والتنبيهات مضبوطة من الأرقام نفسها؛ والحزمة مجدولة لكل تغيير في البنية التحتية أو المصادقة.
الأسئلة الشائعة
ما الفرق بين اختبار الحمل واختبار الإجهاد؟
يطبّق اختبار الحمل الحركة المتوقعة ويتحقق من أن النظام يحقق أهدافه. ويرفع اختبار الإجهاد الحمل فوق الذروة المتوقعة حتى يفشل النظام، لإيجاد الحد ولمعرفة ما إذا كان يفشل بأمان — استجابات أبطأ وأخطاء واضحة — أم بشكل كارثي. وكلاهما مطلوب: الأول يثبت الوعد، والثاني يجد الهامش.
كم عدد المستخدمين الافتراضيين الذي نحتاجه؟
اشتقه من أرقام حقيقية: ذروة الجلسات المتزامنة من التحليلات، أو توقعات العمل لإطلاق ما، مع هامش. المستخدم الافتراضي في JMeter أو k6 يرسل الطلبات في حلقة مع زمن تفكير، لذا «200 مستخدم افتراضي» لا يعني الكثير وحده؛ اذكر الهدف كطلبات في الثانية لكل مزيج نقاط نهاية وحدد عدد المستخدمين للوصول إليه.
هل يكفي ماسح الثغرات لاختبار الأمان؟
يجد الماسح الأنماط المعروفة — الترويسات المفقودة والمكوّنات القديمة وبعض نقاط الحقن — بسرعة وبتكلفة منخفضة، ومكانه في خط الأنابيب. لكنه لا يجد التحكم المعطّل في الوصول، وهو أكثر نقاط الضعف شيوعاً في قائمتي OWASP، لأن ذلك يتطلب معرفة أي مستخدم ينبغي أن يرى أي سجل. واختبار خط الأساس يضيف تلك الفحوص يدوياً؛ واختبار الاختراق يذهب أبعد.
هل ينبغي تشغيل اختبارات الأداء على بيئة الإنتاج؟
اختبارات الحمل والإجهاد لا ينبغي — فهي تُضعف الخدمة للمستخدمين الحقيقيين وقد تُفعّل ضوابط الاحتيال أو تحديد المعدل. شغّلها على بيئة بحجم الإنتاج. أما الفحوص الاصطناعية للقراءة فقط (طلب واحد في الدقيقة يقيس زمن الاستجابة) فآمنة ومفيدة في الإنتاج كمراقبة.
كم مرة ينبغي تكرار اختبار المرونة؟
كاملاً قبل الإطلاق الأول، ثم مع كل إصدار يغيّر البنية التحتية أو المصادقة أو الوصول إلى البيانات أو مساراً عالي الحركة، وعلى جدول ثابت — الربع سنوي شائع — لأن الاعتماديات والحركة تتغير حتى حين لا يتغير الكود.
المراجع
- Apache JMeter User's Manualكيف تُبنى اختبارات الحمل وتُعامَل بالمعاملات وتُشغَّل في JMeter، وكيف تُقرأ مستمعاته وتقاريره.
- Web Vitalsمؤشرات Core Web Vitals (LCP وINP وCLS): ما تقيسه والحدود المطلوبة لتجربة مستخدم جيدة.
- Release It! Second Edition: Design and Deploy Production-Ready Software (Michael T. Nygard)أنماط الاستقرار — المهل الزمنية وقواطع الدائرة والحواجز والضغط العكسي — وأنماط الفشل التي يُفترض أن يكشفها اختبار الحمل.
- Site Reliability Engineering: How Google Runs Production Systemsأهداف مستوى الخدمة وميزانيات الخطأ ومراقبة «الإشارات الذهبية الأربع» والتعامل مع الحمل الزائد — الجانب التشغيلي للمرونة.
- OWASP Top 10:2025أخطر عشرة مخاطر أمنية لتطبيقات الويب، مع كيفية اختبار كل منها والوقاية منه.
- OWASP API Security Top 10 (2023)أكثر عشر نقاط ضعف شيوعاً في واجهات API: خلل التفويض على مستوى الكائن، وخلل التوثيق، والاستهلاك غير المقيد للموارد، وغيرها.
- OWASP Application Security Verification Standard (ASVS)قائمة تحقق بمتطلبات أمنية قابلة للتحقق لتطبيقات الويب، مصنّفة في ثلاثة مستويات ضمان.
- OWASP Web Security Testing Guide (WSTG)المنهجية المرجعية لاختبار تطبيقات الويب وواجهات API بحثاً عن نقاط الضعف الأمنية، اختباراً تلو الآخر.
- NIST SP 800-115: Technical Guide to Information Security Testing and Assessmentكيف تُخطَّط تقييمات الأمان وتُنفَّذ: المراجعة وتحديد الأهداف والتحقق من الثغرات وإعداد التقارير.
- RFC 6585: Additional HTTP Status Codesيعرّف الرموز 428 و429 (طلبات كثيرة جداً) و431 و511، بما فيها ترويسة Retry-After لتحديد المعدل.
- National Cybersecurity Authority — Regulatory documents and controls (Essential Cybersecurity Controls)ضوابط الأمن السيبراني الوطنية السعودية التي تُقاس عليها الجهات في المملكة، بما فيها أمن التطبيقات وإدارة الثغرات.
- ISO/IEC 25010:2023 — Systems and software Quality Requirements and Evaluation (SQuaRE) — Product quality modelنموذج جودة المنتج: الملاءمة الوظيفية وكفاءة الأداء والتوافق وقابلية التفاعل والموثوقية والأمان وقابلية الصيانة والمرونة.
تمرين عملي
قيّم مرونة منصة تذاكر قبل فتح البيع
أنت مهندس الجودة في منصة تذاكر (مثال خيالي) لها موقع ويب وتطبيق جوال. تُطرح تذاكر مباراة افتتاح الموسم للبيع يوم الخميس 22 أكتوبر 2026 الساعة 20:00 بتوقيت الرياض، ويصل إشعار فوري (Push notification) إلى كل مستخدمي التطبيق في الدقيقة نفسها. اليوم هو الثلاثاء 13 أكتوبر. تعرض المادة أدناه توقعات الحركة والأهداف التي اتفق عليها مالك المنتج، ومسودة خطة مرونة كتبها زميل، ونتائج التشغيلات التجريبية الأولى على staging-perf، وهي بيئة أداء بحجم الإنتاج: أربعة تشغيلات أداء، وخمسة فحوص لحقن الأعطال مع محاكاة (Mock) لبوابة الدفع، وخمس ملاحظات من خط أساس الأمان.
اعمل على الورق، واستخدم خطة الصفحة الواحدة في الدليل قائمةَ تحقق. اكتب لكل نتيجة حكماً (ناجح، أو فشل، أو لا يُحكم عليه مقابل الأهداف) مع الرقم أو القاعدة التي يستند إليها. تساعدك أداتا Security Header Analyzer وCookie Analyzer في S1، وأداة Unix Timestamp Converter في S2. خصّص لذلك 60–90 دقيقة.
أُجريت فحوص الأمان في المادة على بيئة الاختبار الخاصة بالمنصة بإذن مكتوب من مالكها. ولا تُجرِ مثل هذه الفحوص إلا على أنظمة تملكها أو لديك إذن مكتوب باختبارها.
منصة تذاكر (مثال خيالي) - موقع ويب وتطبيق جوال
البيع: مباراة افتتاح الموسم، الخميس 22 أكتوبر 2026، 20:00–24:00 بتوقيت الرياض.
يصل إشعار فوري (Push) إلى كل مستخدمي التطبيق الساعة 20:00. اليوم: الثلاثاء 13 أكتوبر 2026.
توقعات الحركة (من فريق الأعمال)
مساء عادي: 40 طلباً في الثانية (req/s).
البيع: 450 طلباً في الثانية من الدقيقة الأولى بعد 20:00، ثم 300 من 21:00 حتى 24:00.
مزيج نقاط النهاية: خريطة المقاعد 55%، تسجيل الدخول برمز SMS بنسبة 10%،
حجز المقاعد مؤقتاً 20%، الدفع 10%، حالة الطلب 5%.
الأهداف المتفق عليها مع مالك المنتج في 1 أكتوبر
الهدف T1، خريطة المقاعد GET /api/events/{id}/seatmap:
p95 لا يتجاوز 800 مللي ثانية، وp99 لا يتجاوز 1,500 مللي ثانية.
الهدف T2، الدفع POST /api/orders/{id}/pay (يشمل بوابة الدفع):
p95 لا يتجاوز 3,000 مللي ثانية.
الهدف T3، معدل الخطأ أقل من 0.1% (أخطاء 5xx، وانتهاء المهلة، و429 التي ترسلها المنصة).
تنطبق الأهداف الثلاثة مع مزيج نقاط النهاية من الدقيقة الأولى للبيع حتى نهايته.
مسودة خطة المرونة، الإصدار 0.1 (كتبها زميل)
1 الهدف: أن يكون الموقع سريعاً وألا يتعطل أثناء البيع.
2 اختبار الحمل: 200 مستخدم افتراضي يستدعون GET /api/events/77/seatmap في حلقة،
لمدة 10 دقائق.
3 التشغيل على بيئة الإنتاج الساعة 03:00 حين لا يشتري أحد، لتكون الأرقام حقيقية.
4 النجاح إذا كان متوسط زمن الاستجابة أقل من ثانية واحدة.
5 بيانات الاختبار: تصدير 50,000 عميل من الموسم الماضي من بيئة الإنتاج.
6 اختبار التحمّل: 15 دقيقة.
7 الأمان: تشغيل ماسح الثغرات في الليلة السابقة للبيع.
التشغيلات التجريبية على staging-perf (بحجم الإنتاج، بمزيج نقاط النهاية وبيانات اصطناعية)
زمن الاستجابة بالمللي ثانية؛ والأخطاء نسبة من كل الطلبات.
التشغيل R1، اختبار حمل: 450 طلباً في الثانية لمدة 30 دقيقة
خريطة المقاعد: المتوسط 240، p50 180، p95 620، p99 1,350
الدفع: p95 2,400؛ الأخطاء: 0.04%، وكلها 503
التشغيل R2، اختبار ذروة مفاجئة: من 40 إلى 450 طلباً في الثانية خلال 30 ثانية
خريطة المقاعد: المتوسط 520، p50 210، p95 2,900، p99 7,800
الدفع: p95 5,100؛ الأخطاء: 2.1%، من نوع 500 و504
الأرقام لأول 5 دقائق بعد القفزة؛ ومن الدقيقة 6 تطابق القيم قيم R1.
التشغيل R3، اختبار تحمّل: 300 طلب في الثانية لمدة 4 ساعات
الساعة 1، خريطة المقاعد: المتوسط 170، p50 150، p95 540، p99 1,100
الدفع: p95 2,300؛ الأخطاء: 0.02%
الساعة 4، خريطة المقاعد: المتوسط 410، p50 230، p95 1,450، p99 3,900
الدفع: p95 4,800؛ الأخطاء: 0.9%
اتصالات قاعدة البيانات المستخدمة: 60 من 200 في الساعة 1، و200 من 200 في الساعة 4.
التشغيل R4، اختبار إجهاد: من 450 طلباً في الثانية، بزيادة 50 كل 5 دقائق حتى الانكسار
تبقى الأخطاء دون 0.1% حتى خطوة 800 طلب في الثانية، وينكسر عند 850 طلباً في الثانية:
تكون 41% من الاستجابات 503 (صفحة HTML عامة)،
وينخفض p95 لخريطة المقاعد إلى 95 مللي ثانية.
وعند العودة إلى 450 طلباً في الثانية تنخفض الأخطاء إلى أقل من 0.1% خلال دقيقتين،
دون إعادة تشغيل.
حقن الأعطال على staging-perf: استُبدلت بوابة الدفع بمحاكاة (Mock)
الفحص F1: تعيد المحاكاة جسم JSON مشوّهاً. تسجّل خدمة الدفع «gateway response invalid»،
ويعرض التطبيق «فشل الدفع، لم يُخصم أي مبلغ»، ويبقى الطلب غير مدفوع.
الفحص F2: تجيب المحاكاة بعد 30 ثانية. تنتهي مهلة بوابة API (API gateway) أمام المنصة
عند 20 ثانية ويعرض التطبيق «حدث خطأ ما»؛ وتنتظر خدمة الدفع حتى 60 ثانية،
ويصبح الطلب «مدفوع» بعد 31 ثانية من الطلب.
الفحص F3: تعيد المحاكاة 503. تعيد خدمة الدفع إرسال POST /charges ثلاث مرات دفعة واحدة،
دون مفتاح منع التكرار (Idempotency key). سجل المحاكاة: 4 طلبات خصم لطلب واحد.
الفحص F4: تعيد المحاكاة 429 مع Retry-After: 30. تعيد خدمة الدفع المحاولة 10 مرات
خلال ثانية واحدة، ثم تعيد إلى التطبيق 500 Internal Server Error.
الفحص F5: المحاكاة غير متاحة 5 دقائق ثم تعود. يستمر فشل الدفع حتى إعادة تشغيل
خدمة الدفع بعد 25 دقيقة.
خط أساس الأمان على بيئة الاختبار (بإذن مكتوب من مالك المنصة)
الملاحظة S1: ترويسات استجابة GET https://staging.tickets.example/
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
X-Content-Type-Options: nosniff
Set-Cookie: sid=7f3c9a51e2; Path=/; Secure
الملاحظة S2: رمز الوصول في تطبيق الجوال بعد تسجيل الدخول، مفكوك الترميز
header {"alg":"HS256","typ":"JWT"}
payload {"sub":"u-1042","role":"customer","iat":1791874800,"exp":1794466800}
الملاحظة S3: برمز العميل u-1042 يُرسل GET /api/orders/88213 (طلب يخص العميل u-2210)
النتيجة: 200 OK مع اسم ذلك العميل ورقم جواله ومقاعده
الملاحظة S4: يُرسل OPTIONS /api/orders مع Origin: https://unknown-site.example
Access-Control-Allow-Origin: https://unknown-site.example
Access-Control-Allow-Credentials: true
الملاحظة S5: جسم استجابات 500 أثناء R2
{"error":"TimeoutError: pool exhausted at /srv/app/db/pool.js:41"}- راجع مسودة الخطة مقابل الدليل: اكتب ما الخطأ في كل بند وما الناقص، ثم أعد كتابتها خطة مرونة من صفحة واحدة لهذا البيع.
- احكم على التشغيلات R1–R4 مقابل الأهداف T1–T3 هدفاً هدفاً، واكتب ما يخبرك به كل تشغيل بعد الأرقام. هل كان معيار النجاح في المسودة سيكشف المشكلات؟
- لكل فحص من F1–F5 قرّر هل السلوك مقبول؛ وإن لم يكن، فسمِّ قاعدة الاستقرار التي يخالفها من الدليل، واكتب السلوك المتوقع.
- لكل ملاحظة من S1–S5 اكتب المشكلة، والجزء الذي تنتمي إليه من خط أساس OWASP، والنتيجة المتوقعة. ثم اذكر فحوص خط الأساس التي لا تغطيها المادة بعد.
- اكتب مذكرة القرار (Go/No-go) لمدير الإصدار: ما يجب إصلاحه وإعادة اختباره قبل البيع، وما يُصلَح أيضاً، وما يُعاد تشغيله بعد الإصلاحات، وما يُحتفظ به من هذه التشغيلات.
إظهار الإجابة النموذجية
مسودة الخطة بنداً بنداً. البند 1: «سريع» و«لا يتعطل» ليسا هدفين؛ يحتاج الاختبار إلى رقم قبل تشغيله، والأهداف T1–T3 تعطي بالفعل مئينات وحملاً ومعدل خطأ. البند 2: نقطة نهاية واحدة في حلقة ليست نموذج عبء العمل، وهو هنا 450 طلباً في الثانية بمزيج نقاط النهاية المتفق عليه. وعبارة «200 مستخدم افتراضي» لا تعني الكثير وحدها، لأن المستخدم الافتراضي ينتظر زمن تفكير بين الطلبات: اذكر الحمل بالطلبات في الثانية، وحدّد عدد المستخدمين الافتراضيين حتى تصل الأداة إليه. البند 3: لا تُشغَّل اختبارات الحمل على بيئة الإنتاج، لا في الساعة 03:00 ولا في غيرها: فهي تُضعف الخدمة للعملاء الحقيقيين وقد تُفعّل ضوابط الاحتيال أو تحديد المعدل، ومنها ضوابط بوابة الدفع. استخدم staging-perf، ولا يُشغَّل في الإنتاج إلا فحوص اصطناعية للقراءة فقط بوصفها مراقبة. البند 4: المتوسط يخفي الذيل البطيء؛ سجّل p50 وp95 وp99، وسجّل معدل الخطأ ونوعه كلاً على حدة. البند 5: نسخ 50,000 عميل حقيقي يخالف نظام حماية البيانات الشخصية وقاعدة الدليل؛ ولّد بيانات اصطناعية بالشكل الصحيح (أسماء، وأرقام جوال سعودية، وحسابات واختيارات مقاعد كثيرة ومتنوعة، وبعض الطلبات غير الصالحة). البند 6: اختبار تحمّل مدته 15 دقيقة لا يرى شيئاً لا يراه اختبار الحمل؛ والبيع يستمر أربع ساعات، فيُشغَّل اختبار التحمّل عند 300 طلب في الثانية أربع ساعات على الأقل. البند 7: يجد الماسح الأنماط المعروفة لكنه لا يجد التحكم المعطّل في الوصول، وتشغيله في الليلة السابقة للبيع لا يترك وقتاً لإصلاح أي شيء؛ مكانه خط الأنابيب من الآن، إلى جانب فحوص خط الأساس اليدوية.
وما ينقص الخطة كلياً: اختبار ذروة مفاجئة، مع أن الإشعار الفوري ينقل المنصة من نحو 40 إلى 450 طلباً في الثانية خلال ثوانٍ؛ واختبار إجهاد يجد الهامش؛ وحقن أعطال على بوابة الدفع ومزوّد SMS؛ وفحص التخزين المؤقت؛ وقاعدة لحفظ النتائج. خطة من صفحة واحدة لهذا البيع. الأهداف: T1–T3 بمزيج نقاط النهاية عند 450 طلباً في الثانية وعند 300 طلب في الثانية، طوال البيع من 20:00 حتى 24:00، مكتوبة قبل الاختبار. نموذج عبء العمل: مزيج التوقعات، ومستخدمون ورموز اصطناعية، وحجوزات مقاعد موزعة على الملعب مع تنافس على المقاعد نفسها، ونسبة من الطلبات غير الصالحة. التشغيلات على staging-perf: اختبار حمل عند 450 طلباً في الثانية لمدة 30 دقيقة؛ واختبار ذروة مفاجئة من 40 إلى 450 طلباً في الثانية في أقل من دقيقة؛ واختبار إجهاد من 450 طلباً في الثانية صعوداً حتى نقطة الانكسار؛ واختبار تحمّل عند 300 طلب في الثانية أربع ساعات على الأقل. حقن الأعطال: تُجعل بوابة الدفع ومزوّد SMS كلٌّ منهما بطيئاً وخاطئاً (جسم مشوّه، و500، و503، و429 مع Retry-After) وغير متاح، ويُراقب التعافي. خط أساس OWASP: التحكم في الوصول برمز صالح لمستخدم خطأ ولدور خطأ، والحقن، وتسجيل الدخول والجلسات، والترويسات وملفات تعريف الارتباط، والرموز، وCORS، والأخطاء المفصّلة، والبيانات الشخصية في السجلات. التخزين المؤقت: Cache-Control وETag على أثقل الاستجابات (صفحات الفعالية، والصور، ومخطط المقاعد)، مع مقارنتها بمدى الحداثة التي تحتاجها كل استجابة. السجلات: نموذج عبء العمل ووصف البيئة والنتائج الخام لكل تشغيل؛ وتنبيهات أهداف مستوى الخدمة (SLO) مضبوطة من T1–T3؛ وإعادة تشغيل الحزمة مع كل إصدار يمس البنية التحتية أو المصادقة أو مسار البيع.
R1: ناجح. p95 لخريطة المقاعد 620 ≤ 800 وp99 1,350 ≤ 1,500 (T1)، وp95 للدفع 2,400 ≤ 3,000 (T2)، والأخطاء 0.04% < 0.1% (T3): المنصة تفي بوعدها عند ذروة ثابتة. R2: فشل في الأهداف الثلاثة. p95 لخريطة المقاعد 2,900 وp99 7,800 مقابل 800 و1,500، وp95 للدفع 5,100 مقابل 3,000، والأخطاء 2.1% مقابل 0.1%. تنطبق الأهداف T1–T3 من الدقيقة الأولى، والإشعار يحوّل الدقائق الأولى إلى ذروة مفاجئة، لذلك فإن R2 هو ما سيبدو عليه افتتاح البيع: إنه يوقف الإطلاق. ومن الدقيقة السادسة تطابق القيم قيم R1، أي أن المنصة تلحق بالحمل، لكن بعد فوات الأوان على المشترين الأوائل. وكان معيار المسودة سيعدّ هذا التشغيل ناجحاً: المتوسط 520 مللي ثانية أقل من ثانية، بينما يستغرق طلب من كل عشرين 2.9 ثانية أو أكثر.
R3: ناجح في الساعة الأولى، وفشل في الساعة الرابعة. p95 لخريطة المقاعد 1,450 وp99 3,900، وp95 للدفع 4,800، والأخطاء 0.9% كلها تتجاوز أهدافها مع أن الحمل لم يتغير، واتصالات قاعدة البيانات المستخدمة ترتفع من 60 إلى الحد الأقصى للمجمّع 200. هذا نمط اتصالات تؤخذ ولا تُعاد، ولا يكشفه إلا اختبار يستمر ساعات. وهو يوقف الإطلاق أيضاً لأن البيع يستمر أربع ساعات؛ وكان اختبار التحمّل ذو الدقائق الخمس عشرة في المسودة ومعيار المتوسط فيها (410 مللي ثانية في الساعة الرابعة) سيفوّتانه كلاهما. R4: لا يُحكم عليه مقابل T1–T3 لأن الحمل فوق الهدف؛ فاختبار الإجهاد يجيب عن سؤالين آخرين. أين الحد؟ تبقى الأخطاء دون 0.1% حتى 800 طلب في الثانية وتقفز عند 850، فالحد بينهما؛ سجّل آخر خطوة صمدت، 800 طلب في الثانية، أي قرابة 1.8 ضعف ذروة التوقعات، بوصفها الهامش. وكيف يفشل؟ على نحو سيئ: خطوة واحدة من 50 طلباً في الثانية ترفع الأخطاء من أقل من 0.1% إلى 41% مع أن الحمل زاد نحو 6% فقط، أي أنه يفشل دفعة واحدة لا ببطء وأمان. والنصف الجيد أنه يتعافى وحده خلال دقيقتين دون إعادة تشغيل. وليس p95 البالغ 95 مللي ثانية أداءً جيداً أيضاً؛ إنه منخفض فقط لأن 41% من الإجابات أخطاء سريعة، والنظام الذي يبقى سريعاً بإرجاع الأخطاء لم ينجح. وصفحة HTML عامة إجابة خاطئة أيضاً لواجهة برمجية؛ المتوقع: خطأ 503 واضح يستطيع التطبيق عرضه، مع ترويسة Retry-After (يسمح بها RFC 9110 مع 503)، وأخطاء تزداد بقدر الحمل الزائد بدل أن تقفز.
F1: مقبول. الإجابة المشوّهة تنتج خطأً محدداً مسجَّلاً، ورسالة واضحة، وطلباً غير مدفوع. F2: فشل. تنتظر خدمة الدفع البوابة حتى 60 ثانية، أي أكثر مما ينتظر مستدعيها نفسه، بوابة API (20 ثانية)، فيرى العميل خطأً بينما يتم الدفع بعد 11 ثانية، وقد يدفع مرة ثانية. المتوقع: مهلة للاستدعاء الصادر أقل بوضوح من 20 ثانية؛ وحين تكون النتيجة غير معروفة، يبيّن الطلب أن الدفع قيد التأكيد، ويتحقق التطبيق من حالة الطلب بدل أن يعرض الدفع مجدداً. F3: فشل، ويوقف الإطلاق. طلب غير متكافئ (non-idempotent) يُعاد على نحو أعمى، ثلاث مرات دفعة واحدة دون تراجع؛ ومع البوابة الحقيقية، فإن خصماً تمّ لكن ضاعت إجابته أو تأخرت سيُخصم مرة أخرى. المتوقع: لا إعادة تلقائية لـ POST /charges، أو إعادة محدودة بتراجع فقط مع مفتاح منع تكرار تدعمه البوابة. F4: فشل. عشر محاولات خلال ثانية تتجاهل Retry-After: 30؛ يعرّف RFC 6585 الحالة 429 ويتيح للخادم أن يقول متى يُعاد الطلب، والإعادة الفورية تزيد الحمل على بوابة طلبت للتو حملاً أقل. ثم يتلقى التطبيق خطأ 500 عاماً. المتوقع: لا طلب جديد قبل وقت Retry-After، وخطأ محدد يستطيع التطبيق عرضه، مثل أن الدفع مزدحم ويمكن للعميل المحاولة بعد 30 ثانية. F5: فشل، لأن التعافي ليس تلقائياً. المتوقع: حين تعود البوابة يُستأنف الدفع دون إعادة تشغيل، وهذا ما يوفره قاطع دارة يجرّب الاعتمادية من جديد بعد مهلة. لم يُختبر بعد: الفحوص نفسها لمزوّد SMS، فبلا الرمز لا يستطيع أحد تسجيل الدخول.
S1: ترويسة X-Content-Type-Options: nosniff وسمة Secure في ملف تعريف الارتباط صحيحتان. الناقص (الإعداد): Strict-Transport-Security وContent-Security-Policy وحماية الإطارات (X-Frame-Options أو توجيه frame-ancestors في CSP). ولا يحمل ملف الجلسة HttpOnly، فيستطيع أي سكربت في الصفحة قراءته، ومنه سكربت محقون عبر عيب من نوع البرمجة النصية عبر المواقع (XSS)، ولا يحمل SameSite (الجلسات)؛ اضبط السمتين صراحةً بدل الاعتماد على الإعدادات الافتراضية للمتصفحات، فهي تختلف. S2 (المصادقة والجلسات، عمر الرمز): exp - iat يساوي 2,592,000 ثانية، أي 30 يوماً، من 13 أكتوبر إلى 12 نوفمبر 2026، الساعة 07:00 UTC. رمز الوصول المسرَّب يعمل شهراً كاملاً؛ والمتوقع: عمر قصير يُتفق عليه مع الفريق، بالدقائق، ويُجدَّد برمز التحديث (Refresh token). ولا توجد مطالبة aud، فلا تستطيع أي واجهة برمجية التحقق من أن الرمز صدر لها. ولا يُظهر الرمز هل يثبّت الخادم الخوارزمية: اختبر ذلك على بيئة الاختبار برمز تقول ترويسته none وليس له توقيع؛ والمتوقع 401.
S3 (التحكم في الوصول): تفويض معطّل على مستوى الكائن، وهو API1:2023 في OWASP API Security Top 10، والتحكم المعطّل في الوصول في OWASP Top 10. عميل يقرأ البيانات الشخصية لعميل آخر بتغيير معرّف. الخطورة: حرج (Critical)، وهو يوقف الإطلاق. المتوقع: 403 أو 404 لطلب لا يخص المستدعي. كرّر الفحص على كل نقطة نهاية تأخذ معرّفاً (الطلبات، والتذاكر، وحجوزات المقاعد) وبالدور الخطأ، أي برمز عميل على نقاط نهاية الموظفين؛ ولم يكن الماسح ليجده. S4 (CORS): تعكس الواجهة البرمجية أي أصل وتسمح ببيانات الاعتماد، فلا تفعل سياسة الأصل شيئاً. وهذا أسوأ من حرف البدل: المتصفحات ترفض * مع بيانات الاعتماد، لكنها تقبل الأصل المعكوس. المتوقع: قائمة سماح بأصول المنصة نفسها، ولا Access-Control-Allow-Origin لأي أصل آخر. S5 (الإعداد): الأخطاء المفصّلة مفعّلة، واستثناء مع مسار ملف يخبر أي شخص كيف بُني النظام. المتوقع: جسم خطأ عام مع معرّف ارتباط (Correlation id)، والتفاصيل في السجل فقط. وهو أيضاً دليل على سبب R2 وR3: مجمّع اتصالات قاعدة البيانات ينفد تحت الذروة المفاجئة ويُستنزف أثناء اختبار التحمّل. لم يُغطَّ بعد: الحقن على كل مدخل يصل إلى قاعدة البيانات؛ وحدود محاولات رمز SMS وإعادة إرساله؛ وتسجيل خروج يبطل الجلسة والرمز فعلاً؛ وإعداد TLS؛ والبيانات الشخصية في السجلات.
مذكرة مدير الإصدار. القرار: لا إطلاق للبيع بالحالة التي اختُبرت (No-go). يجب إصلاحه وإعادة اختباره قبل 22 أكتوبر: R2 (الدقائق الأولى تتجاوز كل هدف)، وR3 (تنفد الاتصالات بحلول الساعة الرابعة)، وF2 وF3 (قد يُخصم من العملاء مرتين)، وF5 (لا تعافي دون إعادة تشغيل)، وS3 (يستطيع العملاء قراءة طلبات بعضهم). ويُصلَح أيضاً قبل البيع، مع إعادة فحص سريعة لكل منها: F4 وS1 وS2 وS4 وS5، واستجابة الحمل الزائد التي ظهرت في R4. ويبقى تشغيله قبل البيع: حقن الأعطال على مزوّد SMS، وفحوص خط الأساس التي لم تُغطَّ بعد. بعد الإصلاحات: اختبار التأكيد لكل بند فشل، ومنه اختبار التحمّل كاملاً لأربع ساعات؛ وR1 مرة أخرى بوصفه اختبار انحدار بعبء العمل نفسه، لأن الإصلاحات تمس مسار البيع ويجب أن تكون المقارنة صادقة؛ وR4 مرة أخرى لتسجيل الهامش الجديد. احتفظ بنموذج عبء العمل ووصف staging-perf والنتائج الخام لـ R1–R4 مع المذكرة، واضبط تنبيهات مساء البيع على T1–T3، وإن كانت المنصة ضمن نطاق الضوابط الأساسية للأمن السيبراني (ECC) الصادرة عن الهيئة الوطنية للأمن السيبراني، فاحفظ التقرير دليلاً على الضوابط المرتبطة.
للتحقق من عملك: R1 هو التشغيل الوحيد الناجح، وR4 الوحيد الذي لا يُحكم عليه مقابل الأهداف؛ ومن F1–F5 لا يُقبل إلا F1، ومن S1–S5 لا يصح إلا ترويسة nosniff وسمة Secure في ملف تعريف الارتباط. إن عددت R2 أو R3 ناجحاً لأن المتوسط بقي دون ثانية، فأعد قراءة بند المئينات في الدليل؛ وإن عددت 95 مللي ثانية في R4 خبراً جيداً، فأعد قراءة البند عن النظام الذي يبقى سريعاً بإرجاع الأخطاء. ولا بأس بتقسيم مختلف بين ما يوقف الإطلاق وبقية الإصلاحات ما دام لكل قرار سببه؛ أما الحكم الذي لا يستند إلى رقم أو قاعدة فغير مقبول.
تقدّمك في هذا الموضوع
سجّل الدخول لتتابع تقدّمك
علّم الموضوعات مكتملة، وتابع من حيث توقفت، وافتح امتحانات التخصص.
جزء من مسار تعلم ضمان الجودة
قبل هذا الموضوع
الموضوعات التالية
الأدوات المذكورة في هذا الدليل
ولّد مجموعات معاملات كبيرة (مستخدمين ورموزاً ومعرّفات وحمولات) لاختبارات التحميل في k6 وJMeter وGatling وLocust.
ولّد بيانات اختبار جاهزة لـ JMeter (ملفات CSV Data Set Config ومتغيّرات User Defined Variables) انطلاقاً من مخطط الحقول.
ولّد ملفات CSV لعنصر CSV Data Set Config في JMeter باقتباس وفواصل وترميزات صحيحة.
ولّد سكربتات اختبار التزامن (k6 وJMeter JMX وLocust وArtillery وNode.js) بإعدادات افتراضية آمنة لنقطة نهاية مستهدفة.
شغّل قياس أداء صغيراً وآمناً على نقطة نهاية عامة (بعدد طلبات وتزامن محدودَين) واحصل على الإنتاجية ومئينيات زمن الاستجابة.
قِس زمن استجابة نقطة نهاية عبر عدة عيّنات: الحد الأدنى والأقصى والمتوسط والوسيط وp95.
قارن أزمنة الاستجابة والأحجام بين نقطتي نهاية (مثل v1 مقابل v2، أو staging مقابل الإنتاج) جنباً إلى جنب.
حلّل حجم الاستجابة: البايتات الخام مقابل المضغوطة، وحجم الترويسات، ووزن بنية JSON، وأكبر الحقول.
احصل على نقطة نهاية عامة تعيد أي رمز حالة HTTP، مع تأخير اختياري وجسم JSON مخصّص، لاختبار معالجة الأخطاء في العميل.
ولّد استجابات خطأ منظّمة (التحقق والمصادقة وعدم العثور وتحديد المعدّل وخطأ الخادم) بالصيغ الشائعة.
تقييم ترويسات أمان HTTP (CSP وHSTS وX-Frame-Options وReferrer-Policy وPermissions-Policy وCOOP/CORP) من ترويسات ملصقة أو عنوان URL عام.
تحليل ترويسات Set-Cookie والتحقق من أفضل الممارسات في Secure وHttpOnly وSameSite وDomain وPath وانتهاء الصلاحية والحجم.
اختبر مصادقة Bearer وBasic ومفتاح API والترويسات المخصّصة على نقطة نهاية وقارن الاستجابات المصرّح بها بغير المصرّح بها.
فكّ ترميز ترويسة JWT وحمولته، وفحص المطالبات (claims) والتحقق من انتهاء الصلاحية — بالكامل داخل متصفحك.
اختبار إعدادات CORS: إرسال طلبات تمهيدية (preflight) وطلبات بسيطة من أصل محدّد وفحص ترويسات Access-Control-*.
تحليل ترويسات Cache-Control وExpires وETag وLast-Modified وVary وAge، وشرح كيفية تخزين المتصفحات وشبكات CDN للاستجابة مؤقتاً.