رمزگشای JWT
JSON Web Token را محلی رمزگشایی کنید و امضایش را با کلید محرمانه یا عمومی بررسی کنید، بدون ارسال چیزی.
برای آزمودن یک سرویس، توکن خودتان را امضا کنید. همهچیز در همین صفحه محاسبه میشود.
کلید و توکن ساختهشده در مرورگر شما میمانند؛ هیچکدام جایی فرستاده نمیشوند و در پیوند همرسانی هم نمیآیند.
این توکن را در کد خودتان بررسی کنید. نمونهکد از الگوریتمی که در هدر آمده پیروی میکند.
رمزگشای JWT — خواندن آنلاین محتوای JSON Web Token
توکن JWT را بچسبانید تا این ابزار آن را به سه بخش تقسیم کند و هدر و پیلود را به شکل JSON خوانا نشان دهد. این سریعترین راه برای پاسخ به سؤالهایی است که هنگام اشکالزدایی احراز هویت پیش میآید: چه کسی این توکن را صادر کرده، برای چه کسی است، با چه الگوریتمی امضا شده و آیا منقضی شده است یا نه.
رمزگشایی کاملاً داخل مرورگر شما انجام میشود. اینجا این موضوع از بیشتر ابزارها مهمتر است، چون JWT یک اعتبارنامه زنده است: هر کسی یک توکن معتبر را به دست بیاورد معمولاً تا زمان انقضا میتواند بهجای صاحبش عمل کند. هیچچیزی که در این صفحه میچسبانید آپلود، ثبت یا ذخیره نمیشود.
JSON Web Token چیست
یک JWT از سه قطعه Base64URL تشکیل شده که با نقطه به هم وصل شدهاند: header.payload.signature. هدر الگوریتم امضا را مشخص میکند، پیلود حامل Claimهاست یعنی ادعاهایی که صادرکننده درباره کاربر یا کلاینت مطرح میکند، و امضا ثابت میکند دو بخش اول را کسی ساخته که کلید را در اختیار داشته است. چون هدر و پیلود فقط کد شدهاند و رمزنگاری نشدهاند، هر کسی میتواند آنها را بخواند. تنها چیزی که محافظت میشود امضاست.
روش رمزگشایی JWT در همین صفحه
- توکن را از هدر
Authorization: Bearer، یک کوکی، یک آدرس بازگشتی یا کلاینت API خود کپی کنید. - رشته کامل
header.payload.signatureرا در کادر ورودی بچسبانید. - روی رمزگشایی بزنید تا هر دو شیء JSON نمایش داده شوند.
- اگر درخواست رد شده است، اول
expو بعدaudوissرا بررسی کنید.
این صفحه دیگر چه میکند
توکن همان حین تایپ خوانده میشود، پس کادرها پیش از آنکه سراغ دکمه بروید پر میشوند. زیر هدر و پیلود رمزگشاییشده، هر فیلد در جدولی میآید با توضیح سادهای از کارش، و خطی بالای آنها exp و nbf را به جمله بدل میکند: سه روز پیش منقضی شده، پنجاهوهشت دقیقه دیگر منقضی میشود، هنوز معتبر نیست.
- نمونه یک توکن آزمایشی را با کلید محرمانهاش بار میکند تا پیش از چسباندن توکن خودتان، یک بررسی موفق را ببینید.
- بررسی امضا کلید محرمانه، کلید عمومی PEM، یک JWK یا کل یک JWKS را میپذیرد. سندی را که آدرس
/.well-known/jwks.jsonصادرکننده برمیگرداند بچسبانید تا کلیدی کهkidتوکن نام میبرد خودکار انتخاب شود؛ صفحه همچنان هیچ درخواستی از جانب خودش نمیفرستد. اگر صادرکننده مورد انتظار و مخاطب مورد انتظار را هم پر کنید، امضای معتبر همانطور بررسی میشود که یک سرور بررسی میکند:issمتفاوت، یاaudی که مقدار شما را ندارد، نتیجه را قرمز میکند. - ساخت توکن توکن خودتان را با هر یک از دوازده الگوریتم امضا میکند؛ صفحه تولید JWT روی همین زبانه باز میشود.
- کد بررسی سمت سرور را در هشت زبان مینویسد، متناسب با الگوریتمی که در هدر توکن شماست.
- دو صفحه دیگر همین ابزار را روی یک پرسش باز میکنند: منقضی شده یا نه و چرا پذیرفته نمیشود.
Claimهای استاندارد و معنای آنها
| Claim | معنی | دلیل رایج خطا |
|---|---|---|
iss | صادرکننده توکن | وقتی توکن محیط تست به محیط اصلی فرستاده میشود مطابقت ندارد |
sub | موضوع؛ معمولاً شناسه کاربر یا سرویس | در توکنهایی که برای یک کلاینت و نه یک شخص صادر شدهاند خالی است |
aud | مخاطب؛ همان APIای که باید توکن را بپذیرد | رایجترین دلیل خطای ۴۰۱ با توکنی که ظاهراً معتبر است |
exp | زمان انقضا به شکل تایماستمپ یونیکس | گذشته است یا ساعت سرور اختلاف دارد |
nbf | پیش از این زمان معتبر نیست | توکن چند ثانیه زودتر از موعد استفاده شده است |
iat | زمان صدور | مبنای سیاست حداکثر عمر توکن و بازه ابطال |
jti | شناسه یکتای توکن | برای مسدود کردن یک توکن مشخص لازم است |
رمزگشایی با تأیید اعتبار فرق دارد
این همان نکتهای است که بیشتر افراد را به اشتباه میاندازد. خواندن یک توکن به شما میگوید چه ادعایی دارد، نه اینکه آن ادعا درست است یا نه. تأیید اعتبار یعنی محاسبه دوباره امضا با Secret یا کلید عمومی صادرکننده و مقایسه آن، بهعلاوه بررسی انقضا و مخاطب. هر رمزگشایی، پیلود یک توکن جعلی را به همان راحتی توکن واقعی نشان میدهد؛ پس هرگز تصمیم مجوزدهی را فقط بر پایه محتوای رمزگشاییشده نگیرید و همیشه سمت سرور با یک کتابخانه بهروز اعتبارسنجی کنید.
عیبیابی توکنی که کار نمیکند
- خطای ۴۰۱ با توکن معتبر: مقدار
audرا با آنچه API انتظار دارد وissرا با آدرس صادرکننده تنظیمشده مقایسه کنید. هر دو را در صادرکننده مورد انتظار و مخاطب مورد انتظار وارد کنید و بررسی امضا را بزنید: نتیجه مقداری را که توکن واقعاً دارد نشان میدهد. - انقضای فوری: مقدار
expرا با مبدل تایماستمپ یونیکس تبدیل کنید و با ساعت سرور بسنجید، نه ساعت لپتاپ خودتان. - خطای قطعه نامعتبر: توکن ناقص شده، در مسیر URL-encode شده یا هنگام کپی یک خط جدید وارد آن شده است.
- شکست تأیید امضا: کلید تعویض شده، شناسه کلید اشتباه استفاده شده یا توکن در محیط دیگری امضا شده است.
- مقدار
algبرابرnone: آن را رد کنید. این مقدار یعنی توکن امضا ندارد و یک حمله کلاسیک به اعتبارسنجیهای سهلانگارانه است.
عادتهای امنیتی که ارزش دارند
- هرگز اطلاعات شخصی، شناسههای داخلی یا داده محرمانه را در پیلود نگذارید؛ این بخش عمداً خواندنی است.
- عمر توکن دسترسی را کوتاه نگه دارید و برای نشستهای طولانی از Refresh Token استفاده کنید.
- توکنها را فقط روی HTTPS منتقل کنید و تا جای ممکن کوکیهای Secure و HttpOnly را به Storage مرورگر ترجیح دهید.
- کلیدهای امضا را طبق برنامه تعویض کنید و از طریق یک نقطه JWKS منتشر کنید تا کلاینتها همراه شوند.
- هر توکنی را که در یک ابزار آنلاین چسباندهاید لو رفته فرض کنید؛ دقیقاً به همین دلیل این ابزار هیچجا چیزی نمیفرستد.
بدون اینترنت هم کار میکند
این رمزگشا فقط JavaScript سمت کاربر است. بعد از بارگذاری صفحه میتوانید بدون هیچ اتصال شبکهای توکنها را باز کنید و اعتبارنامههای محیط اصلی هرگز از دستگاه شما بیرون نمیروند.
رمزگشایی JWT در کد یا خط فرمان
| کجا | چطور |
|---|---|
| JavaScript (npm) | import { jwtDecode } from 'jwt-decode'; jwtDecode(token) - فقط پیلود، بدون تأیید |
| Python (PyJWT) | jwt.decode(token, options={'verify_signature': False}) برای خواندن، یا با دادن کلید برای تأیید |
| Bash | echo $TOKEN | cut -d. -f2 | tr '_-' '/+' | base64 -d 2>/dev/null - Base64URL پدینگ ندارد، پس پیلود کوتاه ممکن است به == در انتها نیاز داشته باشد |
| کنسول مرورگر | JSON.parse(atob(token.split('.')[1].replace(/-/g, '+').replace(/_/g, '/'))) |
همه این روشها توکن را بدون بررسی امضا میخوانند - برای دیباگ خوب است و برای تصمیمگیری درباره دسترسی اشتباه؛ بخش بالا را ببینید.
ابزارهای مرتبط
توکنها میان چند قالب مختلف قرار میگیرند. قطعههای خام را با رمزگشای Base64 بخوانید، پیلود را با فرمتکننده JSON مرتب کنید، مقدارهای exp و iat را با مبدل تایماستمپ به تاریخ تبدیل کنید و توکنی را که از آدرس بیرون کشیدهاید با رمزگشای URL پاکسازی کنید.