اختبار مرونة الأداء والأمان

المرونة هي ما يفعله المنتج حين تتوقف الظروف عن كونها مثالية: تتضاعف الحركة، أو تنتهي مهلة مزوّد الدفع، أو يقصف روبوت نموذج تسجيل الدخول، أو يُعاد إرسال رمز بعد انتهاء صلاحيته. الاختبارات الوظيفية تثبت أن المنتج يعمل؛ واختبار المرونة يثبت أنه يستمر في العمل، ويتدهور بأمان، ويتعافى — تحت الحمل وتحت الفشل وتحت الهجوم.

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

ما هو اختبار المرونة؟

اختبار المرونة مجموعة من الأنشطة تقيس كيف يتصرف النظام خارج ظروف تشغيله الاعتيادية. يغطيه المعيار ISO/IEC 25010 تحت ثلاث خصائص جودة — كفاءة الأداء (السلوك الزمني واستخدام الموارد والسعة)، والموثوقية (التوافر وتحمّل الأعطال والقدرة على التعافي)، والأمان (السرية والسلامة والأصالة والمساءلة). وقد يحرز المنتج درجة عالية في الملاءمة الوظيفية ودرجة سيئة في الثلاث كلها.

تختلف عائلات الاختبار الثلاث في الطريقة لكنها تشترك في قاعدة واحدة: يحتاج كل منها إلى هدف مكتوب كرقم قبل تشغيل الاختبار. «ينبغي أن تكون الواجهة البرمجية سريعة» ليس هدفاً؛ أما «زمن استجابة عند المئين 95 أقل من 400 مللي ثانية عند 200 طلب في الثانية مع معدل خطأ أقل من 0.1%» فهو هدف. وبدون الرقم ينتج الاختبار تقريراً لا يستطيع أحد اجتيازه أو الإخفاق فيه.

  • الأداء — اختبارات الحمل والإجهاد والتحمّل والذروة المفاجئة: كيف يتصرف النظام مع ارتفاع الطلب، وبعد تجاوز حده، وعلى مدى الزمن.
  • الفشل — ما يحدث حين تكون الاعتمادية بطيئة أو خاطئة أو غائبة، وهل يتعافى النظام من تلقاء نفسه.
  • الأمان — هل نقاط الضعف الشائعة التي يصنّفها OWASP موجودة، وهل تصمد الضوابط (المصادقة والجلسات والترويسات ومعالجة المدخلات).

اختبار الأداء: الحمل والإجهاد والتحمّل والذروة المفاجئة

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

اختبار الإجهاد وحده يتجاوز الذروة المتوقعة عمداً؛ ويُعرَّف اختبار التحمّل بطول مدة الحمل، واختبار الذروة المفاجئة بسرعة وصوله. نموذج مفاهيمي
  1. اختبار الحملالحركة المتوقعة (نموذج عبء العمل)، مع قياس زمن الاستجابة والإنتاجية ومعدل الخطأ مقابل الأهداف.

    الخط المرجعي:الذروة المتوقعة

  2. اختبار الإجهادفوق الذروة المتوقعة حتى ينكسر شيء ما: هل يفشل النظام ببطء وأمان أم دفعة واحدة؟

    الخط المرجعي:الذروة المتوقعة

    ينكسر شيء ما

  3. اختبار التحمّلحمل واقعي لساعات لكشف التسريبات والطوابير المتنامية واستنفاد الاتصالات.
    الزمن · ساعات

    الخط المرجعي:الذروة المتوقعة

  4. اختبار الذروة المفاجئةمن السكون إلى الذروة في ثوانٍ، كما يحدث بعد حملة تسويقية أو إشارة في الأخبار.

    الخط المرجعي:الذروة المتوقعة

أشكال توضيحية على مقياس حمل واحد مشترك: الارتفاعات والمدد الزمنية للتوضيح فقط.

نموذج عبء العمل أهم من الأداة. ينبغي أن يأتي من الحركة الحقيقية — أي نقاط النهاية، وبأي مزيج، وبأي بيانات، وبأي تزامن — لا من نقطة نهاية واحدة تُضرب في حلقة. تقبل 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، لأن ذلك يتطلب معرفة أي مستخدم ينبغي أن يرى أي سجل. واختبار خط الأساس يضيف تلك الفحوص يدوياً؛ واختبار الاختراق يذهب أبعد.

هل ينبغي تشغيل اختبارات الأداء على بيئة الإنتاج؟

اختبارات الحمل والإجهاد لا ينبغي — فهي تُضعف الخدمة للمستخدمين الحقيقيين وقد تُفعّل ضوابط الاحتيال أو تحديد المعدل. شغّلها على بيئة بحجم الإنتاج. أما الفحوص الاصطناعية للقراءة فقط (طلب واحد في الدقيقة يقيس زمن الاستجابة) فآمنة ومفيدة في الإنتاج كمراقبة.

كم مرة ينبغي تكرار اختبار المرونة؟

كاملاً قبل الإطلاق الأول، ثم مع كل إصدار يغيّر البنية التحتية أو المصادقة أو الوصول إلى البيانات أو مساراً عالي الحركة، وعلى جدول ثابت — الربع سنوي شائع — لأن الاعتماديات والحركة تتغير حتى حين لا يتغير الكود.

المراجع

تمرين عملي

قيّم مرونة منصة تذاكر قبل فتح البيع

المطلوب

