
احراز هویت یکی از بخشهای مهم هر سیستم یا وبسایته. یعنی سیستم بفهمه تو همونی هستی که میگی هستی.قبلاً این کار با Session انجام میشد: بعد از لاگین، سرور اطلاعات کاربر لاگینکرده رو نگه میداشت و هر درخواست رو بررسی میکرد. اما با افزایش تعداد کاربران، ذخیرهسازی Session برای سرور مشکلساز شد و مقیاسپذیری سخت میشد.اینجا بود که ایدهی Token به وجود اومد: به جای اینکه سرور وضعیت کاربر رو نگه داره، خود کاربر یه مدرک همراهش داشته باشه که قابل بررسی باشه. یکی از انواع معروف این توکنها JWT یا JSON Web Token است.
یه توکن متنیه که اطلاعات رو به صورت JSON نگه میداره و برای احراز هویت کاربر استفاده میشه.
تفاوت اصلی با Session:
Session: سرور وضعیت رو نگه میداره
JWT: سرور وضعیت کاربر رو ذخیره نمیکنه، همه اطلاعات لازم داخل خود توکنه
JWT از سه بخش تشکیل شده که با نقطه (.) از هم جدا میشن:
xxxxx.yyyyy.zzzzz
Header:
شامل اطلاعات توکن و الگوریتم امضا
سرور میفهمه چطور توکن رو بررسی کنه
Payload:
اطلاعات کاربر + زمان انقضا (exp)
مثال: user_id, نقش کاربر، تاریخ انقضا
نکته مهم: Payload رمزنگاری نشده، یعنی هر کسی که توکن داشته باشه میتونه محتواشو ببینه. پس اطلاعات حساس داخلش نذارید.
Signature:
امضا با کلید خصوصی سرور (Secret Key) ساخته میشه
وقتی توکن برمیگرده سرور دوباره امضا رو محاسبه میکنه و بررسی میکنه که Payload تغییر نکرده باشه
به این ترتیب سرور متوجه دستکاری توکن میشه بدون اینکه وضعیت کاربر رو نگه داشته باشه.
لاگین کاربر: یوزرنیم و پسورد ارسال میکنه
ساخت JWT توسط سرور:
سرور اطلاعات کاربر + زمان انقضا رو داخل Payload میذاره
Signature با Secret Key ساخته میشه
ارسال توکن به کاربر: معمولاً تو هدر Authorization: Bearer <JWT>
درخواستهای بعدی: کاربر JWT رو همراه هر درخواست میفرسته
اعتبارسنجی سرور:
بررسی امضا
بررسی زمان انقضا
تصمیمگیری اجازه یا عدم اجازه
نکته: سرور هیچ Session یا وضعیت کاربر رو نگه نمیداره، فقط قوانین و کلید امضا رو میدونه.
Exp: مشخص میکنه توکن تا چه زمانی معتبره
JWT به خودی خود امن نیست، فقط اگر دست کسی نیفته و در مکان امن ذخیره بشه میتونه امن باشه
روشهای امن ذخیره:
HttpOnly Cookie
ارسال فقط روی HTTPS
هر توکن طول عمر کوتاه داشته باشه، امنیت بیشتره
برای طولانیترها از Refresh Token استفاده میکنیمExp: مشخص میکنه توکن تا چه زمانی معتبره
JWT به خودی خود امن نیست، فقط اگر دست کسی نیفته و در مکان امن ذخیره بشه میتونه امن باشه
روشهای امن ذخیره:
HttpOnly Cookie
ارسال فقط روی HTTPS
هر توکن طول عمر کوتاه داشته باشه، امنیت بیشتره
برای طولانیترها از Refresh Token استفاده میکنیم
JWT = امنیت کامل نیست
JWT فقط ابزار احراز هویته، امنیت کامل به پیادهسازی بستگی داره
اطلاعات داخل JWT رمزنگاری نشده
Payload رو هرکسی میتونه ببینه
JWT جلوی CSRF/XSS رو نمیگیره
نحوه ذخیره و ارسال مهمه
JWT همیشه بهترین انتخاب نیست
برای سیستمهای ساده Session بهتره، JWT بیشتر برای API و Microservice مناسبتره
برداشت خودم از JWT:
یه ابزار ساده و مفید برای احراز هویت تو سیستمهای مدرن
Stateless بودنش باعث میشه سرور سبک باشه و مقیاسپذیری راحتتر باشه
ولی امنیتش کاملاً وابسته به کلید امضا، زمان انقضا و محل ذخیره توکن هست
اگر این اصول رعایت بشه، یه روش امن و کارآمده
بزرگترین اشتباه اینه که فکر کنیم چون JWT امضا داره، همه چیز امنه. کلید، محل ذخیره و مدیریت عمر توکن خیلی مهمه.