آنچه در این مقاله می‌خوانید [پنهان‌سازی]

عنوان سئو:

Session در Django برای نگهداری اطلاعات کاربر بین درخواست‌های مختلف استفاده می‌شود. وقتی کاربر وارد سایت می‌شود، Django با استفاده از Session اطلاعات او را ذخیره می‌کند تا در Request های بعدی بتواند کاربر را شناسایی کند. این سیستم یکی از مهم‌ترین بخش‌های Authentication و مدیریت کاربران در Django محسوب می‌شود.

Session در Django چیست؟

پروتکل HTTP به صورت پیش فرض Stateless است.

یعنی سرور بعد از هر Request اطلاعات کاربر را فراموش می‌کند.

مثلا:

  • کاربر Login می‌کند
  • صفحه جدید باز می‌کند
  • سرور باید دوباره او را بشناسد

اینجا Session وارد عمل می‌شود.

Django با Session اطلاعات موقت کاربر را نگهداری می‌کند تا بین درخواست‌های مختلف قابل استفاده باشند.

Session در Django چگونه کار می‌کند؟

وقتی کاربر وارد سایت می‌شود:

  • Django یک Session ایجاد می‌کند
  • یک Session ID می‌سازد
  • Session ID داخل Cookie مرورگر ذخیره می‌شود

بعد در هر Request:

  • مرورگر Session ID را ارسال می‌کند
  • Django اطلاعات مربوط به آن Session را پیدا می‌کند

ساختار Session در Django

معمولا اطلاعات Session داخل:

  • Database
  • Cache
  • File
  • Redis

ذخیره می‌شوند.

به صورت پیش فرض Django از دیتابیس استفاده می‌کند.

جدول مربوطه:

django_session

ذخیره اطلاعات داخل Session

مثلا:

request.session['username'] = 'Ali'

حالا مقدار username داخل Session ذخیره می‌شود.

خواندن اطلاعات Session

مثلا:

username = request.session.get('username')

اگر مقدار وجود داشته باشد برگردانده می شود.

حذف اطلاعات Session

مثلا:

del request.session['username']

یا حذف کامل Session:

request.session.flush()

چرا Session در Django مهم است؟

خیلی از قابلیت‌های مهم Django بر پایه Session کار می‌کنند.

مثلا:

  • Login
  • سبد خرید
  • پنل کاربری
  • پیام های موقت
  • ذخیره تنظیمات کاربر

بدون Session مدیریت کاربر بسیار سخت می‌شود.

Session ID چیست؟

Session ID شناسه‌ای است که کاربر را مشخص می‌کند.

مثلا مرورگر چنین Cookie ای ذخیره می‌کند:

sessionid=abc123xyz

این مقدار به Django کمک می کند Session مربوط به کاربر را پیدا کند.

آیا اطلاعات داخل Cookie ذخیره می‌شوند؟

به صورت پیش فرض خیر.

معمولا فقط Session ID داخل Cookie قرار می‌گیرد.

اطلاعات واقعی داخل سرور ذخیره می‌شوند.

این روش امنیت بیشتری دارد.

انواع Session Backend در Django

Django چند روش مختلف برای ذخیره Session دارد.

Database Session

حالت پیش فرض Django است.

مزایا:

  • ساده
  • پایدار
  • قابل اطمینان

معایب:

  • فشار بیشتر روی دیتابیس

Cache Session

مثلا با Redis:

SESSION_ENGINE = 'django.contrib.sessions.backends.cache'

مزایا:

  • سریع‌تر
  • مناسب پروژه‌های بزرگ

معایب:

  • اگر Cache پاک شود Session ها حذف می‌شوند

File Session

ذخیره Session داخل فایل:

SESSION_ENGINE = 'django.contrib.sessions.backends.file'

معمولا کمتر استفاده می‌شود.

Signed Cookie Session

در این حالت اطلاعات Session داخل Cookie ذخیره می‌شوند.

مزایا:

  • فشار کمتر روی سرور

