سشن چیست؟ انواع سشنها، نحوه ساخت و مدیریت آنها
در این مقاله میخوانید
سشن یک فناوری مدرن در دنیای وب است که میتواند وضعیت کاربر را برای مدتزمانی محدود حفظ و ذخیره کند. با وجود سشن، وبسرور اطلاعات کاربر را بهصورت موقت ذخیره کرده و در صورت نیاز دوباره به آنها رجوع میکند. اما این مکانیزم چطور کار میکند؟ چرا بعضی سشنها بعد از بستن مرورگر از بین میرود، درحالیکه بعضی دیگر پایدار میماند؟ در این راهنما از بخش آموزش کسبوکار، نگاهی عمیق به سازوکار سشنها، انواع مختلف آنها و نحوهی ایجاد و مدیریتشان داریم. اگر مشتاق هستید که بدانید چرا سشنها قلب تپندهی وب و تجربهی کاربری مدرن است و چگونه میتوانید از آنها استفاده کنید، این راهنما را از دست ندهید.
تعریف سشن به زبان ساده
حتماً این تجربه را دارید که وقتی محصولی را به سبد خرید (Cart) وبسایتی اضافه میکنید، تا زمانی مشخص در سبد باقی میماند (حتی اگر به صفحات دیگر وبسایت بروید). همینطور وقتی وارد حساب کاربری (Account) خود میشوید، تا مدتی مشخص هنوز داخل حساب کاربری خود هستید. دلیل این امر ساخت یک سشن اختصاصی برای شما و توسط سرور (Server) است که اطلاعات ورود، سبد خرید و… در آن ذخیره میشود.
سشن (Session) شامل اطلاعاتی از نحوهی تعامل کاربر با سیستم در یک دورهی زمانی مشخص و محدود است که در سرور ذخیره میشود. این اطلاعات میتواند وضعیت سبد خرید، زبان یا تم (Theme) انتخابی برای وبسایت یا وباپلیکیشن (Web Application)، این که آیا کاربر وارد حساب کاربر شده یا نه و… باشد.
اما بعد از مدتزمانی مشخص، محتوای سبد خرید یا اطلاعات دیگری که وارد کرده بودید یا حتی ورود شما به حساب کاربریتان در وبسایت منقضی شده و از بین میرود. دلیل این امر محدود بودن زمان سشن است.
در اغلب وبسرورها (Web Server) و زبانهای برنامهنویسی تحتوب، مدتزمان پیشفرض سشن، بین 15 تا 30 دقیقه است. اگر کاربر در این مدت فعالیت دیگری نداشته باشد، سشن او منقضی میشود.
دلیل محدود بودن زمان سشن نیز ارتقای امنیت کاربر است. فرض کنید کاربر در حال استفاده از یک سیستم عمومی (مانند کافینت) باشد. در این صورت وقتی سشن او بهطور خودکار منقضی میشود، دیگران نمیتوانند به اطلاعاتی که در وبسایت وارد کرده دسترسی داشته باشند.
سشن Session یک مکانیسم، برای به خاطر سپردن اطلاعات و تعاملات کاربر با سیستم، در یک مدتزمان مشخص است. از آنجاییکه پروتکل HTTP نمیتواند اطلاعات درخواستهای قبلی کاربر را ذخیره کند، سشن این مشکل را حل میکند. وقتی کاربر یک درخواست به سرور میفرستد، سرور یک شناسهی یکتا (Session ID) به او اختصاص داده و اطلاعاتش را برای مدتی محدود ذخیره میکند. اطلاعاتی مانند محصولات داخل سبد خرید، نام کاربری، تنظیمات دلخواه و… .
کاربرد سشن چیست؟
ارتباطات مبتنی بر HTTP که پایه و اساس فضای وب است، بهصورت ذاتی Stateless (فاقد وضعیت ثابت) است. یعنی وقتی کاربر یک درخواست (Request) را به سرور ارسال کرده و پاسخ (Response) دریافت میکند، سرور هیچ اطلاعاتی را از وضعیت یا هویت کاربر نگه نمیدارد. اینجا است که سشن وارد عمل میشود و این اطلاعات را ذخیره میکند.
حفظ وضعیت کاربران و مدیریت آن در طول تعاملشان با یک سیستم، کاربرد اصلی سشن است. اما در نگاهی دقیقتر، سشنهای مزایای زیر را هم به ارمغان میآورد:
- کاهش بار روی مرورگر با کاهش حجم اطلاعات ذخیرهشده روی آن
- ارتقای تجربهی کاربری (user experience) با ذخیرهی موقتی تنظیمات و اطلاعات
- ارتقای امنیت کاربر به دلیل زمان محدود
- سادهسازی فرایند تبدیل کاربر به مشتری
چرخهی عمر سشن
سشن از کجا شروع میشود و کجا خاتمه پیدا میکند؟ در ادامه بهصورت گامبهگام میبینید.
-
ارسال درخواست توسط کاربر
ورود به سیستم در بیشتر موارد نقطهی شروع چرخهی عمر سشن (Session Lifecycle) است. اما این که دقیقاً سشن با انجام کدام فعالیتها ساخته شود، به تنظیماتی بستگی دارد که توسط توسعهدهنده مشخص شدهاست. بر همین اساس شروع یک سشن، میتواند با انجام یکی از تعاملات زیر توسط کاربر باشد:
- ورود به وبسایت
- ورود با نام کاربری و رمز عبور
- افزودن کالا به سبد خرید
- ارسال یک فرم یا نظر
- ارسال یک درخواست مبتنی بر API
- و…
برای آشنایی با API مقاله زیر را مطالعه نمایید:
-
تولید شناسهی سشن
وقتی اولین درخواست از کاربر دریافت شد، سرور یک شناسهی سشن یکتا تولید میکند. شناسهی سشن (Session ID) توسط سرور (یا گاهی مرورگر) ساختهشده و بهصورت انحصاری به یک کاربر اختصاص داده میشود. شناسهای که یک کد تصادفی 32 رقمی هگزادسیمال است و میتواند چیزی شبیه به 4af5ac6val45rf2d5vre58sd648ce5f7 باشد.
شناسهی کوکی (Cookie) تا زمان انقضای سشن به اطلاعاتی اشاره دارد که در طول همین سشن از این کاربر ذخیره شدهاست. این شناسه در کوکیهای مرورگر (Browser Cookie) یا در قالب Query Strings در URL وبسایت ذخیره میشود.
با هر تعاملی که کاربر با سیستم دارد، درخواست جدید همراه با شناسهی همان سشن به سرور ارسال میشود. سرور نیز پاسخ مناسب را بر اساس اطلاعات قبلی که در همین شناسه برای این کاربر ذخیره دارد، برمیگرداند.
-
ارسال شناسهی سشن به مرورگر
شناسهی سشن بهعنوان یک کوکی به مرورگر کاربر ارسال میشود. سپس با هر درخواست جدید کاربر، این شناسه از طریق کوکی به سرور ارسال شده و سرور میتواند اطلاعات مربوط به سشن قبلی را بازیابی کند.
اگر بکاند (Back-end) وبسایت PHP باشد، یک کوکی به نام PHPSESSID به سیستم کاربر ارسال میشود که شناسه را ذخیره میکند.
-
ذخیره یا بازخوانی اطلاعات کاربر
مهمترین وظیفهی سشن چیست؟ ذخیرهی اطلاعات کاربر! بعد از ساخت شناسه، یک فایل موقت روی سرور (در سشنهای سمت سرور) ساخته میشود. نام این فایل، همان شناسه است که به پیشوند _ sess همراه شدهاست.
سرور اطلاعات مرتبط با کاربر (مانند اطلاعات پروفایل، وضعیت ورود، سبد خرید و…) را برای همین شناسه ذخیره میکند. در واقع ذخیرهی اطلاعات سشن، به معنی حفظ وضعیت کاربر در سیستم است. اطلاعات سشن میتواند در سمت سرور یا سمت کاربر ذخیره شود که همین موضوع دستهبندیهای سشن را رقم میزند.
با هر درخواست جدید کاربر، PHP به کوکی PHPSESSID دسترسی پیدا کرده و شناسه منحصربهفرد را میگیرد تا بتواند اطلاعات همین کاربر را پیدا کند.
-
منقضی شدن سشن
سشنها پس از مدتی مشخص یا وقتی کاربر از سیستم خارج میشود، منقضی میشود. شناسهی سشن و اطلاعات ذخیرهشده آن نیز حذف میشود تا منابع سرور آزاد شود. البته در بعضی موارد امنیتی یا حساس و بسته به نوع سشن، میتوان آن را بهصورت دستی و زودتر از موعد حذف کرد.
برای آشنایی بیشتر با کوکیها، مقاله زیر از سایت پارسپک را مطالعه کنید:
انواع سشن
سشن بسته به این که اطلاعاتش کجا ذخیره شود و دقیقاً چطور منقضی شود، شامل انواع مختلفی است. در ادامه با مهمترین انواع سشن آشنا میشوید.
-
سشنهای سمت سرور
اگر ذخیره اطلاعات کاربر در سرور انجام شود، به آن سشن سمت سرور (Server-Side Session) میگویند. در این روش فقط یک شناسه از سرور به مرورگر ارسال میشود تا درخواستهای بعدی هم به همین کاربر با همین شناسه ربط پیدا کند. پس اطلاعات اصلی کاربر اصلاً به مرورگر فرستاده نمیشود.
مدیریت سشنها در این روش راحتتر است و بهراحتی میتوان آنها را تمدید یا منقضی کرد. ضمن این که امنیت این روش هم فوقالعاده بالا است. چون اطلاعات در سرور است و هکرها فقط با سرقت شناسه سشن میتوانند به آنها دست پیدا کنند. سیستمهای حساسی مانند بانکداری آنلاین در سیستمهای بزرگ معمولاً با سشنهای سمت سرور همراه میشود.
از معایب این روش این است که اگر تعداد کاربران بالا باشد، حافظهی زیادی از سرور اشغال میشود. همینطور اگر کاربر آفلاین (Offline) شده یا سرور به هر دلیلی قطع یا ریستارت (Restart) شود، سشن هم از دسترس خارج میشود.
-
سشنهای سمت کاربر
در سشنهای سمت کاربر (Client-Side Session)، بر خلاف روش قبل، تمام اطلاعات سمت خودِ کاربر ذخیره میشود. محل ذخیرهی این اطلاعات یکی از موارد زیر است:
- کوکی مرورگر (Browser Cookie) که به آن سشن مبتنی بر کوکی میگویند.
- حافظهی محلی (Local Storage)
- حافظهی سشن مرورگر (Session Storage)
سازوکار کلی این سشنها به این ترتیب است که اطلاعات رمزگذاریشده (با JWT یا قالبهای امن دیگر) به مرورگر یا اپلیکیشن ارسال میشود. با هر درخواست جدید هم اطلاعات به سرور ارسال میشود تا اعتبارسنجی شود.
مزیت این سشن چیست؟ علاوه بر این که اطلاعات سشن حتی در حالت آفلاین نیز در دسترس است، منابع سرور نیز کمتر مصرفشده و بار پردازشی آن کاهش پیدا میکند. اما امنیت اطلاعات این سشن کمتر بوده و محدودیت اندازهی کوکیها یا حافظهی محلی میتواند یک چالش باشد. امکان لغو یا منقضی کردن سریع سشن نیز به دلایل امنیتی وجود ندارد.
-
سشنهای مبتنی بر کوکی
سشنهای مبتنی بر کوکی (Cookie-Based Sessions) یکی از انواع سشنهای سمت کاربر است. برای ساخت این سشنها، سرور یک شناسهی یکتا برای کاربر تولید کرده و آن را در قالب یک کوکی به مرورگر کاربر میفرستد. مرورگر این شناسه را ذخیره کرده و در تمام درخواستهای بعدی کاربر، به سرور ارسال میکند. سرور نیز اطلاعات ذخیرهشده این شناسه را از پایگاه دادهی خود میخواند.
سشنهای مبتنی بر کوکی، دو نوع دارد:
سشن مبتنی بر کوکی غیرایمن (Non-secure session cookie): شامل یک شناسهی فعالیت است که اطلاعاتی را ذخیره میکند که حساسیت کمتری دارد (مانند زبان انتخابی وبسایت، نوع ارز ترجیحی و…). این کوکی میتواند در بستر SSL یا غیر SSL بین مرورگر و سرور جریان پیدا کند.
سشن مبتنی بر کوکی امن (Secure authentication cookie): حاوی اطلاعات حساستری مانند دادههای احراز هویت است و در بستر SSL یا همان Secure Socket Layer بین مرورگر و سرور شکل میگیرد.
-
سشنهای بدون کوکی
در سشنهای بدون کوکی (Cookie-Less Sessions)، شناسهی سشن به جای ذخیره شدن در کوکی، در آدرسهای URL گنجانده میشود. یعنی شناسهی سشن در URL همان صفحهای که کاربر وارد آن شده و به شکل کوئری استرینگ (Query String) جایگذاری میشود.
برای مثال URL به این شکل خواهد بود:
http://example.com/(S(klnc3sshuaf3ngm3ihnpch2v))/home.aspx
این شناسه معمولاً بین نام وبسایت یا اپلیکیشن و مسیر فایل قرار میگیرد. سرور این URL را که شامل شناسه است میشناسد و میداند به کدام اطلاعات تعلق دارد.
بیشترین کاربرد این سشن چیست؟ در مواردی که مرورگر کاربر، اجازهی ذخیرهی کوکی را نمیدهد (به دلایل امنیتی یا تنظیمات کاربر). اما این نکته را در نظر بگیرید که این روش نسبت به حملات ربودن سشن (Session Hijacking) آسیبپذیرتر است. چون اگر URL به اشتراک گذاشته شود یا هکر به آن دست پیدا کند، اطلاعات کاربر لو میرود.
نکته: در اغلب موارد منظور از سشنهای بدون کوکی، همان سشنهای مبتنی بر URL یا URL-based sessions است. اما این گزینه هم وجود دارد که سشن به روشهای دیگری (مثلاً در هدرهای HTTP) ارسال شود.
-
سشنهای پایدار
تقریباً همهی انواع سشنها، میتواند از نوع سشنهای پایدار (Persistent Sessions) هم باشد. پایدار بودن سشن به معنی منقضی نشدن آن بعد از خروج از مرورگر یا خاموش کردن دستگاه است. برای مثال در شبکههای اجتماعی (Social media) (مانند فیسبوک (Facebook) یا اینستاگرام (Instagram))، معمولاً کاربر پس از ورود به سیستم، با بستن مرورگر از حساب خارج نمیشود.
اگر سشنهای مبتنی بر کوکی از نوع پایدار باشد، تاریخ انقضای طولانیتری برایشان تعریف میشود. در سشنهای بدون کوکی پایدار نیز میتوان شناسهی سشن را در اپلیکیشن کاربر ذخیره کرد (مثلاً در حافظهی محلی (Local Storage) یا حافظهی سشن (Session Storage) در مرورگر).
در مورد سشنهای سروری نیز میتوان زمان انقضای دادههای سشن را در سرور به تأخیر انداخت. همینطور میتوان آن را با روشهای دیگری مانند کوکیهای پایدار یا شیوههای ذخیرهی شناسهی سشن (مثل Local Storage) ترکیب کرد.
نحوهی ایجاد سشن
در هر زبان برنامهنویسی یا فریمورکی (Framework) باید از شیوهی متفاوتی برای ساخت سشنها استفاده کنید. اما در ادامه کدهای پایهای ایجاد سشنها در PHP را (بهعنوان یکی از محبوبترین زبانهای وب) میبینید.
تابع Session-start در PHP برای ساخت سشن استفاده میشود. توصیه میشود که این تابع را قبل از کدهای دیگر و حتی قبل از کدهای HTML قرار دهید.
دقت کنید که پیشفرض محل ذخیرهسازی اطلاعات سشن در زبان PHP، سمت سرور است. پس برای این کار به تنظیمات خاصی نیاز ندارید و کافی است کدهای زیر را بنویسید.
<?php session_start(); if( isset( $_SESSION['counter'] ) ) { $_SESSION['counter'] += 1; } else { $_SESSION['counter'] = 1; } $my_Msg = "This page is visited ". $_SESSION['counter']; $my_Msg .= " time during this session."; ?> <html> <head> <title>Starting a PHP session</title> </head> <body> <?php echo ( $my_Msg ); ?> </body> <html/>
این کدها، اطلاعات سشن را در متغیر SESSION_$ و از نظر محل نگهداری نیز در فایلهای موقت سرور (معمولاً در /tmp) ذخیره میکند. برای فراخوانی اطلاعات سشن نیز باید دوباره از متغیر SESSION_$ استفاده کنید.
خروجی کدهای بالا را میتوانید در تصویر زیر ببینید:
نحوهی مدیریت سشن
متغیر سشن در واقع همان اطلاعات سشن است که در سرور ذخیره میشود. به عبارت دیگر، منظور از متغیر سشن، همان دادههایی است که در سشن برای یک کاربر خاص ذخیره میشود و توسط برنامهنویس قابل دسترسی و مدیریت است. بنابراین در بحث مدیریت سشنها، متغیرها مهمترین نقش را ایفا میکند.
آرایه $_SESSION مهمترین نقش را در مدیریت سشنهای PHP دارد. میتوانید با کلیدها و مقادیر مختلف و با دسترسی به خانههای مختلف این آرایه، سشنها را از جنبههای مختلف مدیریت کنید. در ادامه کدهای پایهای بعضی از این امور را میبینید.
دسترسی به مقدار خاصی از سشن:
فعالسازی سشن:
session_start(); ;echo $_SESSION['key_name']
حذف یک متغیر سشن:
unset($_SESSION['key_name']);
حذف تمام مقادیر سشن:
session_unset();
جمعبندی
در این راهنما دیدید که سشن چیست و آن را بهعنوان یکی از مهمترین ابزارهای حفظ اطلاعات کاربر و ارتقای تجربهی کاربری وب شناختید. انتخاب نوع مناسب سشن به نیازهای پروژه و سطح امنیتی لازم بستگی دارد. در بیشتر موارد، سشنهای سمت سرور به دلیل امنیت و کارایی بالاتر، انتخاب بهتری است. اما استفاده از سشنهای پایگاه داده نیز برای سیستمهای توزیعشده ضروری است. ضمن این که از سشنهای سمت کاربر هم میتوانید برای کاهش بار سرور و برای دادههای غیرحساس استفاده کنید.
سؤالات متداول
سشن چیست؟
سشن مکانیسمی است که سرور به کمک آن میتواند اطلاعات و وضعیت تعامل یک کاربر خاص را در طول ارسال درخواستهای HTTP مختلف، حفظ کند.
چطور از امنیت شناسههای سشن مطمئن شویم؟
استفاده از پروتکلHTTPS ، محدود کردن عمر سشنها، استفاده از کوکیهای امن (HttpOnly و Secure) و… .
آیا میتوان سشنها را رمزگذاری کرد؟
بله، دادههای سشن سمت کاربر (در کوکیها) معمولاً رمزگذاری میشود. دادههای سمت سرور نیازی به رمزگذاری ندارد؛ اما برای امنیت بیشتر میتوان آنها را رمزگذاری کرد.