NestJS — Node.js للمؤسسات

الكوكيز والجلسات و HTTP ذو الحالة

18 دقيقة الدرس 57 من 80

الكوكيز والجلسات و HTTP ذو الحالة

تكون واجهات REST غالباً بلا حالة، لكن التطبيقات الحقيقية تحتاج الكوكيز والجلسات لمصادقة المتصفح ورموز CSRF وتدفقات OAuth ورسائل flash وصفحات MVC. يدعمها NestJS عبر وسيطات المنصة الأساسية أو إضافات Fastify.

الفكرة الأساسية

تدور هذه الميزة حول التحكم في كيفية تنظيم التطبيق وسلوكه وقت التشغيل. النقاط التالية هي ما يجب أن يعرفه المطور قبل استخدامها في مشروع حقيقي:

  • يرسل المتصفح الكوكيز في الطلبات المطابقة ويجب تعليمها HttpOnly و Secure و SameSite كلما أمكن.
  • تحمي الكوكيز الموقعة سلامة القيمة لكنها لا تشفرها؛ لا تخزن بيانات حساسة مباشرة بداخلها.
  • تخزن الجلسات معرفاً فقط في المتصفح وتحتفظ بالحالة في مخزن جلسات على الخادم.
  • يلزم مخزن جلسات مدعوم بقاعدة بيانات أو Redis عند تشغيل أكثر من نسخة للتطبيق.
  • تحتاج واجهات API كثيرة الجلسات إلى تسجيل خروج صريح وتدوير الجلسة بعد تغيّر الصلاحيات وأعمار قصيرة للتدفقات عالية الخطورة.

مثال عملي

يوضح المثال التالي الشكل العملي للفكرة داخل مشروع NestJS. ليست الغاية حفظ الكود، بل فهم مكانه في المعمارية:

async function bootstrap() { const app = await NestFactory.create(AppModule); app.use(cookieParser(process.env.COOKIE_SECRET)); app.use(session({ name: 'sid', secret: process.env.SESSION_SECRET!, resave: false, saveUninitialized: false, cookie: { httpOnly: true, secure: true, sameSite: 'lax' }, store: new RedisStore({ client: redisClient }), })); await app.listen(3000); }
ملاحظة تصميمية: استخدم الكوكيز والجلسات بوعي. تستفيد تطبيقات المتصفح منها؛ أما واجهات API بين الأنظمة فغالباً تناسبها رموز bearer أو mTLS أكثر.

قائمة تطبيق إنتاجية

  • اضبط HttpOnly و Secure و SameSite على كوكيز المصادقة.
  • استخدم مخزن جلسات مشتركاً في النشر الأفقي.
  • دوّر معرف الجلسة بعد تسجيل الدخول ورفع الصلاحية.
  • لا تخزن أسراراً أو ملفات مستخدم كبيرة داخل الكوكيز.
قاعدة عملية: إذا جعلت الميزة الحدود أوضح والاختبارات أسهل فهي اختيار جيد. إذا أخفت التبعيات أو صعّبت التتبع، فأعد التصميم.

الخلاصة

يغطي هذا الدرس جزءاً متقدماً من NestJS يجب فهمه عند بناء تطبيقات مؤسسية. ركّز على الحدود الواضحة، والسلوك القابل للاختبار، واختيار الأداة المناسبة للسياق بدلاً من استخدام كل ميزة في كل مكان.