JWT برای session نه؛ کوکیِ ساده آره
خلاصهٔ کاملتر
این یادداشتِ کوتاه و پرطرفدار یه پیامِ سرراست داره: از JWT برای نگهداشتنِ کاربر در حالتِ لاگین استفاده نکن. به گفتهٔ نویسنده، JWT برای این کار طراحی نشده، امن نیست، و ابزارِ بهتری هم که دقیقاً برای همین ساخته شده وجود داره — همون session کوکیِ معمولی.
دلایلش چند تاست. اول اینکه خودِ استانداردِ JWT مخصوصِ توکنهای خیلی کوتاهعمره (حدودِ پنج دقیقه یا کمتر)، در حالی که session باید عمرِ طولانیتری داشته باشه. دوم، احرازِ هویتِ بهاصطلاح «بیحالت» (stateless) عملاً بهشکلِ امن شدنی نیست؛ در هر حال باید یهجایی حالت نگه داری، و وقتی مجبوری داده ذخیره کنی، بهتره کلِ داده رو همونجا نگه داری. سوم، JWTیی که فقط یه توکنِ ساده رو حمل میکنه، از کوکیِ session هم ناکارآمدتره و هیچ مزیتی بهت نمیده.
به گفتهٔ نویسنده، خودِ خانوادهٔ استانداردِ JWT هم پیشِ کارشناسانِ امنیت مورد اعتماد نیست؛ نسخهٔ اولیهاش عملاً ساختنِ توکنِ جعلی رو ممکن میکرد و احتمالاً اشکالاتِ دیگهای هم داره. همین باعث میشه نویسنده بگه باید از JWT در هر چیزِ مرتبط با امنیت و احراز هویت پرهیز کرد.
نویسنده به چند اعتراضِ رایج هم جواب میده. «ولی گوگل از JWT استفاده میکنه!» — به گفتهٔ او گوگل برای session کاربر در مرورگر از JWT استفاده نمیکنه، بلکه از session کوکی؛ JWT رو فقط برای انتقالِ single sign-on بینِ سرورها بهکار میبره که یکی از کاربردهای معقولشه. «ولی stateless بهتره!» — بدونِ منابعِ عظیم نمیشه احرازِ هویتِ واقعاً بیحالت و امن داشت.
به گفتهٔ نویسنده، راهاندازیِ session سخت نیست و معمولاً هر فریمورکِ وب یه پیادهسازی توش داره. اکسپرس و بقیهٔ فریمورکهای Node.js چون ماژولارن کمی استثنان؛ اونجا با میدلورِ express-session و یه اتصالِ ذخیرهسازی مثل connect-session-knex (برای Postgres یا MySQL) کار راه میافته. و اگه واقعاً به یه توکنِ کوتاهعمرِ امضاشده نیاز داشتی، استانداردِ PASETO گزینهٔ امنیه — فقط برای session ازش استفاده نکن.
نکات کلیدی:
- به گفتهٔ نویسنده، JWT برای نگهداشتنِ session طراحی نشده و امن نیست
- JWT ذاتاً برای توکنهای خیلی کوتاهعمر ساخته شده، ولی session عمرِ طولانی میخواد
- احرازِ هویتِ کاملاً بیحالت و امن بدونِ نگهداشتنِ حالت عملی نیست
- گوگل هم برای session مرورگر از کوکی استفاده میکنه، نه JWT
- برای session از کوکیِ معمولی و برای توکنِ کوتاهعمر از PASETO استفاده کن




