ابزار رایگان · بدون ثبت‌نام

فقط در مرورگر شما؛ چیزی ارسال نمی‌شود

دیکد JWT آنلاین؛ نمایش header و payload

توکن JWT را بچسبانید تا header و payload خوانا شوند و زمان‌های exp‏، iat و nbf به‌وقت تهران و UTC نمایش داده شوند. این ابزار فقط دیکد می‌کند؛ امضای توکن بررسی نمی‌شود و توکن نه ارسال می‌شود، نه در آدرس صفحه یا حافظهٔ مرورگر می‌ماند.

پیشوند Bearer و شکست خط خودکار حذف می‌شوند. کلید Esc کادر را پاک می‌کند. توکن واقعی محیط عملیاتی را این‌جا نچسبانید؛ از توکن تست یا منقضی‌شده استفاده کنید.

راهنمای کامل

راهنمای کامل JWT: ساختار توکن، دیکد امن و اشتباه‌های رایج

JSON Web Token یا JWT رایج‌ترین قالب توکن در APIها، ورود یکپارچه و اپلیکیشن‌های موبایل است. هر توسعه‌دهنده‌ای دیر یا زود با خطای «توکن نامعتبر» یا «توکن منقضی» روبه‌رو می‌شود و اولین قدم عیب‌یابی، دیدن محتوای همان توکن است. در این راهنما ساختار JWT، روش استفاده از دیکدر ایران‌کلاد، تفاوت دیکد و اعتبارسنجی، الگوریتم‌های امضا و خطاهای امنیتی رایج را توضیح می‌دهیم. اگر API خود را روی سرور ابری داخل ایران اجرا می‌کنید، این راهنما برای اشکال‌زدایی توکن‌های آن هم کاربرد دارد؛ برای مقایسهٔ امضاها از ابزار هش و برای انتقال امن توکن‌ها از HTTPS روی پروکسی لبه کمک بگیرید.

۱۰ بخش حدود ۸ دقیقه مطالعه

فهرست مطالب

JWT چیست و از چه بخش‌هایی تشکیل شده است؟

JWT که در استاندارد RFC 7519 تعریف شده، رشته‌ای است از سه بخش که با نقطه از هم جدا می‌شوند: header‏، payload و signature. هر کدام از دو بخش اول یک شیء JSON است که با Base64URL کدگذاری شده؛ یعنی نسخه‌ای از Base64 که به‌جای + و / از - و _ استفاده می‌کند و علامت = انتهایی را حذف می‌کند تا توکن بدون مشکل در آدرس و هدر HTTP جا شود.

header معمولاً دو فیلد دارد: alg که الگوریتم امضا را مشخص می‌کند و typ که مقدارش JWT است؛ گاهی kid هم برای مشخص کردن کلید امضا آمده است. payload شامل ادعاها یا claim‌ها است؛ اطلاعاتی مثل شناسهٔ کاربر، نقش، زمان صدور و زمان انقضا. بخش سوم امضای دیجیتال دو بخش قبلی است که با کلید صادرکننده ساخته می‌شود.

نکتهٔ کلیدی که خیلی‌ها فراموش می‌کنند: JWT معمولی رمزنگاری نمی‌شود، فقط امضا می‌شود. هر کسی توکن را داشته باشد، بدون هیچ کلیدی می‌تواند محتوای payload را بخواند؛ همان کاری که این ابزار انجام می‌دهد. امضا فقط تضمین می‌کند محتوا دست‌کاری نشده است.

روش استفاده از دیکدر JWT ایران‌کلاد

توکن را در کادر بالا جای‌گذاری کنید؛ نیازی به زدن دکمه نیست و با هر تغییر، نتیجه دوباره محاسبه می‌شود. اگر توکن را از هدر Authorization کپی کرده‌اید، لازم نیست کلمهٔ Bearer را حذف کنید؛ ابزار این پیشوند، کوتیشن‌های دور توکن و شکست خط‌ها را خودش کنار می‌گذارد. ابزار header و payload را به‌صورت JSON مرتب نمایش می‌دهد و بخش امضا را بدون تغییر نشان می‌دهد. متن فارسی یا هر نویسهٔ غیرلاتین داخل payload هم با UTF-8 درست نمایش داده می‌شود؛ اگر نام کاربر یا نقش‌ها به‌صورت حروف درهم دیده شوند، مشکل از کدگذاری سمت صادرکنندهٔ توکن است.

