نوفيل
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
دخولابدأ مجاناً
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
نوفيل

منصة تعليم البرمجة الأولى بالعربي. تعلم من الصفر حتى الاحتراف مع كورسات احترافية وتحديات ذكاء اصطناعي.

المنصة

  • الكورسات
  • التحديات
  • المقالات
  • الأدوات

الحساب

  • إنشاء حساب
  • تسجيل الدخول
  • لوحة التحكم
  • الملف الشخصي

روابط

  • سياسة الخصوصية
  • شروط الاستخدام
  • عن نوفيل
  • تواصل معنا

© 2026 نوفيل. جميع الحقوق محفوظة.

صُنع بـ في مصر

نوفيل
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
دخولابدأ مجاناً
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
نوفيل

منصة تعليم البرمجة الأولى بالعربي. تعلم من الصفر حتى الاحتراف مع كورسات احترافية وتحديات ذكاء اصطناعي.

المنصة

  • الكورسات
  • التحديات
  • المقالات
  • الأدوات

الحساب

  • إنشاء حساب
  • تسجيل الدخول
  • لوحة التحكم
  • الملف الشخصي

روابط

  • سياسة الخصوصية
  • شروط الاستخدام
  • عن نوفيل
  • تواصل معنا

© 2026 نوفيل. جميع الحقوق محفوظة.

صُنع بـ في مصر

نوفيل
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
دخولابدأ مجاناً
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
نوفيل

منصة تعليم البرمجة الأولى بالعربي. تعلم من الصفر حتى الاحتراف مع كورسات احترافية وتحديات ذكاء اصطناعي.

المنصة

  • الكورسات
  • التحديات
  • المقالات
  • الأدوات

الحساب

  • إنشاء حساب
  • تسجيل الدخول
  • لوحة التحكم
  • الملف الشخصي

روابط

  • سياسة الخصوصية
  • شروط الاستخدام
  • عن نوفيل
  • تواصل معنا

© 2026 نوفيل. جميع الحقوق محفوظة.

صُنع بـ في مصر

نوفيل
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
دخولابدأ مجاناً
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
المقالات/الأمن السيبراني
الأمن السيبراني

JWT مقابل Sessions: معركة الأمان خلف الكواليس في الويب الحديث

هل JWT حقاً أكثر أماناً من Sessions؟ غوص تقني عميق يكشف ما يحدث في الذاكرة والسيرفر والمعالج، مع أكواد حقيقية وأمثلة من شركات مثل فيسبوك وأمازون.

فريق نوفيل٢٦ يوليو ٢٠٢٦4 دقائق قراءة١٠ مشاهدة

تفتح تطبيقك المفضل على الموبايل، تضغط زر تسجيل الدخول، وينقلك التطبيق إلى الصفحة الرئيسية في أقل من ٣٠٠ مللي ثانية. خلف هذه الثواني القليلة تدور معركة أمنية حقيقية بين خيارين تقنيين: هل يستخدم السيرفر JWT أم Sessions لتأكيد هويتك؟ في عالم الويب الحديث، هذا السؤال ليس مجرد تفضيل شخصي — إنه قرار يؤثر على أداء النظام، قابلية التوسع، والأهم: مستوى الأمان. لكن ما لا يخبرك به معظم المقالات هو أن الأمان هنا ليس أبيض وأسود؛ إنه طيف من المخاطر التي تتغير بناءً على كيفية تنفيذ كل خيار، والبيئة التي يعمل فيها.

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

ما يحدث حقاً عندما تضغط زر تسجيل الدخول: رحلة الـ Request من الموبايل إلى السيرفر

عندما ترسل بيانات تسجيل الدخول من تطبيقك، تبدأ رحلة معقدة عبر طبقات الشبكة والبروتوكولات. لنفترض أنك تستخدم Sessions: السيرفر يستقبل بياناتك، يتحقق من صحتها، ثم يولد معرف جلسة فريد (Session ID) يخزنه في قاعدة بيانات أو ذاكرة مؤقتة مثل Redis. هذا المعرف يرسل إليك في شكل كوكي، وفي كل طلب لاحق، يرسل المتصفح هذا الكوكي تلقائياً مع الطلب. لكن هنا تكمن المشكلة الأولى: الكوكي يسافر عبر الشبكة في كل طلب، مما يجعله عرضة للسرقة عبر هجمات مثل Man-in-the-Middle إذا لم تستخدم HTTPS.

أما في حالة JWT، فالسيرفر لا يخزن أي شيء. بدلاً من ذلك، يولد توكناً مميزاً يحتوي على معلومات المستخدم (مثل المعرف والبريد الإلكتروني) ويوقعه رقمياً باستخدام مفتاح سري. هذا التوكن يرسل إليك، وعليك أنت كمطور أن تخزنه في مكان آمن (مثل localStorage أو Secure Cookie). في كل طلب لاحق، ترسل هذا التوكن في الهيدر (عادةً Authorization: Bearer <token>)، والسيرفر يتحقق من التوقيع ويقرأ البيانات دون الحاجة للرجوع إلى قاعدة البيانات. يبدو هذا رائعاً من الناحية النظرية، لكنه يفتح الباب لمشاكل جديدة: ماذا لو سرق المهاجم التوكن؟ ماذا لو احتوى التوكن على بيانات حساسة؟ وكيف تضمن أن التوكن لم يتم التلاعب به؟

