ToolDeck

JWT Decoder

Decode and inspect JSON Web Tokens

یک مثال امتحان کنید

JWT Token

به‌صورت محلی اجرا می‌شود · جای‌گذاری اسرار امن است
همچنین امتحان کنید:JWT Encoder

JWT (JSON Web Token) چیست؟

JSON Web Token (JWT) یک قالب توکن فشرده و URL-safe است که در RFC 7519 تعریف شده است. این قالب مجموعه‌ای از کلیم‌ها را به صورت یک شیء JSON کدگذاری می‌کند، سپس آن را امضا — و در صورت نیاز رمزنگاری — می‌کند تا گیرنده بتواند تأیید کند که داده‌ها دستکاری نشده‌اند. JWT استاندارد de facto برای احراز هویت بدون حالت در REST API ها، سیستم‌های ورود یکپارچه و مجوزدهی در میکروسرویس‌هاست.

RFC 7519 — JSON Web Token (JWT) →

ساختار JWT: Header · Payload · Signature

هر JWT از سه بخش base64url-encoded جدا شده با نقطه تشکیل شده است. هدر و پیلود JSON ساده هستند — قابل خواندن توسط هر کسی — در حالی که امضا یک مقدار رمزنگاری‌شده است که تنها با کلید صحیح قابل تأیید است.

توکن رمزگذاری‌شده

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyMTIzIiwibmFtZSI6IkFsaWNlIiwicm9sZSI6ImFkbWluIiwiaWF0IjoxNzE3MjAwMDAwLCJleHAiOjE3MTcyMDM2MDB9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

HeaderPayloadSignature
Header
json
{
  "alg": "HS256",
  "typ": "JWT"
}
Payload
json
{
  "sub":  "user123",
  "name": "Alice",
  "role": "admin",
  "iat":  1717200000,
  "exp":  1717203600
}

چرا از رمزگشای JWT استفاده کنیم؟

JWT های خام شبیه متن تصادفی به نظر می‌رسند. این ابزار فوری هدر و پیلود را به صورت JSON فرمت‌شده نمایش می‌دهد تا بتوانید کلیم‌ها را بررسی کنید، زمان انقضا را چک کنید و انتخاب‌های الگوریتمی را بدون نوشتن حتی یک خط کد بررسی کنید.

🔍
بررسی فوری کلیم‌ها
تمام کلیم‌های پیلود را ببینید — sub، iss، aud، exp، نقش‌های سفارشی، مجوزها — فرمت‌شده و قابل خواندن با یک کلیک.
🔓
بدون نیاز به کلید مخفی
هدر و پیلود عمومی هستند؛ تنها امضا به کلید مخفی نیاز دارد. این ابزار هر دو را بدون کلید امضای شما رمزگشایی می‌کند.
⏱️
تجزیه انقضا و تایم‌استمپ‌ها
تایم‌استمپ‌های Unix (exp، iat، nbf) به طور خودکار به تاریخ قابل خواندن تبدیل می‌شوند تا فوری ببینید آیا توکن منقضی شده است.
🔒
اجرا کاملاً در مرورگر شما
همه چیز در مرورگر شما پردازش می‌شود — هیچ داده‌ای به سرور ارسال نمی‌شود. در هنگام دیباگ می‌توانید با خیال راحت از توکن‌های production استفاده کنید.

مرجع کلیم‌های استاندارد JWT

RFC 7519 هفت نام کلیم ثبت‌شده تعریف می‌کند. این‌ها الزامی نیستند، اما استفاده از آن‌ها برای قابلیت تعامل‌پذیری به شدت توصیه می‌شود. می‌توانید هر کلیم سفارشی دیگری را به پیلود اضافه کنید.

کلیمتوضیحنوع
issIssuerمشخص می‌کند چه کسی توکن را صادر کرده — مثلاً URL سرور احراز هویت یا نام برنامه شما.string
subSubjectموضوع اصلی JWT را مشخص می‌کند — معمولاً شناسه کاربر یا حساب سرویس.string
audAudienceگیرندگان مورد نظر را مشخص می‌کند. طرف دریافت‌کننده باید تأیید کند که این با شناسه خودش مطابقت دارد.string | string[]
expExpiration Timeتایم‌استمپ Unix که پس از آن توکن نباید پذیرفته شود. همیشه این را تنظیم کنید تا خسارت از یک توکن دزدیده‌شده محدود شود.number
nbfNot Beforeتایم‌استمپ Unix که قبل از آن توکن نباید پذیرفته شود. برای برنامه‌ریزی توکن‌های با تاریخ آینده مفید است.number
iatIssued Atتایم‌استمپ Unix که در آن توکن صادر شده. برای محاسبه عمر توکن استفاده می‌شود.number
jtiJWT IDیک شناسه منحصربه‌فرد برای توکن. امکان ابطال را با ذخیره و بررسی مقادیر JTI استفاده‌شده در سمت سرور فراهم می‌کند.string