در جدول «ادعاهای استاندارد»، هفت ادعای iss‏، sub‏، aud‏، exp‏، nbf‏، iat و jti در صورت وجود نمایش داده می‌شوند. سه ادعای زمانی exp‏، nbf و iat که در توکن به‌صورت عدد ثانیه از سال ۱۹۷۰ ذخیره شده‌اند، به تاریخ و ساعت خوانا به‌وقت تهران با تقویم شمسی، به وقت جهانی UTC و اگر دستگاه شما منطقهٔ زمانی دیگری دارد، به وقت دستگاه تبدیل می‌شوند. یک برچسب سبز، قرمز یا زرد می‌گوید توکن از نظر زمان معتبر است، چه مدت پیش منقضی شده یا هنوز به زمان nbf نرسیده است؛ کنار آن برچسب «امضا بررسی نشد» همیشه دیده می‌شود تا نتیجه با تأیید اعتبار اشتباه گرفته نشود. اگر زمانی به‌جای ثانیه با میلی‌ثانیه ثبت شده باشد، ابزار آن را تشخیص می‌دهد و هشدار می‌دهد.

اگر توکن سه بخش نداشته باشد یا header و payload‏، JSON معتبر نباشند، پیام خطای مشخص نمایش داده می‌شود. برای تبدیل دستی عدد زمان به تاریخ از ابزار Timestamp و برای دیدن JSON طولانی‌تر از فرمت‌کنندهٔ JSON استفاده کنید.

بازگشت به فهرست مطالب

ادعاهای استاندارد JWT و معنای هر کدام

ادعاهای ثبت‌شده در استاندارد اختیاری‌اند، اما کتابخانه‌های معتبر بیشترشان را هنگام اعتبارسنجی بررسی می‌کنند. دانستن معنای هر کدام کمک می‌کند خطای سرور را سریع‌تر بفهمید:

ادعانام کاملمعنیخطای رایج
issIssuerصادرکنندهٔ توکنآدرس صادرکننده با اسلش انتهایی و بدون آن متفاوت حساب می‌شود
subSubjectشناسهٔ کاربر یا موضوع توکناستفاده از ایمیل قابل تغییر به‌جای شناسهٔ ثابت
audAudienceسرویسی که توکن برای آن صادر شدهپذیرفتن توکن سرویس دیگر چون aud بررسی نمی‌شود
expExpirationزمان انقضااختلاف ساعت سرورها که توکن تازه را منقضی نشان می‌دهد
nbfNot Beforeزودتر از این زمان معتبر نیستساعت عقب سرور مقصد
iatIssued Atزمان صدورارسال به میلی‌ثانیه به‌جای ثانیه
jtiJWT IDشناسهٔ یکتای توکن برای ابطالنداشتن فهرست ابطال در خروج کاربر

بازگشت به فهرست مطالب

دیکد کردن با اعتبارسنجی فرق دارد

این ابزار امضای توکن را بررسی نمی‌کند و این تصمیم عمدی است. اعتبارسنجی امضا به کلید نیاز دارد: برای الگوریتم‌های HS256 همان کلید مخفی که سرور با آن امضا می‌کند و برای RS256 یا ES256 کلید عمومی صادرکننده. کلید مخفی HMAC را هرگز نباید در هیچ ابزار آنلاینی وارد کرد، چون هر کسی آن را داشته باشد می‌تواند توکن جعلی معتبر بسازد.

پس نتیجهٔ این ابزار را این‌طور بخوانید: «محتوای این توکن چنین ادعا می‌کند»، نه «این توکن معتبر است». یک توکن جعلی هم به همین زیبایی دیکد می‌شود. اعتبارسنجی واقعی را همیشه در کد سرور با یک کتابخانهٔ معتبر انجام دهید و الگوریتم مجاز را صریحاً مشخص کنید.

ترتیب درست بررسی در سرور این است: ابتدا امضا با کلید و الگوریتم از پیش تعیین‌شده بررسی می‌شود، سپس exp و nbf با در نظر گرفتن چند ثانیه تلورانس برای اختلاف ساعت، و در پایان iss و aud با مقادیر مورد انتظار مقایسه می‌شوند. فقط بعد از گذشتن از همهٔ این مراحل می‌توان به sub و نقش‌های کاربر اعتماد کرد. این ابزار برای دیدن اینکه کدام مرحله شکست خورده مفید است، اما جای هیچ‌کدام از آن‌ها را نمی‌گیرد.