معایب:

  • حجم محدود
  • امنیت حساس‌تر

Session در Authentication Django

وقتی کاربر Login می‌کند:

login(request, user)

Django اطلاعات کاربر را داخل Session ذخیره می‌کند.

بعد در هر Request:

  • Session بررسی می‌شود
  • کاربر شناسایی می‌شود

Logout چگونه کار می‌کند؟

مثلا:

logout(request)

این دستور Session را پاک می‌کند.

بعد کاربر دیگر Authenticate شده نیست.

مشکل رایج Session در Django

منقضی شدن Session

گاهی کاربر ناگهان Logout می‌شود.

علت معمولا:

  • پایان زمان Session
  • پاک شدن Cookie
  • Restart شدن Cache

است.

تنظیم زمان Session

مثلا:

SESSION_COOKIE_AGE = 3600

یعنی Session بعد از یک ساعت منقضی شود.

مشکل Session در API ها

در پروژه‌های:

  • React
  • Vue
  • Mobile App

گاهی Session به درستی ارسال نمی‌شود.

مخصوصا وقتی:

  • Domain جدا باشد
  • CORS فعال باشد
  • Cookie ارسال نشود

مشکل CSRF و Session

Session و CSRF به هم مرتبط هستند.

اگر Cookie ارسال نشود:

  • Session شناسایی نمی‌شود
  • CSRF خطا می‌دهد

مشکل در Redis Session

اگر Redis Restart شود:

  • Session ها حذف می‌شوند
  • کاربران Logout می‌شوند

برای پروژه‌های واقعی باید Persistence تنظیم شود.

اشتباهات رایج برنامه نویسان

ذخیره داده سنگین داخل Session

مثلا:

request.session['products'] = huge_data

این کار اشتباه است.

Session باید سبک باشد.

ذخیره اطلاعات حساس

نباید:

  • رمز عبور
  • Token حساس
  • اطلاعات مالی

داخل Session ذخیره شوند.

استفاده زیاد از Session

بعضی پروژه‌ها همه چیز را داخل Session ذخیره می‌کنند.

این موضوع:

  • RAM را مصرف می‌کند
  • Performance را خراب می‌کند

تنظیم نکردن Expire

اگر زمان انقضا درست تنظیم نشود:

  • Session خیلی زود حذف می‌شود
  • یا بیش از حد طولانی باقی می‌ماند

روش‌های افزایش امنیت Session در Django

فعال کردن HTTPS

مثلا:

SESSION_COOKIE_SECURE = True

این کار باعث می شود Cookie فقط روی HTTPS ارسال شود.

جلوگیری از دسترسی JavaScript

مثلا:

SESSION_COOKIE_HTTPONLY = True

این کار امنیت را بیشتر می‌کند.

تغییر Session بعد از Login

برای جلوگیری از Session Fixation بهتر است Session جدید ساخته شود.

Django این کار را معمولا خودکار انجام می‌دهد.

استفاده از زمان انقضای مناسب

نباید Session بیش از حد طولانی فعال بماند.

روش جلوگیری از مشکلات Session

Session ها را سبک نگه دارید

فقط داده ضروری ذخیره کنید.

Backend مناسب انتخاب کنید

برای پروژه های بزرگ Redis انتخاب بهتری است.

تنظیمات امنیتی را جدی بگیرید

بخصوص:

  • Secure Cookie
  • HttpOnly
  • Expire Time

رفتار Session را تست کنید

مخصوصا در:

  • Login
  • Logout
  • Refresh Token
  • Mobile Browser

باید تست کامل انجام شود.

جمع بندی

Session در Django یکی از مهم‌ترین بخش‌های مدیریت کاربران و Authentication است. Django با استفاده از Session اطلاعات کاربر را بین Request های مختلف نگهداری می‌کند و از طریق Session ID کاربران را شناسایی می‌کند. اگر Session ها درست مدیریت شوند، هم امنیت پروژه بهتر می‌شود و هم تجربه کاربری پایدارتر خواهد بود.