الگوریتم‌های امضای JWT

کلیم هدر alg اعلام می‌کند کدام الگوریتم توکن را امضا کرده است. این انتخاب روی امنیت، کارایی و اینکه آیا سرویس‌های شخص ثالث می‌توانند توکن‌ها را بدون کلید خصوصی تأیید کنند تأثیر می‌گذارد.

الگوریتمخانوادهنوع کلیدیادداشت‌ها
HS256HMACSymmetricرایج‌ترین. کلید مخفی مشترک — هر کسی با کلید مخفی می‌تواند هم امضا کند و هم تأیید کند.
HS384HMACSymmetricنوع قوی‌تر HMAC؛ هزینه کارایی متوسط.
HS512HMACSymmetricقوی‌ترین نوع HMAC.
RS256RSAAsymmetricپرکاربردترین الگوریتم نامتقارن (Google، Auth0، Okta). کلید عمومی بدون کلید خصوصی تأیید می‌کند.
RS384RSAAsymmetricنوع RS با امنیت بالاتر.
RS512RSAAsymmetricقوی‌ترین نوع RS.
ES256ECDSAAsymmetricمنحنی بیضوی — امضاهای کوتاه‌تر از RSA، محبوب در موبایل و IoT.
PS256RSA-PSSAsymmetricRSA-PSS: مدرن‌تر و امن‌تر از RS256 مبتنی بر PKCS1v1.5.
noneبدون امضا — بسیار خطرناک. هرگز در محیط تولید توکن‌هایی با alg: none را نپذیرید.

ملاحظات امنیتی

رمزگشایی یک JWT همیشه امن است. اعتماد به JWT بدون تأیید صحیح امضا امن نیست.

همیشه امن
  • رمزگشایی و بررسی یک JWT در ابزارهای توسعه‌دهنده یا این ابزار
  • استفاده از exp، iat و nbf برای درک طول عمر توکن
  • ثبت کلیم‌های پیلود برای اشکال‌زدایی (اطلاعات شخصی حساس را حذف کنید)
  • خواندن هدر alg برای درک نحوه امضای توکن
هرگز این کار را نکنید
  • اعتماد به کلیم‌های پیلود بدون تأیید امضا در سمت سرور
  • پذیرفتن توکن‌هایی با alg: none — این به معنای عدم وجود هیچ امضایی است
  • ذخیره توکن‌های دسترسی در localStorage در برنامه‌های با امنیت بالا (کوکی‌های httpOnly را ترجیح دهید)
  • تنظیم exp در آینده‌ای دور برای توکن‌هایی که مجوزهای حساس دارند

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

اشکال‌زدایی جریان‌های احراز هویت
یک توکن از برگه شبکه مرورگر خود را پیست کنید تا کلیم‌ها را بررسی کنید، نقش‌های تعبیه‌شده را چک کنید و انقضا را بدون دست زدن به کد محیط تولید تأیید کنید.
بررسی توکن‌های شخص ثالث
توکن‌های Google، Auth0، Okta یا Azure AD را سریع بخوانید تا ببینید ارائه‌دهنده شما چه کلیم‌هایی را شامل می‌شود و آن‌ها را با طرح مورد انتظارتان مقایسه کنید.
توسعه و تست API
هنگام نوشتن یا تست اندپوینت‌های API، هدر مجوزدهی را رمزگشایی کنید تا تأیید کنید منطق تولید توکن شما مقادیر صحیح sub، aud و scope را تنظیم می‌کند.
مجوزدهی در میکروسرویس‌ها
در شبکه‌های سرویس، هر سرویس JWT را از فراخواننده بالادستی اعتبارسنجی می‌کند. توکن‌ها را رمزگشایی کنید تا ردیابی کنید کدام سرویس توکن را صادر کرده و چه مجوزهایی را ادعا می‌کند.
پشتیبانی و پاسخ به حوادث
وقتی کاربری خطای احراز هویت گزارش می‌دهد، توکن او را رمزگشایی کنید تا بررسی کنید آیا منقضی شده، audience اشتباه است یا یک کلیم مورد نیاز گم است.
حسابرسی امنیتی
استفاده JWT را در سرویس‌ها با بررسی انتخاب‌های الگوریتمی، بازه‌های انقضا و اینکه آیا داده‌های حساس به اشتباه در پیلود رمزنگاری‌نشده ذخیره شده‌اند، حسابرسی کنید.