javascript
// مثال على توليد JWT في Node.js باستخدام مكتبة jsonwebtoken
const jwt = require('jsonwebtoken');
const secretKey = process.env.JWT_SECRET; // يجب أن يكون طويلاً ومعقداً

// عند تسجيل الدخول الناجح
const user = { id: 123, email: 'user@example.com', role: 'admin' };
const token = jwt.sign(user, secretKey, { expiresIn: '1h' });

// إرسال التوكن للعميل
res.json({ token });

// التحقق من التوكن في الطلبات اللاحقة
app.get('/protected', (req, res) => {
 const token = req.headers.authorization?.split(' ')[1];
 if (!token) return res.status(401).send('Unauthorized');

 try {
 const decoded = jwt.verify(token, secretKey);
 // الآن يمكنك استخدام decoded.id أو decoded.email
 res.json({ message: 'Welcome admin!' });
 } catch (err) {
 res.status(401).send('Invalid token');
 }
});

لاحظ في الكود السابق أننا استخدمنا expiresIn لتعيين مدة صلاحية التوكن بساعة واحدة. هذه الممارسة ضرورية جداً في JWT لأنها تحد من نافذة الهجوم إذا تم سرقة التوكن. لكن ماذا لو احتجنا إلى صلاحية أطول؟ هنا تظهر مشكلة أخرى: كلما زادت مدة الصلاحية، زاد الخطر. بعض الشركات مثل أمازون تستخدم توكنات قصيرة الأجل مع Refresh Tokens، لكن هذا يضيف تعقيداً جديداً للنظام. في المقابل، Sessions يمكن أن تكون أكثر مرونة في هذا الجانب؛ يمكنك ببساطة تعيين وقت انتهاء للجلسة في قاعدة البيانات وإلغاؤها في أي وقت.

الذاكرة والمعالج: أين يخزن كل منهما البيانات وكيف يؤثر ذلك على الأمان؟

لنبدأ بـ Sessions: عندما يولد السيرفر معرف جلسة، يخزنه في مكان ما. في التطبيقات الصغيرة، قد يستخدم الذاكرة العشوائية (RAM)، لكن هذا غير قابل للتوسع لأن السيرفر قد يعيد التشغيل ويفقد كل الجلسات. الحل الأكثر شيوعاً هو استخدام قاعدة بيانات مثل MySQL أو Redis. قاعدة البيانات تعني أن كل طلب يحتاج إلى I/O للوصول إلى بيانات الجلسة، وهذا يضيف تأخيراً. لكن من الناحية الأمنية، هذا يعني أن المهاجم لا يستطيع الوصول إلى بيانات الجلسة إلا إذا اخترق قاعدة البيانات نفسها، وهذا أصعب بكثير من سرقة كوكي من المتصفح.

في المقابل، JWT لا يخزن أي شيء على السيرفر. كل البيانات موجودة في التوكن نفسه، وهذا يعني أن السيرفر لا يحتاج إلى الوصول إلى قاعدة البيانات للتحقق من الهوية. هذا يجعل JWT أسرع بكثير في البيئات الموزعة، حيث يمكن لعدة سيرفرات التحقق من التوكن دون الحاجة إلى قاعدة بيانات مركزية. لكن هذه الميزة تأتي بثمن: إذا احتوى التوكن على بيانات حساسة (مثل كلمة المرور أو رقم البطاقة الائتمانية)، فإن سرقة التوكن تعني سرقة هذه البيانات. حتى لو استخدمت HTTPS، فإن التوكن يبقى في ذاكرة المتصفح ويمكن سرقته عبر هجمات XSS.

python
# مثال على تخزين Sessions في Redis باستخدام Flask
from flask import Flask, session, request, redirect
import redis
import os

app = Flask(__name__)
app.secret_key = os.urandom(24) # مفتاح سري لتشفير الكوكيز
redis_client = redis.Redis(host='localhost', port=6379, db=0)

@app.route('/login', methods=['POST'])
def login():
 # تحقق من بيانات المستخدم...
 session['user_id'] = 123
 session['logged_in'] = True
 # تخزين الجلسة في Redis مع انتهاء صلاحية
 redis_client.setex(f'session:{session[

التعليقات

العودة للمقالات
نوفيل

منصة تعليم البرمجة الأولى بالعربي. تعلم من الصفر حتى الاحتراف مع كورسات احترافية وتحديات ذكاء اصطناعي.

المنصة

  • الكورسات
  • التحديات
  • المقالات
  • الأدوات

الحساب

  • إنشاء حساب
  • تسجيل الدخول
  • لوحة التحكم
  • الملف الشخصي

روابط

  • سياسة الخصوصية
  • شروط الاستخدام
  • عن نوفيل
  • تواصل معنا

© 2026 نوفيل. جميع الحقوق محفوظة.

صُنع بـ في مصر