JWT (JSON Web Token) یک استاندارد باز (RFC 7519) است که روشی فشرده و خودحاوی برای انتقال ایمن اطلاعات بین طرفین تعریف میکند. این اطلاعات میتوانند تأیید و اعتماد شوند زیرا به صورت دیجیتالی امضا شدهاند.
ساختار JWT
JWT از سه بخش تشکیل شده است که با نقطه (.) جدا میشوند: سرآیند (Header)، بار (Payload) و امضا (Signature). سرآیند الگوریتم امضا را مشخص میکند، بار شامل ادعاها است و امضا برای تأیید عدم تغییر پیام استفاده میشود.
موارد استفاده رایج از JWT
احراز هویت (رایجترین مورد)، تبادل اطلاعات (JWT میتواند اطلاعات را به صورت ایمن انتقال دهد زیرا امضا شده است)، مجوز (شامل اطلاعات مجوز کاربر) و پیادهسازی ورود یکباره.
انواع الگوریتمهای امضا
JWT از چندین الگوریتم امضا پشتیبانی میکند که عمدتاً به دو دسته تقسیم میشوند: الگوریتمهای متقارن مبتنی بر HMAC (مانند HS256) و الگوریتمهای نامتقارن مبتنی بر RSA/ECDSA (مانند RS256، ES256). الگوریتمهای متقارن از همان کلید برای امضا و تأیید استفاده میکنند، در حالی که الگوریتمهای نامتقارن از کلید خصوصی برای امضا و کلید عمومی برای تأیید استفاده میکنند.
نکات امنیتی
اطلاعات حساس (مانند رمز عبور) را در JWT ذخیره نکنید زیرا بخش بار فقط به صورت Base64 کدگذاری شده است و رمزگذاری نشده است. برای برنامههای با امنیت بالا، توصیه میشود از زمان انقضای کوتاهتر استفاده کنید و استراتژی چرخش توکن را پیادهسازی کنید.
پس از انقضای JWT چه باید کرد؟
پس از انقضای JWT، سرور این توکن را رد میکند. روش توصیه شده پیادهسازی مکانیسم توکن تازهسازی (Refresh Token) است که در آن مشتری از توکن تازهسازی برای دریافت توکن دسترسی جدید استفاده میکند بدون اینکه نیاز باشد کاربر دوباره وارد شود. توکنهای تازهسازی معمولاً مدت اعتبار طولانیتری دارند اما باید با احتیاط ذخیره شوند.
چگونه JWT را باطل کنیم؟
به طور دقیق، JWT به عنوان توکن بدون حالت طراحی شده است و نمیتواند واقعاً باطل شود. اما چند راهحل رایج وجود دارد: حفظ لیست سیاه توکنهای باطل شده (ممکن است مزیت بدون حالت JWT را خنثی کند)، استفاده از زمان انقضای کوتاه همراه با توکن تازهسازی، یا تعبیه شناسه نسخه در توکن که سرور میتواند نسخههای قدیمی را رد کند.
تفاوت بین JWT و session چیست؟
JWT یک توکن خودحاوی است که شامل تمام اطلاعات لازم است و برای سیستمهای توزیع شده مناسب است و نیازی به ذخیره حالت جلسه در سرور ندارد. Session بر اساس ذخیرهسازی سمت سرور است و نیاز به حفظ حالت جلسه دارد و برای معماری تک سرور مناسبتر است. JWT برای گسترش بهتر است اما باطل کردن آن پیچیده است؛ Session به راحتی باطل میشود اما قابلیت گسترش کمتری دارد.