رمزگشایی JWT در کد

هدر و پیلود base64url-encoded هستند — فقط رمزگذاری را معکوس کنید. Base64url به جای + از - و به جای / از _ استفاده می‌کند و = padding را حذف می‌کند. تنها امضا به کلید مخفی نیاز دارد.

JavaScript (browser)
function decodeJWT(token) {
  const [, payload] = token.split('.')
  const json = atob(payload.replace(/-/g, '+').replace(/_/g, '/'))
  return JSON.parse(json)
}
Node.js
const [, payload] = token.split('.')
const decoded = JSON.parse(
  Buffer.from(payload, 'base64url').toString()
)
Python
import base64, json

def decode_jwt(token):
    payload = token.split('.')[1]
    padding = '=' * (-len(payload) % 4)
    return json.loads(base64.urlsafe_b64decode(payload + padding))
CLI (bash + jq)
TOKEN="eyJhbGc..."
echo $TOKEN | cut -d. -f2 | base64 -d 2>/dev/null | jq .

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

آیا می‌توانم یک JWT را بدون کلید مخفی رمزگشایی کنم؟
بله. هدر و پیلود JWT صرفاً JSON به صورت base64url-encoded هستند — رمزنگاری نشده‌اند. هر کسی می‌تواند آن‌ها را رمزگشایی و بخواند. کلید مخفی (یا کلید خصوصی برای الگوریتم‌های RS/ES) تنها برای تأیید امضا نیاز است تا تأیید شود توکن دستکاری نشده.
آیا رمزگشایی JWT به معنای تأیید امضاست؟
خیر. رمزگشایی تنها کلیم‌ها را می‌خواند. تأیید یک مرحله جداگانه است که امضای رمزنگاری را با استفاده از کلید صحیح بررسی می‌کند. همیشه قبل از اعتماد به هر کلیمی در برنامه خود، امضا را تأیید کنید.
تفاوت HS256 و RS256 چیست؟
HS256 از یک کلید مخفی متقارن مشترک بین صادرکننده و تأییدکننده استفاده می‌کند — هر کسی با کلید مخفی می‌تواند هم توکن بسازد و هم تأیید کند. RS256 از یک جفت کلید نامتقارن استفاده می‌کند: کلید خصوصی امضا می‌کند، کلید عمومی تأیید می‌کند. با RS256 می‌توانید کلید عمومی را توزیع کنید تا سرویس‌های خارجی توکن‌ها را بدون قدرت جعل آن‌ها تأیید کنند.
چرا رمزگشایی base64 گاهی شکست می‌خورد؟
JWT از رمزگذاری base64url استفاده می‌کند که به جای + از - و به جای / از _ استفاده می‌کند و کاراکترهای padding = را حذف می‌کند. رمزگشاهای استاندارد base64 نیاز به + و / دارند و ممکن است به padding نیاز داشته باشند. padding را برگردانید (تا مضرب ۴ با = پر کنید) و کاراکترها را قبل از رمزگشایی دستی جابجا کنید.
آیا پیست کردن یک JWT محیط تولید در این ابزار امن است؟
بله — این ابزار کاملاً در مرورگر شما اجرا می‌شود و هیچ داده‌ای به هیچ سروری ارسال نمی‌کند. با این حال، مراقب باشید چه کسی صفحه یا تاریخچه مرورگر شما را می‌بیند. برای توکن‌های بسیار حساس، آن‌ها را به صورت محلی در ترمینال خود رمزگشایی کنید.
alg: none چه معنایی دارد و آیا خطرناک است؟
alg: none به این معنی است که توکن هیچ امضای رمزنگاری ندارد — هر کسی می‌تواند یک توکن با کلیم‌های دلخواه بسازد و alg را روی none تنظیم کند. برخی کتابخانه‌های اولیه JWT این توکن‌ها را می‌پذیرفتند و آسیب‌پذیری حیاتی ایجاد می‌کردند. یک کتابخانه JWT امن همیشه توکن‌هایی با alg: none را رد می‌کند مگر اینکه صریحاً غیر این تنظیم شده باشد. این بررسی را هرگز غیرفعال نکنید.