RevealTheme logo

کدگشای JWT

توکن‌های JSON Web Token (JWT) را فوراً کدگشایی کنید. در مرورگر شما اجرا می‌شود: توکن‌ها هرگز از دستگاه شما خارج نمی‌شوند، بنابراین استفاده از آن با اسرار محیط تولید (production) امن است.

نحوه استفاده از این ابزار

  1. 1

    JWT خود را در فیلد ورودی بچسبانید.

  2. 2

    روی «رمزگشایی» کلیک کنید. هدر (header) و محتوا (payload) تجزیه و نمایش داده می‌شوند.

  3. 3

    الگوریتم، ادعاها (claims)، زمان انقضا و صادرکننده را بررسی کنید.

JWT چیست و چگونه کار می‌کند؟

یک JSON Web Token (JWT، تعریف‌شده در RFC 7519) شکلی فشرده و امن برای URL برای نمایش مجموعه‌ای از ادعاها (claims) درباره یک کاربر است، همراه با اثبات رمزنگاری‌شده‌ای که نشان می‌دهد آن ادعاها دستکاری نشده‌اند. JWTها احراز هویت را در بیشتر پشته‌های وب مدرن پیش می‌برند: وقتی وارد می‌شوید، سرور یک JWT حاوی شناسه کاربری و مجوزهای شما ایجاد می‌کند، آن را با یک کلید مخفی امضا می‌کند و به شما بازمی‌گرداند. مرورگر شما توکن را ذخیره می‌کند (معمولاً در localStorage یا یک کوکی) و آن را در سرآیند Authorization هر درخواست بعدی می‌گنجاند. سرور امضا را در هر درخواست تأیید می‌کند: اگر معتبر باشد، به ادعاهای توکن اعتماد می‌شود؛ اگر دستکاری شده باشد، امضا می‌شکند و درخواست رد می‌شود. JWTها سه بخش دارند که با Base64URL کدگذاری شده و با نقطه از هم جدا می‌شوند: سرآیند الگوریتم امضا را اعلام می‌کند (HS256 برای HMAC-SHA256، RS256 برای RSA، ES256 برای ECDSA، none برای توکن‌های امضانشده، که خطرناک است و باید آن‌ها را رد کنید)؛ بار داده (payload) شامل خود ادعاها است (ادعاهای استاندارد مانند 'sub' برای موضوع (subject)، 'exp' برای انقضا، 'iat' برای زمان صدور، به‌علاوه هر ادعای سفارشی‌ای که برنامه شما تعریف می‌کند)؛ امضا اثباتی است بر اینکه سرآیند و بار داده توسط کسی که مالک کلید مخفی بوده امضا شده‌اند. این کدگشا دو بخش اول را آشکار می‌کند که اطلاعات عمومی هستند؛ امضا تنها با کلید قابل تأیید است، و به همین دلیل است که هر کدگشای JWT ادعاها را بدون تأیید نمایش می‌دهد.

موارد استفاده رایج

  • با رمزگشایی JWT‌ای که کلاینت شما ارسال می‌کند، مشکلات احراز هویت را برطرف کنید؛ دقیقاً ببینید کدام ادعاها وجود دارند، چه کسی آن را صادر کرده و چه زمانی منقضی می‌شود.

  • JWT‌های دروازه‌ی API (AWS Cognito، Auth0، Okta) را بررسی کنید تا ساختار ادعاها را برای سرویس‌های پایین‌دستی درک کنید.

  • بررسی کنید که ادعاهای سفارشی (شناسه‌ی سازمان، نقش، پرچم‌های ویژگی) در کد صدور توکن به‌درستی تنظیم شده باشند.

  • توکن‌ها را پیش و پس از تازه‌سازی مقایسه کنید تا تمدید زمان انقضا تأیید شود.

  • الگوریتم توکن را ممیزی کنید؛ مطمئن شوید در محیط تولید RS256 یا ES256 استفاده می‌شود و هرگز 'none' نیست.

  • محتوای base64url موجود در گزارش‌های سرور را به ادعاهای خوانا برای انسان تبدیل کنید.

پرسش‌های متداول