بازگشت به فهرست مطالب

الگوریتم‌های امضا و هشدارهای ابزار

ابزار دو هشدار دارد. اگر alg برابر none باشد، هشدار جدی نمایش داده می‌شود؛ چنین توکنی امضا ندارد و هر کسی می‌تواند مشابهش را بسازد. در گذشته برخی کتابخانه‌ها چنین توکنی را می‌پذیرفتند و همین یکی از معروف‌ترین آسیب‌پذیری‌های JWT بود. اگر alg یکی از HS256‏، HS384 یا HS512 باشد، هشدار ملایم‌تری می‌بینید که یادآوری می‌کند امضا با کلید مشترک است.

در HMAC هر سرویسی که بخواهد توکن را بررسی کند باید همان کلید مخفی را داشته باشد؛ پس هر سرویس عملاً می‌تواند توکن هم صادر کند و نشت کلید از هر نقطه کل سیستم را به خطر می‌اندازد. در معماری‌های چندسرویسی، الگوریتم‌های نامتقارن مثل RS256‏، ES256 یا EdDSA بهترند: فقط سرویس ورود کلید خصوصی دارد و بقیه با کلید عمومی بررسی می‌کنند.

  • none: بدون امضا؛ در محیط واقعی هرگز
  • HS256/384/512: مناسب وقتی صادرکننده و بررسی‌کننده یک سرویس‌اند
  • RS256: امضای RSA؛ پشتیبانی گسترده در کتابخانه‌ها
  • ES256 و EdDSA: کلید کوتاه‌تر و امضای سریع‌تر با منحنی بیضوی

بازگشت به فهرست مطالب

JWT یا نشست سمت سرور؟ کدام برای پروژهٔ شما مناسب‌تر است

JWT محبوب است چون سرور برای بررسی آن به پایگاه داده نیاز ندارد؛ امضا را بررسی می‌کند و ادعاها را می‌خواند. این ویژگی برای API‌هایی که روی چند سرور اجرا می‌شوند یا سرویس‌هایی که توکن صادرشده توسط سرویس دیگری را می‌پذیرند بسیار مفید است. اپلیکیشن موبایل و ورود یکپارچه بین چند محصول هم از همین مزیت بهره می‌برند.

اما همین بی‌نیازی از پایگاه داده یک ضعف هم دارد: توکن صادرشده را نمی‌توان به‌سادگی باطل کرد. اگر کاربر خارج شود یا رمزش را عوض کند، توکن قبلی تا زمان انقضا معتبر می‌ماند، مگر اینکه فهرست ابطال نگه دارید که در عمل یعنی برگشتن به جست‌وجو در پایگاه داده. برای یک وب‌سایت معمولی با یک سرور، نشست سمت سرور با کوکی امن و HttpOnly اغلب ساده‌تر و امن‌تر است.

راه میانه‌ای که بیشتر تیم‌ها انتخاب می‌کنند: توکن دسترسی کوتاه‌عمر، مثلاً پانزده دقیقه، همراه با توکن تازه‌سازی بلندعمر که در سرور ذخیره و قابل ابطال است. در این حالت exp کوتاه در همین ابزار به‌خوبی دیده می‌شود و خطر نشت توکن دسترسی محدود می‌ماند.

بازگشت به فهرست مطالب

آیا توکن من از مرورگر خارج می‌شود؟

خیر. صفحهٔ ابزار یک بار از سرور ایران‌کلاد بارگذاری می‌شود و پس از آن تمام کار دیکد با جاوااسکریپت داخل مرورگر شما انجام می‌شود. کد این ابزار هیچ درخواست شبکه‌ای نمی‌فرستد، توکن را در کوکی یا حافظهٔ مرورگر ذخیره نمی‌کند و سمت سرور هم کنترلری که توکن را دریافت کند وجود ندارد؛ سرور فقط صفحهٔ خالی را تحویل می‌دهد. سیاست امنیتی محتوای سایت هم ارسال داده از اسکریپت‌ها به دامنه‌های دیگر را مسدود می‌کند.

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

