راهنمای کامل احراز هویت با JWT، توکن دسترسی access token، توکن تجدید refresh token و چرخش توکن token rotation
مقدمه
احراز هویت مدرن برای API ها معمولا با JWT انجام میشود. هدف این مقاله توضیح ساده و دقیق ساختار JWT، تفاوت های توکن دسترسی access token و توکن تجدید refresh token، مفهوم token rotation و فرایند احراز هویت امن است. این مطلب مناسب توسعه دهندگان وب و مدیران محصول است که میخواهند سیستم احراز هویت ایمن و مقیاس پذیر بسازند.
⏱ زمان مطالعه: 6 دقیقه | 📝 تعداد کلمات: 675

JWT چیست؟
JWT فرمتی استاندارد برای حمل اطلاعات (claims) بین سرویس ها است. یک JWT سه بخش دارد: header، payload و signature.
header نوع الگوریتم و نوع توکن را مشخص میکند. payload شامل اطلاعاتی مانند sub، iat و exp است. و در واقع این signature است که تضمین میکند محتوا تغییر نکرده است.
ویژگی مهم JWT این است که استیت لس است. یعنی سرور برای اعتبارسنجی میتواند فقط با کلید امضای خود تایید کند و نیازی به ذخیره سشن در سرور ندارد. اما همین استیت لس بودن خطراتی دارد که باید با طراحی درست کنترل شوند، مخصوصا در مورد لغو توکن و طول عمر.

تفاوت access token و refresh token
توکن دسترسی access token معمولا کوتاه مدت است. برای دسترسی به منابع API ارسال میشود. طول عمر کوتاه، باعث کاهش اثار مخرب توکن لو رفته میشود.
توکن تجدید refresh token طول عمر بلندتری دارد و فقط برای گرفتن access token جدید استفاده میشود. «refresh token» معمولاً به صورت امن ذخیره میشود و کمتر در درخواست ها ارسال میشود.
نکتههایی درباره ذخیرهسازی (مهم): هرگز refresh token یا access token حساس را در جاوااسکریپت قابل دسترسی نگه ندارید. استفاده از کوکی های HttpOnly و Secure با Same Site مناسب امن تر است.


Token Rotation چیست و چرا مهم است؟
token rotation یعنی هر بار که refresh token استفاده میشود، یک refresh token جدید صادر و توکن قبلی باطل میگردد. این الگو مانع از حملات replay میشود. اگر یک مهاجم توکن قبلی را به دست بیاورد و سرور روتیشن داشته باشد، استفاده مجدد از توکن قدیمی قابل تشخیص است.
الگوریتم معمول:
۱. کاربر درخواست رفرش میدهد با refresh token.
۲. سرور بررسی میکند توکن معتبر و استفاده نشده باشد.
۳. اگر معتبر بود، یک access token و یک refresh token جدید صادر میشود.
۴. توکن قدیمی در لیست باطل شده یا وضعیت استفاده شده قرار میگیرد.
در صورت تشخیص استفاده مجدد از توکن قبلی، حساب یا session باید به حالت قرنطینه برود و کاربر مجبور به ورود مجدد شود.

فرایند احراز هویت با JWT و refresh token
- ورود کاربر: کاربر نامکاربری و رمز عبور ارسال میکند.
- اعتبارسنجی: سرور اعتبار کاربر را بررسی میکند.
- صدور توکنها: سرور یک access token کوتاه و یک refresh token طولانی صادر میکند.
- ذخیره امن: access token در حافظه کوتاه یا کوکی با عمر کوتاه و refresh token در کوکی HttpOnly ذخیره میشود.
- درخواستهای محافظتشده: کلاینت access token را در هدر Authorization ارسال میکند. سرور آن را بررسی میکند.
- رفرش توکن: اگر access token منقضی شد، کلاینت با refresh token درخواست توکن جدید میدهد. در صورت استفاده از token rotation، توکن جدید صادر و توکن قبلی باطل میشود.
- خروج و باطلسازی: در خروج، refresh token در سمت سرور باطل میشود یا در لیست سیاه قرار میگیرد.


بهترین شیوههای امنیتی برای JWT و refresh token
۱. مدت عمر access token را کوتاه نگه دارید.
۲. refresh token را در کوکی HttpOnly و Secure را با SameSite مناسب نگه دارید.
۳. از token rotation استفاده کنید تا حملات replay کاهش یابد.
۴. تشخیص استفاده مجدد از refresh token و واکنش مناسب.
۵. امکان باطل سازی سمت سرور (blacklist یا token store) فراهم کنید برای logout و تغییر رمز.
۶. از TLS همیشه استفاده کنید.
۷. اطلاعات («aud», «iss», «exp») را درست تنظیم کنید.
۸. از کتابخانههای شناخته شده استفاده کنید، مثلا برای Django از djangorestframework-simplejwt و برای وردپرس از افزونه های JWT معتبر. بازنویسی پیاده سازی امضا و رمزنگاری خودتان معمولا اشتباه و پرخطر است.



جمعبندی
JWT و refresh token پایهایترین روش مدرن برای احراز هویت امن هستند. استفاده درست از token rotation، ذخیره امن توکنها و بهترین شیوههای امنیتی باعث میشود سیستم شما هم ایمن باشد و هم تجربه کاربری خوبی فراهم کند.