انتقل إلى محتوى الدرس
الدرس 64
دورة تكنولوجيا الويب

الكوكيز والجلسات في HTTPHTTP Cookies and Sessions

أتقن إدارة الحالة في بروتوكول HTTP عبر الكوكيز والجلسات: آلية عمل Set-Cookie وحقل Cookie، والفرق بين الكوكيز المؤقتة والدائمة، وخصائص الأمان HttpOnly وSecure وSameSite وبادئة __Host-، وحماية الجلسات وإبطالها عند الخروج.
أقسام الدرس
13
الأمثلة
4
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
0
محتوى الدرس
في هذا الدرس 13تصفّح المواضيع

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

قبل الغوص في التفاصيل الهندسية، استعرض جدول المصطلحات التقنية الأساسية لهذا الدرس:

المصطلح بالعربية المصطلح بالإنجليزية النطق التقني المعنى الهندسي المبسط
ملف تعريف الارتباط (الكوكي) إتش تي تي بي كوكي قطعة بيانات نصية صغيرة يرسلها الخادم ليحفظها المتصفح ويعيد إرسالها تلقائياً مع الطلبات اللاحقة لنفس النطاق.
حقل إنشاء الكوكي سيت كوكي هيدر حقل في رأس استجابة الخادم يأمر المتصفح بحفظ كوكي جديد مع خصائص صلاحيته وأمانه.
معرّف الجلسة سيشن آي دي قيمة عشوائية مشفرة وعالية الإنتروبيا تُحفظ داخل الكوكي لربط المتصفح بسجل بيانات المستخدم على الخادم.
منع وصول السكربتات إتش تي تي بي أونلي خاصية أمان تمنع أكواد JavaScript (عبر document.cookie) من قراءة الكوكي لحمايته من ثغرات XSS.
العزل عبر المواقع سيم سايت أتريبيوت خاصية تتحكم في إرسال الكوكي مع الطلبات العابرة للمواقع (Strict أو Lax أو None) للحماية من هجمات CSRF.
اختطاف الجلسة سيشن هايجاكينج استيلاء مهاجم على معرّف الجلسة النشط لانتحال هوية المستخدم الشرعي دون معرفة كلمة مروره.

لماذا صُمم بروتوكول أصلاً ليكون عديم الحالة؟ لأن غياب الحالة المتصلة يمنح خوادم الويب قدرة هائلة على التوسع الأفقي ()؛ إذ يمكن لأي خادم داخل مزرعة الخوادم الرد على أي طلب دون الحاجة لحفظ حالة اتصال مفتوحة لكل زائر.

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

ملف تعريف الارتباط ( — ابتكره المهندس لو مونتولي في شركة نتسكيب عام 1994 ووُثّق قياسياً في ) هو زوج نصي صغير من المفتاح والقيمة () لا يتجاوز حجمه 4 كيلوبايت () يرسله الخادم ليحفظه المتصفح في مخزن الكوكيز المعزول:

  • الكوكيز نصوص خاملة وليست برامج تنفيذية: لا يمكن لملف الكوكي تشغيل أكواد برمجية أو قراءة الملفات الشخصية من قرص الحاسوب، بل هو مجرد سلسلة نصية بسيطة (مثل ) تنتقل داخل حقول رأس رسالة .
  • حدود الحجم الصارمة (): يقيد المتصفح حجم الكوكي الواحد بحد أقصى يبلغ 4096 بايت (حوالي 50 كوكي لكل نطاق)؛ لأن جميع الكوكيز المطابقة للنطاق تُرفع عبر الشبكة مع رأس كل طلب يرسله المتصفح.

تُستخدم ملفات الكوكيز في هندسة تطبيقات الويب الحديثة لتحقيق ثلاثة أغراض رئيسية:

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

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

  1. 1. الخادم يصدر حقل الرأس في الاستجابة: عند تسجيل الدخول أو زيارة الموقع، يدرج الخادم حقل الرأس في استجابته متضمناً اسم الكوكي وقيمته متبوعاً بخصائص الأمان والصلاحية مفصولة بفواصل منقوطة ().
  2. 2. المتصفح يخزن الكوكي في مخزنه المعزول (): يتحقق المتصفح من سلامة النطاق والخصائص الأمنية ويحفظ الكوكي مع إعداداته في ذاكرته.
  3. 3. المتصفح يرفق حقل الرأس تلقائياً مع الطلبات اللاحقة: مع كل طلب جديد يتجه لنفس النطاق والمسار، يجمع المتصفح أزواج المطابقة ويرسلها في حقل رأس واحد باسم (دون إرسال خصائص الضبط).

