هندسة الأمان

أمان إدارة الجلسات: إعدادات الكوكيز وتدوير التوكن وتسجيل الخروج

تنفيذ إدارة جلسات آمنة مع إعدادات كوكيز صحيحة وتدوير التوكن وتدفقات تسجيل الخروج. يغطي تثبيت الجلسة ومنع الاختطاف والتعامل متعدد الأجهزة.

Khalid Aboubakr
17 دقيقة قراءة
Session ManagementCookiesCsrfSession FixationSecurityToken RotationHttponly

مقدمة

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

تكوين ملفات تعريف الارتباط الآمنة

const sessionCookieOptions: CookieOptions = { httpOnly: true, // يمنع وصول JavaScript (حماية XSS) secure: true, // HTTPS فقط sameSite: 'strict', // حماية CSRF maxAge: 24 * 60 * 60 * 1000, path: '/', }; res.cookie('sessionId', sessionId, sessionCookieOptions);

حماية CSRF

// نمط توكن المزامنة const csrfProtection = csrf({ cookie: { httpOnly: true, secure: true, sameSite: 'strict', }, }); // لتطبيقات SPA: نمط ملف تعريف الارتباط المزدوج app.use((req, res, next) => { if (['POST', 'PUT', 'DELETE'].includes(req.method)) { const cookieToken = req.cookies['csrf-token']; const headerToken = req.headers['x-csrf-token']; if (!cookieToken || cookieToken !== headerToken) { return res.status(403).json({ error: 'فشل التحقق من CSRF' }); } } next(); });

منع تثبيت الجلسة

class SessionService { async login(req: Request, res: Response, user: User): Promise<void> { // دائماً أعد إنشاء الجلسة عند تسجيل الدخول const newSessionId = await this.regenerateSession(req); await this.sessionStore.set(newSessionId, { userId: user.id, createdAt: new Date(), ipAddress: req.ip, }); res.cookie('sessionId', newSessionId, sessionCookieOptions); } }

مهلة الجلسة

class SessionManager { async validateSession(sessionId: string): Promise<SessionValidationResult> { const session = await this.sessionStore.get(sessionId); if (!session) { return { valid: false, reason: 'الجلسة غير موجودة' }; } const now = Date.now(); // التحقق من المهلة المطلقة if (now - session.createdAt > this.config.absoluteTimeout) { await this.sessionStore.delete(sessionId); return { valid: false, reason: 'انتهت المهلة المطلقة' }; } // التحقق من مهلة الخمول if (now - session.lastActivityAt > this.config.idleTimeout) { await this.sessionStore.delete(sessionId); return { valid: false, reason: 'انتهت مهلة الخمول' }; } return { valid: true, session }; } }

تسجيل الخروج الآمن

async function logout(req: Request, res: Response): Promise<void> { const sessionId = req.cookies.sessionId; if (sessionId) { await sessionStore.delete(sessionId); await tokenService.revokeSessionTokens(sessionId); } res.clearCookie('sessionId', { path: '/' }); res.clearCookie('refreshToken', { path: '/api/auth/refresh' }); res.setHeader('Cache-Control', 'no-store, no-cache, must-revalidate'); res.json({ message: 'تم تسجيل الخروج بنجاح' }); }

الخلاصة

إدارة الجلسات الآمنة تتطلب:

  1. علامات ملفات تعريف الارتباط الآمنة - httpOnly وsecure وsameSite
  2. حماية CSRF - التوكنات أو ملفات تعريف الارتباط المزدوجة
  3. إعادة إنشاء الجلسة - عند تسجيل الدخول وتغييرات الامتيازات
  4. سياسات المهلة - الخمول والمطلقة
  5. تسجيل الخروج المناسب - إبطال في كل مكان

تذكر: الجلسات هي مفاتيح حسابات مستخدميك. احمها وفقاً لذلك.

مقالات ذات صلة