بازگشت به فهرست مطالب

دیکد JWT در خط فرمان لینوکس

اگر نمی‌خواهید توکن را در مرورگر جای‌گذاری کنید، با چند ابزار استاندارد لینوکس می‌توانید همین کار را انجام دهید. فقط توجه کنید Base64URL با Base64 معمولی کمی فرق دارد؛ باید - و _ را به + و / برگردانید و در صورت نیاز علامت = اضافه کنید. با jq خروجی خواناتر می‌شود.

کاردستور
گذاشتن توکن در متغیر بدون ثبت در تاریخچهread -rs TOKEN
جدا کردن payloadecho "$TOKEN" | cut -d. -f2
دیکد payload با jqecho "$TOKEN" | jq -R 'split(".") | .[1] | @base64d | fromjson'
تبدیل exp به تاریخdate -d @1767225600
دیدن ساعت دقیق سرورtimedatectl
ساخت کلید مخفی قوی برای HS256openssl rand -base64 48

اختلاف ساعت سرورها رایج‌ترین دلیل خطای «توکن هنوز معتبر نیست» یا «منقضی شده» است. روی سرورهای لینوکسی همگام‌سازی زمان را با timedatectl بررسی کنید.

بازگشت به فهرست مطالب

اشتباه‌های امنیتی رایج در پیاده‌سازی JWT

بیشتر مشکلات JWT از خود استاندارد نیست، از نحوهٔ استفاده است. کتابخانه‌های امروزی پیش‌فرض‌های امن‌تری دارند، اما کد قدیمی، نمونه‌کدهای کپی‌شده از اینترنت و پیاده‌سازی دستی هنوز همان خطاهای قدیمی را تکرار می‌کنند. فهرست زیر خطاهایی است که در بازبینی کد بیشتر از همه دیده می‌شوند:

  • قرار دادن اطلاعات حساس مثل رمز، کد ملی یا شماره کارت در payload که برای همه قابل خواندن است
  • نپذیرفتن الگوریتم مشخص و اعتماد به مقدار alg که خود توکن اعلام می‌کند
  • کلید مخفی کوتاه یا قابل حدس برای HS256 که با حملهٔ آفلاین شکسته می‌شود
  • توکن دسترسی با عمر چندروزه به‌جای توکن کوتاه‌عمر و توکن تازه‌سازی
  • ذخیرهٔ توکن در localStorage در اپلیکیشنی که در برابر XSS محافظت نشده است
  • بررسی نکردن aud و iss و پذیرفتن توکنی که برای سرویس دیگری صادر شده

بازگشت به فهرست مطالب

محدودیت‌های ابزار و ارتباط با سرویس‌های ایران‌کلاد

ابزار فقط JWT امضاشده با ساختار سه‌بخشی را پشتیبانی می‌کند. توکن رمزنگاری‌شدهٔ JWE که پنج بخش دارد با پیام مشخص شناخته می‌شود ولی دیکد نمی‌شود؛ توکن‌های غیر JSON و توکن‌های فشرده‌شده هم دیکد نمی‌شوند. ادعاهای سفارشی در payload نمایش داده می‌شوند اما در جدول ادعاهای استاندارد نمی‌آیند و ابزار مقدار آن‌ها را تفسیر نمی‌کند.

برای اطلاع شما: API ایران‌کلاد از JWT استفاده نمی‌کند و احراز هویت آن با کلید API در هدر Authorization و پیشوند Bearer انجام می‌شود؛ پس کلید API ایران‌کلاد را در این ابزار وارد نکنید. اگر سرویس احراز هویت خودتان را می‌سازید، می‌توانید آن را روی سرور ابری اجرا کنید و برای ذخیرهٔ فهرست ابطال توکن‌ها از Redis مدیریت‌شده کمک بگیرید.

بازگشت به فهرست مطالب بازگشت به ابتدای راهنما

پرسش و پاسخ،  ۱۰ پرسش

سؤالات متداول

پاسخ پرسش خود را پیدا نکردید؟ با پشتیبانی در تماس باشید.