تتبع دورة عمل الكوكيز وربطها بجدول الجلسات على الخادم في المخطط المعماري الآتي:

مخطط معماري يوضح دورة عمل الكوكيز والجلسات من طلب تسجيل الدخول وإصدار Set-Cookie إلى إرسال حقل Cookie والبحث في مخزن الجلسات

تنقسم ملفات الكوكيز من حيث مدة البقاء في المتصفح إلى نوعين رئيسيين تبعاً لوجود خصائص تاريخ الانتهاء:

  • 1. كوكيز الجلسة المؤقتة (): تُنشأ عندما يخلو حقل الرأس من خاصيتي و معاً؛ حيث يحتفظ بها المتصفح في الذاكرة المؤقتة طوال الجلسة الحالية وتُحذف عند إغلاق برنامج المتصفح بالكامل.
  • 2. الكوكيز الدائمة (): تُنشأ عند تحديد مدة بقاء بالثواني عبر الخاصية أو تاريخ انتهاء محدد عبر ؛ فيحفظها المتصفح على القرص لتبقى فعالة حتى بعد إغلاق الجهاز وإعادة تشغيله إلى أن تنتهي صلاحيتها الزمنية.

لا تختلف كوكيز الطرف الأول عن كوكيز الطرف الثالث في بنيتها البرمجية، وإنما يكمن الفرق في علاقة نطاق الكوكي بالموقع المفتوح أمام المستخدم في شريط العنوان:

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

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

لذلك تعتمد تطبيقات الويب الاحترافية على الجلسات من جهة الخادم ():

  1. معرّف الجلسة العشوائي غير القابل للتخمين (): فور نجاح تسجيل الدخول، يولّد الخادم معرّفاً عشوائياً مشفراً بطول وعشوائية عالية (لا يقل عن 128 بت من الإنتروبيا)، ويرسل هذا المعرّف فقط إلى المتصفح داخل كوكي محمي بخصائص .
  2. مخزن الجلسات على الخادم (): تُحفظ جميع البيانات الفعلية للمستخدم وصلاحياته بأمان تام على الخادم (داخل ذاكرة سريعة مثل أو قاعدة البيانات) مرتبطة بمعرّف الجلسة.

يوضح الجدول الهندسي الآتي الفروق الجوهرية بين الكوكيز والجلسات على الخادم من حيث مكان التخزين، والسعة، والأمان، وإمكانية الإبطال الفوري:

وجه المقارنة الهندسي ملف الكوكي (HTTP Cookie) جلسة الخادم (Server-Side Session)
مكان حفظ البيانات داخل متصفح المستخدم على جهازه المحلي. على الخادم الخلفي (في ذاكرة Redis أو قاعدة البيانات).
السعة التخزينية محدودة بصرامة بـ 4 كيلوبايت للكوكي الواحد. مرنة وكبيرة جداً حسب مساحة ذاكرة الخادم.
عبء النقل عبر الشبكة يُرسل محتواه مع رأس كل طلب HTTP مطابق للنطاق. لا ينتقل عبر الشبكة سوى معرّف الجلسة الصغير (Session ID).
الأمان ومقاومة التلاعب محفوظ لدى العميل؛ لذا لا توضع فيه بيانات حساسة مكشوفة. البيانات الحساسة لا تغادر الخادم مطلقاً.
الإبطال الفوري عن بُعد يبقى في المتصفح حتى ينتهي وقته أو يمسحه رد من الخادم. يمكن إبطاله وحذفه لحظياً من ذاكرة الخادم في أي وقت.

من الأخطاء الأمنية الخطيرة أن يكتفي زر «تسجيل الخروج» بمسح الكوكي من متصفح المستخدم فقط دون حذف سجل الجلسة من ذاكرة الخادم! فلو كان معرّف الجلسة قد تسرب مسبقاً، فسيظل صالحاً للاستخدام على الخادم رغم خروج المستخدم.

