اختيار Sessions أو Tokens ليس مسابقة بين قديم وحديث. كلاهما طريقة لحمل حالة المصادقة بين الطلبات، لكن مكان حفظ الحالة وكيفية الإبطال وال ـclients المستهدفة يختلف. تطبيق ويب تقليدي قد يكون أبسط وأأمن باستخدام Session cookie HttpOnly، بينما API تخدم تطبيقات متعددة قد تستفيد من Access tokens قصيرة العمر. المشكلة تبدأ عندما تُختار JWT لمجرد تجنب Session store بدون حساب تكلفة revocation وإدارة refresh tokens.
Server-side Session تجعل الإبطال مركزيًا
المتصفح يحمل Session ID عشوائية في Cookie، والخادم يخزن الحالة المرتبطة بها. عند logout أو تعطيل الحساب تستطيع حذف session فورًا. المقابل هو الحاجة إلى shared session store أو sticky architecture عند التوسع.
Access Token تنقل بعض الحالة إلى credential
Access token قد تكون opaque أو JWT. Resource server تتحقق منها وتطبق scopes/audience. JWT stateless تقلل lookup في بعض التصاميم، لكن token المسروقة تظل صالحة حتى expiry ما لم تضف revocation أو تحققًا إضافيًا.
Refresh Token هي الجزء الأكثر حساسية
لتجنب Access token طويلة العمر، يستخدم النظام Refresh token لإصدار Access جديدة. يجب حمايتها وتدويرها وإبطالها عند logout أو compromise. وضع Refresh token طويلة العمر في LocalStorage يوسع أثر XSS.
خطوات عملية
- حدد client type.
- حدد عمر Access token.
- حدد مكان Refresh token.
- صمم rotation/revocation.
- اختبر logout من كل الأجهزة.
- اختبر سرقة credential في threat model.
Browser app لا تحتاج JWT دائمًا
إذا Frontend و Backend تحت نفس origin أو نفس التطبيق، Session cookie قد تكون أبسط وتمنع تعقيد تخزين tokens في JavaScript. JWT مفيدة عندما تحتاج claims موزعة أو APIs متعددة، لكن لا تجعلها هدفًا بذاتها.
CSRF و XSS تختلف حسب التخزين
Cookie تُرسل تلقائيًا، لذلك تحتاج SameSite و CSRF defenses في الحالات المناسبة. Token تُضاف يدويًا غالبًا، ما يقلل بعض CSRF لكنه قد يعرضها أكثر ل ـXSS إذا خُزنت بطريقة يستطيع JS الوصول إليها. لا يوجد خيار يلغي بقية الدفاعات.
اختر على أساس المتطلبات
اسأل: هل نحتاج revoke فوري؟ كم client؟ هل هناك mobile/native؟ هل APIs مستقلة؟ هل نحتاج SSO/OIDC؟ ما العمر المقبول للاعتماد؟ ثم اختر النموذج الأقل تعقيدًا الذي يحقق المطلوب.
قائمة مراجعة
- Logout حقيقي مختبر.
- سرقة token ضمن threat model.
- CSRF/XSS controls موجودة.
- expiry معقولة.
- refresh rotation إن استخدمت.
- audience/scopes واضحة.
Sessions مقابل Tokens
| مكان الحالة | حالة الجلسة الأساسية محفوظة على الخادم ويملك العميل معرفًا | يحمل العميل token يمثل التفويض أو claims بحسب التصميم |
| الإلغاء والتحكم | يمكن تعطيل الجلسة مركزيًا من مخزن الخادم | يعتمد الإلغاء على عمر الرمز والتصميم وقوائم الإبطال عند الحاجة |
| التوسع | قد يحتاج مخزن جلسات مشتركًا بين الخوادم | قد يقلل lookup المركزي لكنه يضيف إدارة مفاتيح ودورة حياة |
| الاختيار | مناسب عندما يكون التحكم المركزي المباشر مهمًا | مفيد لل ـAPIs والأنظمة الموزعة عند ضبط الجمهور والنطاق والعمر |
شارك في تقييم ونقاش المقال
رأيك يضيف قيمة للمقال ويساعدنا على تحسين المحتوى والنقاش حوله.
النقاش
جارٍ تحميل التعليقات…