رموز التحديث والجلسات الآمنة
رموز التحديث والجلسات الآمنة
رموز الوصول قصيرة العمر آمنة لكنها غير مريحة — رمز بـ 15 دقيقة يعني خروج المستخدم كل 15 دقيقة. تحلّ رموز التحديث (Refresh tokens) هذا: رمز طويل العمر يستطيع سكّ رموز وصول جديدة دون إعادة إدخال كلمة المرور. وإتقان هذا النمط هو ما يجعل نظام مصادقة الإنتاج آمنًا وقابلًا للاستخدام معًا.
نمط الرمزين
- رمز الوصول — قصير العمر (مثلًا 15 دقيقة)، يُرسَل في كل طلب، JWT عديم الحالة.
- رمز التحديث — طويل العمر (مثلًا 7 أيام)، يُستخدم فقط للحصول على رمز وصول جديد، ويُخزَّن في الخادم ليمكن إبطاله.
حين ينتهي رمز الوصول، يستدعي العميل نقطة /refresh برمز التحديث ويستلم رمز وصول جديدًا — دون كلمة مرور.
إصدار كليهما عند الدخول
نقطة التحديث
عند التحديث، تحقّق من توقيع رمز التحديث، وأكّد مطابقته للتجزئة المخزّنة لذلك المستخدم، ثم أصدِر رموزًا جديدة:
تدوير رمز التحديث
أين تُخزَّن الرموز على العميل
اختيار التخزين مهمّ للأمان:
- كوكي httpOnly — غير قابل للقراءة من JavaScript، فيقاوم سرقة الرمز عبر XSS. مُفضَّل لرمز التحديث (مع حماية CSRF).
- الذاكرة — يمكن أن يعيش رمز الوصول في الذاكرة؛ يُفقَد عند التحديث، وهذا مقبول لأنّه قصير العمر.
- localStorage — مريح لكن يقرؤه أي سكربت، فهو عرضة لـ XSS. تجنّبه للرموز طويلة العمر.
تسجيل الخروج
لأنّ رموز الوصول عديمة الحالة، يعني "تسجيل الخروج" فعليًا إبطال رمز التحديث في الخادم: امسح تجزئة التحديث المخزّنة فلا يعود يسكّ رموز وصول جديدة. ثم ينتهي رمز الوصول قصير العمر من تلقاء نفسه.
الخلاصة
اقرن رمز وصول قصير العمر برمز تحديث طويل العمر مخزّن في الخادم. خزّن تجزئة رمز التحديث فقط، وتحقّق منه ودوّره في كل /refresh، وفضّل كوكي httpOnly له، و"سجّل الخروج" بمسح تجزئة التحديث المخزّنة. هذا يحقّق الأمان (رموز وصول قصيرة، تحديث قابل للإبطال) والاستخدامية (بلا إعادة دخول دائمة). تاليًا: التفويض — تقرير ما يُسمح للمستخدم المُصادَق بفعله.