لذلك تتطلب عملية تسجيل الخروج الآمن عبر طلب تنفيذ خطوتين متلازمتين معاً:

  1. 1. إتلاف سجل الجلسة على الخادم فوراً: حذف بيانات الجلسة من ذاكرة الخادم () ليصبح المعرّف القديم ملغى نهائياً.
  2. 2. تصفير الكوكي في المتصفح: إرسال حقل الرأس بنفس المسار والنطاق مع قيمة فارغة و، مع إمكانية إضافة حقل الرأس الحديث .

جرّب المختبر التفاعلي الآتي لتتبع دورة حياة الجلسة الكاملة من تسجيل الدخول وتدوير المعرّف حتى الإبطال الكامل عند الخروج:

Shell
POST /logout HTTP/1.1
Host: www.closetag.com
Cookie: __Host-sid=auth_new_999

HTTP/1.1 303 See Other
Location: /login
Set-Cookie: __Host-sid=; Path=/; Max-Age=0; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; HttpOnly; SameSite=Lax
Clear-Site-Data: "cookies"

يمكنك فحص واختبار ملفات الكوكيز وتشخيص أسباب حظرها باستخدام أدوات المطورين في المتصفح () أو عبر سطر الأوامر:

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

ملخص الدرس

حصاد الدرس

مراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي

ماذا تعلّمت في هذا الدرس؟

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

مشاركة

هل كان هذا الدرس مفيدًا؟

جارٍ تحميل الآراء…

ابنِ لغتك البرمجية

المصطلحات12

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 12 مفهومةأول بطاقة، أول خطوة
01 HTTP Cookie ملف تعريف الارتباط (HTTP Cookie)
قطعة بيانات نصية صغيرة (بحد أقصى 4 كيلوبايت) يرسلها الخادم ليحفظها المتصفح ويعيد إرسالها تلقائياً مع الطلبات اللاحقة.
للمراجعة
02 Set-Cookie Header حقل إنشاء الكوكي (Set-Cookie)
حقل في رأس الاستجابة يستخدمه الخادم لإصدار كوكي جديد وتحديد خصائص صلاحيته وأمانه للمتصفح.
للمراجعة
03 Cookie Request Header حقل إرسال الكوكي (Cookie)
حقل في رأس الطلب يرسله المتصفح متضمناً أزواج الاسم والقيمة لجميع الكوكيز المحفوظة والمطابقة للنطاق والمسار.
للمراجعة
04 Session Cookie vs Persistent Cookie كوكي الجلسة مقابل الكوكي الدائم
يبقى كوكي الجلسة في الذاكرة المؤقتة دون تاريخ انتهاء، بينما يُحفظ الكوكي الدائم على القرص لمدة محددة بـ Max-Age أو Expires.
للمراجعة
05 Host-Only Cookie كوكي مقيد بالمضيف (Host-Only Cookie)
كوكي يُضبط دون كتابة خاصية Domain فيقتصر إرساله على المضيف الأصلي وحده دون أي نطاقات فرعية.
للمراجعة
06 HttpOnly Attribute خاصية منع وصول السكربتات (HttpOnly)
علامة أمان تمنع أكواد الجافاسكريبت في المتصفح من قراءة الكوكي لحمايته من السرقة عبر ثغرات XSS.
للمراجعة
07 Secure Attribute خاصية اشتراط التشفير (Secure)
علامة أمان تلزم المتصفح بعدم إرسال الكوكي إلا عبر اتصالات HTTPS المشفرة حصراً.
للمراجعة
08 SameSite Attribute خاصية العزل عبر المواقع (SameSite)
خاصية تحدد قواعد إرسال الكوكي مع الطلبات العابرة للمواقع (Strict أو Lax أو None) للحماية من هجمات CSRF.
للمراجعة
09 __Host- Cookie Prefix بادئة الحماية الصارمة (__Host-)
بادئة قياسية لاسم الكوكي تلزم المتصفح باشتراط وجود Secure والمسار Path=/ وعدم وجود خاصية Domain.
للمراجعة
10 Server-Side HTTP Session جلسة الخادم (Server-Side Session)
معمارية لحفظ بيانات المستخدم الحساسة داخل ذاكرة الخادم مع الاكتفاء بإعطاء المتصفح معرّف جلسة عشوائياً غامضاً.
للمراجعة
11 Session Hijacking اختطاف الجلسة (Session Hijacking)
هجوم يستولي فيه المهاجم على معرّف الجلسة النشط لانتحال شخصية المستخدم الشرعي دون الحاجة لكلمة المرور.
للمراجعة
12 Session Fixation Defense الحماية من تثبيت الجلسة (Session Rotation)
إعادة توليد معرّف جلسة جديد كلياً فور نجاح تسجيل الدخول وإتلاف المعرّف القديم لمنع هجمات تثبيت الجلسة.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