أنت مهندس الجودة في منصة تذاكر (مثال خيالي) لها موقع ويب وتطبيق جوال. تُطرح تذاكر مباراة افتتاح الموسم للبيع يوم الخميس ⁦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"}
الخطوات
  1. راجع مسودة الخطة مقابل الدليل: اكتب ما الخطأ في كل بند وما الناقص، ثم أعد كتابتها خطة مرونة من صفحة واحدة لهذا البيع.
  2. احكم على التشغيلات R1–R4 مقابل الأهداف T1–T3 هدفاً هدفاً، واكتب ما يخبرك به كل تشغيل بعد الأرقام. هل كان معيار النجاح في المسودة سيكشف المشكلات؟
  3. لكل فحص من F1–F5 قرّر هل السلوك مقبول؛ وإن لم يكن، فسمِّ قاعدة الاستقرار التي يخالفها من الدليل، واكتب السلوك المتوقع.
  4. لكل ملاحظة من S1–S5 اكتب المشكلة، والجزء الذي تنتمي إليه من خط أساس OWASP، والنتيجة المتوقعة. ثم اذكر فحوص خط الأساس التي لا تغطيها المادة بعد.
  5. اكتب مذكرة القرار (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 خبراً جيداً، فأعد قراءة البند عن النظام الذي يبقى سريعاً بإرجاع الأخطاء. ولا بأس بتقسيم مختلف بين ما يوقف الإطلاق وبقية الإصلاحات ما دام لكل قرار سببه؛ أما الحكم الذي لا يستند إلى رقم أو قاعدة فغير مقبول.

تقدّمك في هذا الموضوع

جزء من مسار تعلم ضمان الجودة

الأدوات المذكورة في هذا الدليل

ولّد بيانات اختبار جاهزة لـ JMeter (ملفات CSV Data Set Config ومتغيّرات User Defined Variables) انطلاقاً من مخطط الحقول.

الأتمتة

ولّد ملفات CSV لعنصر CSV Data Set Config في JMeter باقتباس وفواصل وترميزات صحيحة.

الأتمتة

شغّل قياس أداء صغيراً وآمناً على نقطة نهاية عامة (بعدد طلبات وتزامن محدودَين) واحصل على الإنتاجية ومئينيات زمن الاستجابة.

الأداء

قِس زمن استجابة نقطة نهاية عبر عدة عيّنات: الحد الأدنى والأقصى والمتوسط والوسيط وp95.

الأداء

قارن أزمنة الاستجابة والأحجام بين نقطتي نهاية (مثل v1 مقابل v2، أو staging مقابل الإنتاج) جنباً إلى جنب.

الأداء

حلّل حجم الاستجابة: البايتات الخام مقابل المضغوطة، وحجم الترويسات، ووزن بنية JSON، وأكبر الحقول.

الأداء

احصل على نقطة نهاية عامة تعيد أي رمز حالة HTTP، مع تأخير اختياري وجسم JSON مخصّص، لاختبار معالجة الأخطاء في العميل.

اختبار واجهات API

ولّد استجابات خطأ منظّمة (التحقق والمصادقة وعدم العثور وتحديد المعدّل وخطأ الخادم) بالصيغ الشائعة.

المحاكاة

تقييم ترويسات أمان HTTP (CSP وHSTS وX-Frame-Options وReferrer-Policy وPermissions-Policy وCOOP/CORP) من ترويسات ملصقة أو عنوان URL عام.

التحقق

اختبر مصادقة Bearer وBasic ومفتاح API والترويسات المخصّصة على نقطة نهاية وقارن الاستجابات المصرّح بها بغير المصرّح بها.

اختبار واجهات API

فكّ ترميز ترويسة JWT وحمولته، وفحص المطالبات (claims) والتحقق من انتهاء الصلاحية — بالكامل داخل متصفحك.

الأمان

اختبار إعدادات CORS: إرسال طلبات تمهيدية (preflight) وطلبات بسيطة من أصل محدّد وفحص ترويسات Access-Control-*.

الويب

كيف تساعدك متقن سوفت

أدلة أخرى

أدلة أخرى
الأداء

ما هو اختبار الأداء؟

شرح اختبار الأداء: الفرق بين اختبارات الحمل والإجهاد والذروة المفاجئة والتحمّل، والمقاييس المهمة (p95 والإنتاجية ومعدل الأخطاء)، والتخطيط لأول اختبار، والأدوات.

وقت القراءة 5 دقائق
تصميم الاختبارات

ضمان جودة المنتج من البداية إلى النهاية

ما الذي يشمله ضمان الجودة الشامل — مراجعة المتطلبات وتصميم الاختبارات والاختبار الوظيفي واختبار الأداء والأمان وبوابات الإصدار والمقاييس — وكيف تنفّذه.

وقت القراءة 8 دقائق
الأداء

اختبار المرونة

ما اختبار المرونة وكيف يختلف عن اختبار الأداء وكيف يُنفَّذ: المتطلبات، وتجارب حقن الأعطال، وأنماط الاستقرار، والأدوات، وخطة جاهزة ليوم تمرين.

وقت القراءة 22 دقائق
اختبار واجهات API

ما هو اختبار API؟ وكيف تختبر REST API

شرح اختبار API: ما هو، وما الذي تفحصه في كل طلب واستجابة، وطريقة خطوة بخطوة لاختبار REST API، والأخطاء الشائعة، وأدوات مجانية من متصفحك.

وقت القراءة 6 دقائق
الأمان

ما هو JWT؟ شرح رموز JSON Web Token

شرح مبسّط لـ JWT: الأجزاء الثلاثة للرمز، والمطالبات مثل exp وsub، وكيفية فك ترميزه والتحقق منه، ولماذا فك الترميز ليس تحققاً، وقواعد الأمان.

وقت القراءة 4 دقائق
الويب

شرح رموز حالة HTTP

شرح كل فئة من رموز حالة HTTP مع الرموز التي تقابلها فعلاً — 200 و301 و400 و401 و403 و404 و422 و429 و500 و502 و503 و504 — وسبب كل منها وأيها تعيده.

وقت القراءة 5 دقائق