آیا توکنی که وارد می‌کنم به سرور ایران‌کلاد ارسال می‌شود؟
خیر. دیکد کاملاً با جاوااسکریپت داخل مرورگر شما انجام می‌شود. کد این ابزار هیچ درخواست شبکه‌ای نمی‌فرستد، توکن را ذخیره نمی‌کند و سمت سرور هم کنترلری برای دریافت توکن وجود ندارد. می‌توانید در زبانهٔ Network ابزار توسعه‌دهندهٔ مرورگر این را بررسی کنید.
چرا ابزار امضای توکن را بررسی نمی‌کند؟
چون اعتبارسنجی به کلید نیاز دارد و وارد کردن کلید مخفی HMAC در هر ابزار آنلاین خطرناک است. هر کسی کلید را داشته باشد می‌تواند توکن جعلی بسازد. اعتبارسنجی را در کد سرور خودتان با کتابخانهٔ معتبر انجام دهید.
آیا محتوای JWT رمزنگاری شده است؟
در JWT معمولی خیر. header و payload فقط با Base64URL کدگذاری شده‌اند و هر کسی بدون کلید می‌تواند آن‌ها را بخواند. امضا فقط از دست‌کاری محتوا جلوگیری می‌کند. برای همین اطلاعات حساس را در payload قرار ندهید.
زمان‌ها به چه منطقهٔ زمانی نمایش داده می‌شوند؟
exp‏، nbf و iat به‌وقت تهران و با تقویم فارسی، و در کنارش به وقت جهانی UTC نمایش داده می‌شوند؛ اگر منطقهٔ زمانی دستگاه شما تهران نباشد، زمان دستگاه هم می‌آید. خود توکن زمان را به‌صورت عدد ثانیه از ابتدای سال ۱۹۷۰ به وقت جهانی ذخیره می‌کند و منطقهٔ زمانی ندارد.
هشدار alg=none یعنی چه؟
یعنی توکن امضا ندارد و هر کسی می‌تواند توکن مشابه با هر محتوایی بسازد. سرور شما هرگز نباید چنین توکنی را بپذیرد. در کد اعتبارسنجی، فهرست الگوریتم‌های مجاز را صریحاً مشخص کنید.
HS256 بهتر است یا RS256؟
اگر صادرکننده و بررسی‌کننده یک سرویس‌اند، HS256 با کلید طولانی و تصادفی کافی است. اگر چند سرویس توکن را بررسی می‌کنند، RS256 یا ES256 بهتر است چون فقط سرویس ورود کلید خصوصی دارد و بقیه با کلید عمومی کار می‌کنند.
توکن تازه است ولی سرور می‌گوید منقضی شده؛ چرا؟
رایج‌ترین دلیل اختلاف ساعت سرورهاست. ساعت سرور صادرکننده و بررسی‌کننده را با timedatectl بررسی کنید. دلیل دیگر ارسال iat یا exp به میلی‌ثانیه به‌جای ثانیه است؛ این ابزار چنین عددی را تشخیص می‌دهد و کنار همان ادعا هشدار می‌دهد.
آیا می‌توانم توکن واقعی محیط عملیاتی را اینجا بررسی کنم؟
توصیه نمی‌کنیم. هرچند توکن از مرورگر خارج نمی‌شود، توکن معتبر کلید ورود است و نباید در جاهای مختلف کپی شود. از توکن محیط تست یا توکن منقضی‌شده استفاده کنید، یا با دستورهای خط فرمان روی سیستم خودتان دیکد کنید.
آیا توکن‌های JWE هم پشتیبانی می‌شوند؟
خیر. ابزار فقط توکن سه‌بخشی امضاشده را دیکد می‌کند. JWE پنج بخش دارد و محتوای آن رمزنگاری شده است؛ بدون کلید خصوصی گیرنده قابل خواندن نیست.
API ایران‌کلاد از JWT استفاده می‌کند؟
خیر. API ایران‌کلاد با کلید API در هدر Authorization و پیشوند Bearer احراز هویت می‌کند. کلید API ایران‌کلاد ساختار JWT ندارد و نباید آن را در این ابزار یا هیچ ابزار آنلاین دیگری وارد کنید.

پاسخ پرسش خود را پیدا نکردید؟ با پشتیبانی در تماس باشید.

سرور ابری

سرور ابری ایران‌کلاد در کمتر از ۶۰ ثانیه آماده می‌شود؛ با دیسک NVMe SSD، پورت اختصاصی ۱۰ گیگابیت و صورت‌حساب ساعتی تومانی، از ۱٬۱۰۰ تومان در ساعت.