JWT چیست و چه تفاوتی با Session دارد؟

پرسشی ساده اما حیاتی: سرور از کجا میفهمد درخواست هزارم شما هم متعلق به همان کسی است که رمز را درست زد؟ پروتکل وب ذاتاً بیحافظه است و هر درخواست برای سرور یک غریبه کامل است. برای اینکه تجربه «وارد شدهام» معنا پیدا کند، سامانهها دو راه اصلی برای حمل حافظه هویت دارند: نگهداشتن وضعیت در سرور با نشست (Session)، یا سپردن مدرک امضاشده به خود کاربر با توکن JWT.
این دو راه، دو فلسفه متفاوتاند: اعتمادِ محافظتشده در خانه، یا مدرک رسمی در جیب مسافر. انتخاب میان آنها بر مقیاسپذیری، امنیت و حتی تجربه کاربری اثر میگذارد. در این مقاله هر دو را با تشبیههای ملموس باز میکنیم، در جدولی کنار هم میگذاریم و در پایان، معیاری عملی برای تصمیمگیری میسازیم.
مسیر نخست: نشست (Session)؛ حافظه در سرور
وقتی کاربر وارد میشود، سرور رکوردی در حافظه یا پایگاه داده میسازد: «نشست شماره X متعلق به فلان کاربر است و تا فردا معتبر است». به کاربر فقط شماره نشست داده میشود — معمولاً در قالب کوکی (Cookie) — و در هر درخواست همان شماره نشان داده میشود. مثل کلید امانتخانه: جعبه نزد سرور است و شما فقط شمارهاش را دارید.
قدرت این مدل در کنترل است. سرور میتواند هر لحظه نشستی را باطل کند، مدت اعتبارش را کوتاه کند یا محتوایش را ببیند. هزینهاش هم وابستگی است: اگر چند سرور دارید، همه باید به منبع مشترک نشستها دسترسی داشته باشند، وگرنه کاربری که یک بار وارد شده، در درخواست بعدی غریبه اعلام میشود.
مسیر دوم: JWT؛ مدرک امضاشده در جیب کاربر
JWT یا JSON Web Token رویکردی معکوس دارد: وضعیت لازم را خودِ توکن حمل میکند. توکن از سه بخش مفهومی ساخته شده: سرصفحه (Header) که نوع بسته و الگوریتم امضا را معرفی میکند، بدنه (Payload) که ادعاها را حمل میکند — شناسه کاربر، نقش، زمان انقضا — و امضا (Signature) که صحت این بسته را تضمین میکند. سرور با کلید مخفیاش بسته را امضا میکند و هر سروری که همان کلید را دارد، بدون مراجعه به منبع مشترک میتواند اعتبار آن را تأیید کند.
تصویر ذهنی خوب، بازوبند کنگره است: نوشتههای روی آن را همه میبینند و هیچکس نمیتواند جملهای به آن اضافه کند، مگر اینکه قلمِ امضا به دستش باشد. همین ویژگی — خوانا اما تغییرناپذیر — ستون فقرات JWT است و یک پیامد مهم دارد: توکن رمزنگاریشده نیست؛ پس هیچ داده حساسی نباید داخلش سفر کند.
مقایسه در یک نگاه
| معیار | نشست (Session) | توکن (JWT) |
|---|---|---|
| محل نگهداری وضعیت | حافظه یا پایگاه داده سرور | خودِ توکن نزد کاربر |
| نقش کلاینت | فقط شماره نشست، معمولاً در کوکی | حمل کل مدرک در کوکی، حافظه اپ یا سرصفحه درخواست |
| بار سرور | نگهداری و بازیابی وضعیت برای هر کاربر | فقط بررسی امضا؛ بدون نگهداری وضعیت |
| مقیاسپذیری چند سرور | نیازمند منبع مشترک نشستها | طبیعی؛ هر سرور با کلید امضا کار میکند |
| ابطال زودهنگام | فوری و ساده با حذف رکورد | دشوار؛ تا انقضا باید صبر کرد یا فهرست ابطال نگه داشت |
| اندازه | کوچک؛ فقط یک شناسه | بزرگتر؛ همه ادعاها در هر درخواست حمل میشود |
| ریسک مرتبط | سرقت کوکی و سوءاستفاده از شماره نشست | سرقت توکن از محل ذخیرهسازی و استفاده تا زمان انقضا |
| سناریوی مناسب | اپ تحت وب تکدامنهای با نیاز به کنترل فوری | اپ موبایل، میکروسرویسها و سامانههای چنددامنهای |
تحلیل: کجا هر مدل میدرخشد و کجا لنگ میزند
زمانی که Session انتخاب درست است
اپلیکیشن تحت وب کلاسیک — فروشگاه، پنل سازمانی، سامانه پشتیبانی — با یک دامنه و نیاز به خروج فوری، با نشست سادهتر و امنتر جلو میرود. کنترل کامل سرور یعنی حساب کاربری مشکوک را میتوان در یک لحظه از همه نشستها بیرون انداخت و دیگر هیچ درخواستی با آن پذیرفته نمیشود.
زمانی که JWT معنا پیدا میکند
وقتی سرویسها خرد و پراکندهاند یا کلاینت موبایل است، حمل مدرک امضاشده منطقی است: هر سرویس بدون هماهنگی با فروشگاه مشترک نشست، توکن را تأیید میکند و بار نگهداری وضعیت از سرورها برداشته میشود. به همین دلیل در معماری میکروسرویس (Microservices) و APIهای عمومی، توکنهای امضاشده انتخاب رایجاند.
نقطه آسیبپذیر هر دو
هیچکدام خودبهخود امن نیستند. نشست اگر کوکیاش بدون محافظت جابهجا شود قابل سرقت است و JWT اگر در انبار ناامن مرورگر یا اپ نگه داشته شود، تا لحظه انقضا مثل کلید گمشده عمل میکند. راهکارهای جبرانی همخانوادهاند: عمر کوتاه برای توکن، توکن تازهسازی (Refresh Token) برای دریافت مدرک جدید و فهرست ابطال برای موارد اضطراری؛ هر کدام هزینه و پیچیدگی خود را به معماری اضافه میکنند.
مثال کاربردی: فروشگاه اینترنتی
فرض کنید فروشگاهی هم وبسایت دارد، هم اپ موبایل و هم سرویس پسزمینه سفارشها که بهتازگی به چند سرویس کوچکتر شکسته شده است. وبسایت با نشست کار میکند: کنترل فوری، خروج مطمئن و نگهداری سبد خرید سمت سرور. اپ موبایل و ارتباط میان سرویسها با JWT جلو میرود: هر سرویس امضای توکن کاربر را بررسی میکند و بدون نگرانی از اشتراک حافظه، ادامه میدهد.
تفاوت رفتاری را هم کاربر حس میکند: در وب، «خروج» یعنی نابودی نشست و بستهشدن همه درها؛ در موبایل، تا پایان عمر توکن مدرک باقی میماند و اگر دستگاه سرقت شود، ابطال فوری فقط با سازوکارهای جانبی ممکن است. همین تفاوت است که انتخاب را از یک بحث سلیقهای به یک تصمیم معماری تبدیل میکند.
خطاهای رایج
- گذاشتن داده حساس در بدنه JWT: بدنه فقط خوانا و قابل رمزگشایی است؛ هیچ رازی نباید آنجا جابهجا شود.
- عمر بیدلیل طولانی توکنها بدون سازوکار ابطال: هر روز عمر اضافه، پنجره خطر را بازتر میکند.
- ذخیره توکن در محلهای پرخطر کلاینت بدون ارزیابی: انتخاب محل نگهداری بخشی از طراحی امنیتی است، نه جزئیاتی بیاهمیت.
- فرض اینکه «توکن داریم پس امنیم»: تأیید امضا فقط دروازه ورود است؛ مجوز هر منبع باید جداگانه بررسی شود.
نتیجه عملی: چگونه تصمیم بگیریم؟
سه پرسش را از پروژه بپرسید: چند دامنه و چند نوع کلاینت داریم؟ حساسیت ابطال فوری چقدر است؟ تیم ظرفیت نگهداری منبع مشترک نشستها را دارد؟ اگر مرکز ثقل شما یک اپ تحت وب با کنترل سختگیرانه است، نشست سادهترین پاسخ است. اگر معماری پراکنده و کلاینتهای متنوع دارید، JWT با عمر کوتاه و سازوکار تازهسازی منطقیتر است. و اگر سامانهتان ترکیبی است، ترکیب هر دو نهتنها عجیب نیست، بلکه در محصولات واقعی رایج و معقول است.
نکات کلیدی این مقاله
- وب ذاتاً بیحافظه است؛ نشست حافظه را در سرور میسازد و JWT آن را به مدرک امضاشدهای نزد کاربر تبدیل میکند.
- JWT خوانا اما تغییرناپذیر است؛ امضا صحت ادعاها را تضمین میکند، نه محرمانگیشان را.
- نشست ابطال فوری میدهد و JWT مقیاسپذیری طبیعی؛ انتخاب یعنی اولویتبندی این دو ویژگی.
- عمر کوتاه توکن و سازوکار تازهسازی، فاصله میان جاذبه و خطر JWT را مدیریت میکند.
- هر دو مدل فقط دروازهاند؛ مجوز دسترسی به هر منبع باید جداگانه بررسی شود.
سوالات متداول
آیا JWT خودش رمزنگاری شده است؟
نه. JWT فقط امضاشده است؛ هر کسی که توکن را ببیند، محتوای بدنهاش را میتواند بخواند. امضا فقط مانع تغییر محتوا میشود. اگر محرمانگی لازم است، باید لایه رمزنگاری جداگانهای در نظر گرفته شود.
چرا ابطال JWT سخت است؟
چون سرور در این مدل وضعیتی نگه نمیدارد و توکن را فقط با امضا و تاریخ انقضا میسنجد؛ پس «باطل کردن» یعنی افزودن وضعیت دوباره به سیستمی که عمداً بدون وضعیت طراحی شده است، مثلاً با فهرست ابطال یا عمرهای بسیار کوتاه.
میتوانیم هر دو روش را همزمان داشته باشیم؟
بله. در محصولات واقعی معمول است که وبسایت با نشست کار کند و اپ موبایل یا سرویسهای داخلی با توکن. مهم این است که هر مسیر، قواعد خودش را شفاف داشته باشد و سیاست ابطال هرکدام از پیش تعیین شده باشد.



