#C

افزایش امنیت JWT توسط Refresh Token در ASP NET Core

وقتی از Jwt برای احراز هویت برنامه خودتان استفاده میکنید سوالی که پیش می آید این هست که زمانی که توکن کاربر Expire (منقضی) شد چی اتفاقی می افتد؟!

آیا باید کاربر را مجبور به Logout کنیم و از او  بخواهیم دوباره لاگین کند؟ اگر وسط یک عملیات مهم باشد چه اتفاقی رخ می دهد؟!  همه چیز از دست میره متاسفانه!!!!

شاید باید مدت زمان توکن را زیاد کنیم، مثلا ۱ سال !! تا دیر به دیر به زمان انقضا برسد. که این روش عملا بدترین راه حل ممکن هست چرا که اگر توکن به سرقت برود، هکرها تا یک سال می توانند هر عملی میخواهند با توکن کاربر (هویتش) انجام دهند.

یا اینکه یوزر و پسورد کاربر را بگیریم سمت سرور خود ذخیره کنیم (مثلا داخل localStorage  وب) و هر موقع توکن کاربر به تاریخ انقضا رسید، به شکل غیر مستقیم ادمین سایت ، یوزر و پسورد کاربر را بفرستیم و توکن جدید بگیریم؟! البته این روش هم ضعف امنیتی به وجود می آورد چون یوزر و پسورد کاربر در معرض خطر جدی امنیتی قرار می گیرد.

راه حل چیست؟

راه حل استفاده از Refresh Token هست. به این صورت که وقتی کاربر برای بار اول در سیستم مورد احراز هویت قرار می گیرد، یوزر و پسورد کاربر را به سرور انتقال پیدا می کند و  سرور ما ۲ توکن به کاربر اختصاص می دهد. یکی access_token که همان Jwt هست و دیگری یک refresh_token که عملا یک متن رندم (مثلا یک Guid) هست.
این رفرش توکن (guid) داخل دیتابیس  سرور ما ذخیره شده که به ازای چه کاربری و چه access_token ایی هست، در نتیجه وقتی کاربر access_token اش منقضی می شود به جای آنکه لازم باشد ۲مرحله یوزر و پسورد برای سرور ما ارسال شود، با فرستادن refresh_token میتواند یک توکن جدید (شامل یک access_token جدید + یک refresh_token جدید) دریافت کند به اینصورت ضریب امنیت بالا می رود. (چون کاربر پسورد نمی فرستد.)

ضمن اینکه هر بار گرفتن access_token توسط refresh_token ، آن access_token قبلی را غیرفعال می کند، پس اگر access_token به سرقت برود، با Revoke کردن آن توسط refresh_token، غیر قابل استفاده می شود و باز هم ضریب امنیت بالاتر می رود.

این عملیات هم سمت فرانت یا کلاینت باید پشت پرده و کاملا ناملموس انجام بشود تا کاربر اصلا متوجه logout و login شدن مجددش نشود. به طورمثل داخل Angular توسط HttpIncerceptor میتونیم قبل از Api Call ها چک کنیم که اگر access_token هایمان منقضی شد، ابتدا توسط refresh_token، یک توکن جدید بگیریم و بعد Api Call هایمان را انجام بدهیم.

خیلی از افراد می پرسند مدت زمان انقضای access_token و refresh_token چقدر باید در نظر گرفت؟

هیچ بایدی و نبایدی وجود ندارد و همه حالته سرور زمان به آن اطلاق می کند. درکل چیزی که بسیار قابل اهمیت است این مورد هست که مدت زمان access_token باید کم باشه و مدت زمان refresh_token بیشتر.

پیشنهاد شخصی ما مدت زمان access_token بین ۵ دقیقه تا نهایتا ۱ ساعت باشد و مدت زمان refresh_token بین ۱ هفته تا نهایتا ۱ ماه باشد، خوب است.

هرچه زمان کمتر باشد ضریب امنیت بالاتر می رود اما تعداد ریکوئست ها  به سرور هم بیشتر می شود.
البته یک مشکلی که هنگام استفاده از RefreshToken پیش می آید این که اگر کاربر توی مدت زمان refresh_token با سایت هیچ تعاملی نداشته باشه که توکن جدید دریافت می کند، مثلا بیشتر از ۱ ماه به سایت ما سر نزند، بعدش کلا logout به اجبار شده  و باید مجددا توسط User و Pass لاگین کند (که به این صورت منطقی هم هست.)

این مقاله از دو سایت منبع زیر به شکل خلاصه برای شما نگارش شده است.

منبع ۱ منبع ۲
به این پست امتیاز دهید.
مشاهده بیشتر

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

بستن