آیا استفاده از آن با JWTهای محیط تولید امن است؟
بله. کدگشایی به‌طور کامل در مرورگر شما از طریق JavaScript محلی انجام می‌شود: توکن هرگز به سرورهای ما نمی‌رسد و در هیچ گزارشی ظاهر نمی‌شود. می‌توانید این را با باز کردن DevTools ← زبانه Network هنگام کدگشایی بررسی کنید: هیچ درخواست خروجی‌ای ارسال نمی‌شود. با این حال، با JWTها مانند اعتبارنامه‌ها رفتار کنید: آن‌ها را در URLها، تصاویر صفحه یا اسناد مشترک جای‌گذاری نکنید، فارغ از اینکه کدگشا کجا اجرا می‌شود.
آیا این امضا را تأیید می‌کند؟
خیر. تأیید امضا به کلید مخفی (برای HS256) یا کلید عمومی (برای RS256/ES256/PS256) نیاز دارد. ابزارهای وبی که برای تأیید یک JWT از شما کلید مخفی می‌خواهند یک هشدار امنیتی هستند: شما کلید امضای خود را برای یک غریبه می‌فرستید. امضاها را روی سرور یا با کتابخانه‌ای که خودتان کنترل می‌کنید (jose، jsonwebtoken) تأیید کنید.
اگر JWT من منقضی شده باشد چه می‌شود؟
انقضا مانع کدگشایی نمی‌شود: ادعای 'exp' فقط یک داده درون بار داده است. در بار داده کدگشایی‌شده دنبال 'exp' بگردید: این یک برچسب زمانی Unix است (ثانیه‌ها از سال ۱۹۷۰). آن را با مبدل برچسب زمانی ما تبدیل کنید تا انقضا را در منطقه زمانی خود ببینید. اگر 'exp' گذشته باشد، توکن توسط هر تأییدکننده سازگاری رد می‌شود، هرچند کدگشا همچنان آن را می‌خواند.
آیا JWTها را می‌توان رمزنگاری کرد؟
بله: به آن JWE (JSON Web Encryption، RFC 7516) گفته می‌شود. این ابزار JWS (JSON Web Signature، حالت رایج) را مدیریت می‌کند، جایی که بار داده امضا شده اما قابل مشاهده است. توکن‌های JWE به‌جای ۳ بخش، ۵ بخش جداشده با نقطه دارند و برای کدگشایی به کلید خصوصی گیرنده نیاز دارند. اگر توکن شما ۵ بخش دارد، به ابزاری سازگار با JWE نیاز دارید.
'alg': 'none' به چه معناست و آیا خطرناک است؟
'none' یعنی هیچ امضایی وجود ندارد: توکن امضانشده است و هر کسی می‌تواند هر ادعایی را جعل کند. سیستم‌های محیط تولید باید به‌صراحت توکن‌های دارای 'alg: none' را رد کنند. برخی کتابخانه‌ها آن‌ها را به‌طور پیش‌فرض می‌پذیرند (یک دسته CVE بسیار شناخته‌شده). همیشه فقط الگوریتم‌هایی را که برنامه شما انتظار دارد مجاز بدانید.
چرا به‌جای کوکی‌های نشست از JWT استفاده کنیم؟
JWTها بدون حالت (stateless) هستند: سرور نیازی به جستجوی یک نشست ندارد؛ خود توکن هویت و مجوزهای کاربر را در بر دارد. این JWTها را برای سیستم‌های توزیع‌شده و APIها ایده‌آل می‌کند. کوکی‌های نشست دارای حالت (stateful) هستند (به ذخیره‌سازی نشست در سرور نیاز دارند) اما باطل کردن آن‌ها آسان‌تر است (کافی است نشست را حذف کنید). معامله این است: JWTها بهتر مقیاس می‌پذیرند، اما تا زمانی که توکن منقضی نشود نمی‌توانید «کاربری را از سیستم خارج کنید».
ادعاهای استاندارد یک JWT کدام‌اند؟
RFC 7519 این موارد را تعریف می‌کند: iss (صادرکننده)، sub (موضوع، معمولاً شناسه کاربر)، aud (مخاطب)، exp (زمان انقضا)، nbf (نه پیش از)، iat (صادرشده در)، jti (شناسه JWT). فراتر از این‌ها، برنامه‌ها ادعاهای سفارشی مانند 'roles'، 'permissions' یا 'tenant_id' اضافه می‌کنند. ادعاهای سفارشی را کوچک نگه دارید: JWTها در سرآیند هر درخواست جابه‌جا می‌شوند و مصرف پهنای باند شما را افزایش می‌دهند.

ابزارهای مرتبط