حروف قليلة. معنى كامل.

الاختصارات5

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 5 مفهومةأول بطاقة، أول خطوة
01 SID SID
Session Identifier
معرّف الجلسة العشوائي المشفر الذي يربط متصفح العميل بسجل جلسته المحفوظ على الخادم.
للمراجعة
02 XSS XSS
Cross-Site Scripting
ثغرة حقن السكربتات عبر المواقع، وتحمي خاصية HttpOnly كوكيز الجلسات من القراءة المباشرة بواسطتها.
للمراجعة
03 CSRF CSRF
Cross-Site Request Forgery
هجوم تزوير الطلبات عبر المواقع، وتُستخدم خاصية SameSite ورموز التحقق للحماية منه.
للمراجعة
04 CHIPS CHIPS
Cookies Having Independent Partitioned State
معيار الخصوصية الحديث لتقسيم وعزل كوكيز الطرف الثالث بحسب كل موقع رئيسي.
للمراجعة
05 GMT GMT
Greenwich Mean Time (HTTP-Date)
التوقيت القياسي العالمي المعتمد في مواصفات HTTP عند كتابة تاريخ انتهاء الكوكي في خاصية Expires.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/3مهام منجزة
  1. افتح أدوات المطورين في المتصفح (F12 ثم Application ثم Cookies) وافحص جدول الكوكيز للتحقق من تفعيل خصائص HttpOnly وSecure وSameSite.

  2. نفّذ الأمر curl -i -c cookies.txt لحفظ الكوكيز الواردة في ملف نصي، ثم افتح الملف لقراءة بنيته وأعد إرساله بالخيار curl -b cookies.txt.

  3. استخدم المختبر التفاعلي في الدرس للمقارنة بين الخروج الناقص والخروج الآمن الذي يحذف الجلسة من الخادم ويصفر الكوكي بـ Max-Age=0.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

12أسئلة 1أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي12 أسئلة تنتظرك
01

لماذا تحتاج تطبيقات الويب إلى ملفات الكوكيز أو الجلسات عند العمل فوق بروتوكول HTTP؟

02

ما الحد الأقصى القياسي الذي تفرضه المتصفحات لحجم ملف الكوكي الواحد (شاملاً اسمه وقيمته وخصائصه)؟

03

ما زوج حقول الرأس المستخدم (1) من الخادم لإنشاء الكوكي في الاستجابة، و(2) من المتصفح لإعادة إرسال الكوكيز المحفوظة في الطلبات اللاحقة؟

04

لماذا يُفضّل استخدام خاصية "Max-Age" هندسياً على خاصية "Expires" القديمة عند ضبط مدة صلاحية الكوكي الدائم؟

05

إذا أرسل الخادم "www.closetag.com" حقل الرأس Set-Cookie دون تضمين خاصية "Domain"، فأيّ المضيفات سيستقبل هذا الكوكي؟

06

ما الحماية الأمنية الدقيقة التي توفرها خاصية "HttpOnly" عند إضافتها إلى كوكي الجلسة؟

07

كيف يختلف سلوك "SameSite=Lax" عن "SameSite=Strict" عندما ينقر المستخدم على رابط عادي (<a href="...">) في موقع خارجي للانتقال إلى موقعك؟

08

ما الشروط الثلاثة الصارمة التي يفرضها المتصفح لقبول أي كوكي يبدأ اسمه بالبادئة "__Host-"؟

09

في معمارية الجلسات القياسية على الخادم (Server-Side Sessions)، أين تُحفظ بيانات وصلاحيات المستخدم الفعلية، وما الذي يُحفظ داخل كوكي المتصفح؟

10

كيف يمنع خادم الويب هجوم «تثبيت الجلسة» (Session Fixation) لحظة نجاح المستخدم في تسجيل الدخول؟

11

لماذا لا يكفي مسح الكوكي من المتصفح وحده عند برمجة عملية «تسجيل الخروج» الآمنة؟

12

ماذا يحدث إذا حاول الخادم حذف كوكي أُنشئ أصلاً بالمسار "Path=/shop" عبر إرسال Set-Cookie بـ "Max-Age=0; Path=/"؟