JWT چیست؟
اگر تاکنون با REST API، اپلیکیشنهای موبایل یا توسعه Backend کار کرده باشید، احتمالاً بارها نام JWT یا JSON Web Token را شنیدهاید.
امروزه بسیاری از سرویسهای تحت وب برای مدیریت ورود کاربران و احراز هویت از JWT استفاده میکنند.
اما JWT دقیقاً چیست و چرا تا این اندازه محبوب شده است؟
JWT مخفف JSON Web Token است.
JWT یک استاندارد برای انتقال اطلاعات بهصورت امن و قابلاعتماد بین دو طرف است. این اطلاعات داخل یک Token قرار میگیرند و بهگونهای امضا میشوند که سرور بتواند صحت آنها را بررسی کند.
به زبان ساده، JWT یک شناسه قابلاعتماد است که پس از احراز هویت کاربر ایجاد میشود و در درخواستهای بعدی برای اثبات هویت او مورد استفاده قرار میگیرد.
چرا JWT به وجود آمد؟
در بسیاری از وبسایتهای سنتی، پس از ورود کاربر از Session برای نگهداری وضعیت ورود استفاده میشود.
اما با گسترش REST APIها، اپلیکیشنهای موبایل و معماری Microservices، نیاز به روشی ایجاد شد که وابستگی کمتری به ذخیره اطلاعات در سمت سرور داشته باشد.
JWT برای پاسخ به همین نیاز طراحی شد.
در این روش، بخش زیادی از اطلاعات موردنیاز داخل خود Token قرار میگیرد و سرور معمولاً نیازی به نگهداری وضعیت هر کاربر ندارد.
JWT چگونه کار میکند؟
فرآیند استفاده از JWT معمولاً به شکل زیر انجام میشود.
- کاربر اطلاعات ورود خود را ارسال میکند.
- سرور هویت کاربر را بررسی میکند.
- در صورت موفقیت، یک JWT برای کاربر ایجاد میشود.
- کاربر Token را ذخیره میکند.
- در درخواستهای بعدی، Token همراه درخواست برای سرور ارسال میشود.
- سرور اعتبار Token را بررسی میکند و در صورت معتبر بودن، درخواست را پردازش میکند.
به همین دلیل، معمولاً کاربر تا زمان اعتبار Token نیازی به ورود مجدد ندارد.
JWT از چه بخشهایی تشکیل شده است؟
هر JSON Web Token از سه بخش تشکیل میشود که با نقطه (.) از یکدیگر جدا شدهاند.
- Header
- Payload
- Signature
هر کدام از این بخشها وظیفه مشخصی دارند و در کنار هم یک Token کامل را تشکیل میدهند.
Header چیست؟
Header اطلاعات کلی درباره Token را نگهداری میکند.
برای مثال، مشخص میکند از چه الگوریتمی برای امضای دیجیتال استفاده شده است و نوع Token چیست.
این بخش معمولاً حجم بسیار کمی دارد.
Payload چیست؟
Payload مهمترین بخش JWT است.
اطلاعاتی که قرار است بین کلاینت و سرور منتقل شوند، در این قسمت قرار میگیرند.
برای مثال، شناسه کاربر، نام کاربری یا زمان انقضای Token میتوانند در Payload ذخیره شوند.
نکته مهم این است که Payload رمزگذاریشده نیست و نباید اطلاعات محرمانه مانند رمز عبور در آن قرار گیرد.
Signature چیست؟
Signature یا امضای دیجیتال، بخشی است که امنیت JWT را تضمین میکند.
سرور با استفاده از یک کلید محرمانه یا کلیدهای رمزنگاری، امضای Token را تولید میکند.
هر بار که Token دریافت میشود، امضای آن دوباره بررسی میشود.
اگر حتی یک کاراکتر از Token تغییر کرده باشد، اعتبار آن از بین میرود و سرور درخواست را رد میکند.
JWT کجا ذخیره میشود؟
پس از دریافت Token، برنامه باید آن را در جایی نگهداری کند تا در درخواستهای بعدی بتواند ارسالش کند.
محل ذخیره JWT بسته به نوع برنامه متفاوت است.
برای مثال، در یک اپلیکیشن موبایل معمولاً Token در فضای ذخیرهسازی امن برنامه نگهداری میشود.
در برنامههای تحت وب نیز بسته به معماری پروژه، ممکن است از Cookie یا روشهای دیگری برای نگهداری Token استفاده شود.
JWT در چه پروژههایی استفاده میشود؟
JWT بیشتر در پروژههایی استفاده میشود که ارتباط از طریق API انجام میشود.
از جمله:
- REST APIها
- اپلیکیشنهای موبایل
- Single Page Application (SPA)
- معماری Microservices
- سرویسهای ابری
در بخش بعدی مقاله، مزایا و معایب JWT، تفاوت JWT و Session، نحوه ارسال Bearer Token، کاربرد JWT در Django و اشتباهات رایج هنگام استفاده از JSON Web Token را بررسی خواهیم کرد.
مزایای استفاده از JWT
محبوبیت JWT تنها به دلیل سادگی آن نیست، بلکه مزایای متعددی دارد که باعث شده در بسیاری از پروژههای مدرن مورد استفاده قرار گیرد.
برخی از مهمترین مزایای JWT عبارتاند از:
- عدم نیاز به نگهداری وضعیت کاربران در سمت سرور (Stateless)
- مناسب برای REST APIها و اپلیکیشنهای موبایل
- قابل استفاده بین چند سرویس مختلف
- امکان بررسی اعتبار Token بدون مراجعه به پایگاه داده در بسیاری از سناریوها
- استاندارد بودن و پشتیبانی توسط اکثر زبانها و فریمورکها
به همین دلیل، بسیاری از پروژههای مبتنی بر API از JWT بهعنوان روش اصلی احراز هویت استفاده میکنند.
معایب JWT
با وجود مزایای زیاد، JWT همیشه بهترین انتخاب نیست.
این روش نیز محدودیتهایی دارد که باید هنگام طراحی سیستم در نظر گرفته شوند.
برخی از مهمترین معایب عبارتاند از:
- لغو اعتبار Token قبل از پایان زمان انقضا میتواند پیچیده باشد.
- در صورت سرقت Token، مهاجم تا پایان اعتبار آن ممکن است بتواند از آن استفاده کند.
- قرار دادن اطلاعات زیاد در Payload باعث افزایش حجم درخواستها میشود.
- مدیریت Refresh Tokenها نیازمند طراحی مناسب است.
به همین دلیل، انتخاب JWT باید بر اساس نیازهای پروژه انجام شود، نه صرفاً به دلیل محبوب بودن آن.
تفاوت JWT و Session
JWT و Session هر دو برای حفظ وضعیت ورود کاربران استفاده میشوند، اما نحوه عملکرد آنها متفاوت است.
در Session، اطلاعات مربوط به کاربر روی سرور ذخیره میشود و مرورگر تنها شناسه Session را ارسال میکند.
اما در JWT، اطلاعات موردنیاز داخل خود Token قرار دارد و همراه هر درخواست ارسال میشود.
به همین دلیل، JWT معمولاً برای معماریهای بدون وضعیت (Stateless) مناسبتر است، در حالی که Session در بسیاری از وبسایتهای سنتی انتخاب رایجی محسوب میشود.
Bearer Token چیست؟
هنگام استفاده از JWT، معمولاً Token از طریق هدر Authorization ارسال میشود.
رایجترین قالب ارسال به این صورت است:
Authorization: Bearer Token
عبارت Bearer به این معناست که هر شخصی که این Token معتبر را در اختیار داشته باشد، میتواند از آن برای ارسال درخواست استفاده کند.
به همین دلیل، محافظت از Token اهمیت بسیار زیادی دارد.
Access Token و Refresh Token
در بسیاری از سیستمها از دو نوع Token استفاده میشود.
Access Token برای دسترسی به منابع سیستم استفاده میشود و معمولاً مدت اعتبار کوتاهی دارد.
در مقابل، Refresh Token اعتبار بیشتری دارد و برای دریافت Access Token جدید استفاده میشود.
این روش باعث میشود در صورت سرقت Access Token، مدت سوءاستفاده محدودتر باشد.
JWT در REST API
JWT یکی از رایجترین روشهای احراز هویت در REST APIها است.
کاربر پس از ورود، Token را دریافت میکند و آن را در درخواستهای بعدی ارسال میکند.
سرور نیز قبل از پردازش درخواست، اعتبار Token را بررسی میکند.
اگر Token معتبر باشد، درخواست اجرا میشود؛ در غیر این صورت، سرور درخواست را رد میکند.
JWT در Django
Django بهصورت پیشفرض از Session برای مدیریت ورود کاربران استفاده میکند.
اما هنگام توسعه REST API، بسیاری از پروژهها از JWT استفاده میکنند.
برای این کار معمولاً از کتابخانههایی استفاده میشود که امکان ایجاد، اعتبارسنجی و مدیریت Access Token و Refresh Token را فراهم میکنند.
به همین دلیل، انتخاب بین Session و JWT در Django به نوع پروژه بستگی دارد.
آیا اطلاعات داخل JWT رمزگذاری میشوند؟
یکی از اشتباهات رایج این است که تصور شود اطلاعات داخل JWT بهصورت پیشفرض رمزگذاری میشوند.
در واقع، بخشهای Header و Payload معمولاً فقط به فرمتی قابل انتقال تبدیل میشوند و هر شخصی که Token را در اختیار داشته باشد، میتواند محتوای آنها را مشاهده کند.
امنیت JWT به امضای دیجیتال آن وابسته است؛ یعنی سرور میتواند تشخیص دهد که اطلاعات تغییر کردهاند یا خیر.
به همین دلیل، نباید اطلاعات محرمانه مانند رمز عبور یا اطلاعات بانکی را داخل Payload قرار داد.
چه زمانی از JWT استفاده کنیم؟
JWT معمولاً انتخاب مناسبی برای پروژههای زیر است:
- REST APIها
- اپلیکیشنهای موبایل
- معماری Microservices
- Single Page Application (SPA)
- سیستمهایی که چند سرویس مختلف از یک مکانیزم احراز هویت استفاده میکنند.
در مقابل، اگر در حال توسعه یک وبسایت سنتی با رندر سمت سرور هستید، استفاده از Session نیز میتواند انتخابی مناسب و ساده باشد.
در بخش پایانی مقاله، اشتباهات رایج هنگام استفاده از JWT، نکات امنیتی، بهترین روشهای پیادهسازی، جمعبندی و سؤالات متداول را بررسی خواهیم کرد.
چه زمانی JWT انتخاب مناسبی است؟
JWT برای همه پروژهها بهترین گزینه نیست.
انتخاب بین JWT و Session باید بر اساس معماری برنامه، نحوه ارتباط کلاینت و سرور و نیازهای امنیتی پروژه انجام شود.
بهطور کلی، JWT در پروژههایی که ارتباط از طریق API انجام میشود یا چندین کلاینت مختلف مانند وب، موبایل و دسکتاپ از یک Backend استفاده میکنند، انتخاب مناسبی است.
در مقابل، برای بسیاری از وبسایتهای سنتی که صفحات در سمت سرور تولید میشوند، استفاده از Session معمولاً سادهتر و مناسبتر است.
اشتباهات رایج هنگام استفاده از JWT
استفاده نادرست از JWT میتواند امنیت سیستم را کاهش دهد.
برخی از اشتباهات رایج عبارتاند از:
- قرار دادن اطلاعات محرمانه مانند رمز عبور یا اطلاعات بانکی در Payload
- استفاده از Tokenهایی با زمان انقضای بسیار طولانی
- ذخیره Token در مکانهایی که احتمال سرقت آن وجود دارد
- عدم استفاده از HTTPS برای انتقال Token
- مدیریت نادرست Access Token و Refresh Token
- فرض کردن اینکه JWT اطلاعات را رمزگذاری میکند
رعایت این نکات نقش مهمی در حفظ امنیت سیستمهای مبتنی بر JWT دارد.
اگر JWT سرقت شود چه اتفاقی میافتد؟
اگر یک Token معتبر به دست فرد دیگری برسد، تا زمانی که اعتبار آن تمام نشده باشد، ممکن است بتوان از آن برای ارسال درخواست استفاده کرد.
به همین دلیل، محافظت از Token اهمیت بسیار زیادی دارد.
استفاده از HTTPS، تعیین زمان انقضای مناسب، استفاده از Refresh Token و نگهداری صحیح Token از مهمترین راهکارهای کاهش این خطر هستند.
JWT در پروژههای واقعی
امروزه بسیاری از اپلیکیشنهای موبایل و سرویسهایی که بر پایه REST API توسعه داده شدهاند، از JWT برای احراز هویت کاربران استفاده میکنند.
برای مثال، یک اپلیکیشن فروشگاهی ممکن است پس از ورود کاربر، یک JWT دریافت کند و در تمام درخواستهای بعدی همان Token را برای دسترسی به اطلاعات سفارشها، پروفایل یا سبد خرید ارسال کند.
همین الگو در بسیاری از سامانههای آموزشی، سرویسهای ابری و برنامههای تکصفحهای نیز استفاده میشود.
JWT در Django
اگرچه Django بهصورت پیشفرض از Session برای مدیریت ورود کاربران استفاده میکند، اما هنگام توسعه REST API بسیاری از توسعهدهندگان از JWT بهره میبرند.
در چنین پروژههایی، پس از احراز هویت موفق، سرور یک Access Token و در بسیاری از موارد یک Refresh Token ایجاد میکند.
کلاینت نیز این Tokenها را در درخواستهای بعدی ارسال میکند تا سرور هویت کاربر را بررسی کند.
این رویکرد بهویژه در پروژههایی که اپلیکیشن موبایل، وب و سایر سرویسها همزمان از یک API استفاده میکنند، بسیار رایج است.
چرا یادگیری JWT برای برنامهنویسان ضروری است؟
امروزه بخش بزرگی از پروژههای Backend بر پایه REST API توسعه داده میشوند.
درک صحیح JWT به توسعهدهندگان کمک میکند سیستمهای احراز هویت مدرن را طراحی کنند و ارتباط امنی بین کلاینت و سرور برقرار سازند.
علاوه بر این، بسیاری از فناوریهای مرتبط با امنیت API، معماری Microservices و سرویسهای ابری بر پایه مفاهیم JWT یا فناوریهای مشابه طراحی شدهاند.
جمعبندی
JWT یا JSON Web Token استانداردی برای انتقال اطلاعات و مدیریت احراز هویت در بسیاری از برنامههای مدرن است.
پس از ورود موفق کاربر، سرور یک Token ایجاد میکند و کاربر آن را در درخواستهای بعدی ارسال میکند تا هویت او دوباره بررسی شود.
JWT از سه بخش Header، Payload و Signature تشکیل شده است و امنیت آن به امضای دیجیتال وابسته است، نه به رمزگذاری اطلاعات.
انتخاب بین JWT و Session به نوع پروژه بستگی دارد. هر دو روش کاربردهای خاص خود را دارند و انتخاب مناسب، به معماری و نیازهای نرمافزار وابسته است.
سؤالات متداول
JWT چیست؟
JWT یا JSON Web Token استانداردی برای انتقال اطلاعات و احراز هویت کاربران است که بیشتر در REST APIها و اپلیکیشنهای مدرن استفاده میشود.
JWT از چه بخشهایی تشکیل شده است؟
هر JWT از سه بخش Header، Payload و Signature تشکیل میشود که با یک نقطه از یکدیگر جدا شدهاند.
تفاوت JWT و Session چیست؟
در Session اطلاعات ورود روی سرور ذخیره میشود، اما در JWT اطلاعات لازم داخل Token قرار میگیرد و همراه هر درخواست ارسال میشود.
آیا JWT اطلاعات را رمزگذاری میکند؟
خیر. JWT بهصورت پیشفرض اطلاعات را رمزگذاری نمیکند. امنیت آن از طریق امضای دیجیتال تأمین میشود و به همین دلیل نباید اطلاعات محرمانه در Payload قرار گیرند.
مطالعه بیشتر
قدم بعدی چیست؟
اکنون که با JWT آشنا شدید، در مقاله بعدی بررسی میکنیم OAuth چیست، این استاندارد چگونه امکان ورود امن با حسابهایی مانند Google یا GitHub را فراهم میکند، چه تفاوتی با JWT دارد و در چه سناریوهایی استفاده میشود.
نظرات
بسیار عالی و روون
ممنونم از بازخوردتون
ثبت نظر
در حال پاسخ به