رمزگشای JWT واقعاً چه کاری انجام میدهد
یک JSON Web Token (JWT) شبیه یک رشته طولانی از کاراکترهای تصادفی به نظر میرسد، اما رمزنگاری شده نیست و یک رمز مخفی نیست. یک ظرف فشرده و URL-safe است که داده ساختارمند را بین دو طرف حمل میکند. توکن را در رمزگشای بالا الصاق کنید و آن رشته را جدا میکند و JSON واقعی درون آن را نشان میدهد — متادیتا، ادعاها، اینکه توکن برای چه کسی است، و چه زمانی منقضی میشود. همه چیز درست در مرورگر شما اتفاق میافتد. توکن هرگز آپلود، ثبت یا به جایی ارسال نمیشود، و این موضوع هنگامی که آنچه بررسی میکنید یک اعتبارنامه جلسه زنده است اهمیت بسیاری دارد.

سه بخش، دو نقطه
هر JWT خوشساختار سه رشته Base64url-encoded است که با نقطه به هم متصل شدهاند: header.payload.signature. آن یک کاراکتر نقطه همان چیزی است که به تجزیهکنندهها میگوید یک بخش کجا تمام میشود و بعدی کجا شروع میشود، و به همین دلیل توکنی با تعداد اشتباه نقطه پیش از هر چیز دیگری رد میشود.
هدر یک شیء JSON کوچک است که خود توکن را توصیف میکند. تقریباً همیشه حاوی typ (نوع، معمولاً JWT) و alg — الگوریتم امضا، مثل HS256 (HMAC با SHA-256) یا RS256 (RSA با SHA-256) است. هدر به یک تاییدکننده دقیقاً میگوید امضا چگونه تولید شده.
محتوا بخشی است که اکثر مردم به آن اهمیت میدهند. شیء JSON دیگری است که ادعاها را نگه میدارد — اظهاراتی درباره کاربر و توکن. مشخصه ادعاها را به ثبتشده (نامهای استاندارد و رزرو شده)، عمومی و خصوصی (نامهای سفارشی که برای برنامه خودتان اختراع میکنید) تقسیم میکند. رمزگشایی محتوا همان چیزی است که نشان میدهد چه کسی وارد شده، چه نقشی دارد، و چه زمانی جلسهاش تمام میشود.
امضا مهر رمزنگاری است. بر روی هدر و محتوای رمزگذاریشده با استفاده از الگوریتم هدر به علاوه یک کلید مخفی یا خصوصی محاسبه میشود. چون هر دو بخش دیگر را پوشش میدهد، هر تغییری در هدر یا محتوا — حتی یک کاراکتر — آن را نامعتبر میکند.
ادعاهایی که بیشتر میبینید
ادعاهای ثبتشده نامهای کوتاه سهحرفی هستند که توسط RFC 7519 تعریف شدهاند تا سیستمهای مختلف بتوانند با هم کار کنند. تعدادی تقریباً همه جا ظاهر میشوند:
iss— صادرکننده: چه کسی توکن را ضرب کرده (سرور احراز هویت یا ارائهدهنده هویت شما).sub— موضوع: اصل مطلبی که توکن درباره آن است، معمولاً یک شناسه کاربر پایدار.aud— مخاطب: گیرندهای که توکن برای آن در نظر گرفته شده. یک API باید توکنهایی که مخاطبشان خودش نیست را رد کند.exp— زمان انقضا: یک Unix timestamp که پس از آن توکن نباید پذیرفته شود.iat— صادر شده در: Unix timestamp زمانی که توکن ساخته شده.
ممکن است با nbf (نه قبل از) و jti (یک شناسه منحصر به فرد توکن) هم مواجه شوید. Timestampها بر حسب ثانیه از ۱۹۷۰ در UTC هستند، به همین دلیل است که یک رمزگشا که آنها را به تاریخهای قابل خواندن توسط انسان تبدیل میکند حساب ذهنی بررسی اینکه آیا توکن قبلاً منقضی شده را از شما میگیرد.
رمزگشایی تایید نیست — این بخشی است که مردم را به دردسر میاندازد
این تمایز مهمترین چیزی است که باید درباره JWT بدانید. رمزگشایی به معنای خواندن محتوا است: نیاز به هیچ کلیدی ندارد و هر کسی که توکن را دارد میتواند این کار را بکند، چون Base64url یک رمزگذاری است، نه رمزنگاری. تایید به معنای اثبات اصالت و دستنخوردهبودن توکن است — محاسبه مجدد امضا با کلید مخفی یا عمومی صحیح و تایید اینکه مطابقت دارد.
این ابزار رمزگشایی میکند. نشان میدهد توکن چه میگوید، نه اینکه آیا توکن قابل اعتماد است. یک توکن میتواند جعلشده، منقضی یا بازپخششده باشد و همچنان به JSON کاملاً مرتب رمزگشایی شود. هرگز یک تصمیم احراز هویت را فقط بر اساس ادعاهای رمزگشاییشده نگیرید. در تولید، امضا را سمت سرور تایید میکنید، exp را بررسی میکنید، و تایید میکنید که iss و aud با انتظاراتتان مطابقت دارند — با استفاده از کتابخانهای معتبر، نه مقایسه رشته دستساز.

محتوا یک گاوصندوق نیست
چون محتوا فقط Base64url-encoded است، توسط هر کسی که توکن را رهگیری کند قابل خواندن است. همه چیز در آن را به عنوان عمومی تلقی کنید. رمزهای عبور، شماره کارت اعتباری کامل، کلیدهای مخفی یا هر داده شخصی حساسی را در ادعاهای JWT قرار ندهید — اگر بتوانید آن را اینجا با یک کلیک رمزگشایی کنید، هر شخص دیگری که نسخهای از آن دارد هم میتواند. امضا از تغییر محافظت میکند، نه از خواندن. اگر واقعاً نیاز دارید محتوای payload را پنهان کنید، آن کار وظیفه JWE (توکنهای رمزنگاریشده) است، یک مشخصه کاملاً متفاوت.
حریم خصوصی و ابزارهای مرتبط
بررسی یک توکن یک عمل حساس است، بنابراین این رمزگشا کاملاً سمت کلاینت اجرا میشود — تجزیه JavaScript ساده در تب شماست و هیچ چیز دستگاه شما را ترک نمیکند. الصاق یک توکن جلسه به یک ابزار با پشتیبانی سرور به معنای دادن یک اعتبارنامه زنده به یک شخص ثالث است، که دقیقاً همان چیزی است که باید از آن اجتناب کنید. برای رمزگذاری زیربنایی همه اینها، ابزار Base64 ما را ببینید، و بقیه ابزارهای توسعهدهنده را برای ابزارهای بیشتر روی دستگاه کاوش کنید.
پرسشهای متداول
آیا JWT رمزنگاری شده است؟
خیر. یک JWT استاندارد Base64url-encoded است، نه رمزنگاریشده. هر کسی با توکن میتواند هدر و محتوا را بخواند. اگر نیاز دارید محتوا پنهان باشد از JWE استفاده کنید.
آیا این ابزار امضا را تایید میکند؟
خیر. فقط هدر و محتوا را رمزگشایی و نمایش میدهد. تایید امضا نیاز به کلید مخفی یا عمومی صادرکننده دارد و باید روی سرور شما انجام شود.
آیا الصاق توکنم اینجا ایمن است؟
بله. رمزگشایی کاملاً در مرورگر شما با استفاده از JavaScript محلی اجرا میشود. توکن هرگز آپلود، ذخیره یا به هیچ سروری ارسال نمیشود.
iss، sub، aud، exp و iat به چه معنا هستند؟
آنها ادعاهای ثبتشده هستند: صادرکننده، موضوع، مخاطب، زمان انقضا و زمان صدور. سه مورد مرتبط با زمان از Unix timestamp بر حسب ثانیه استفاده میکنند.
آیا میتوانم به ادعاهای نشاندادهشده پس از رمزگشایی اعتماد کنم؟
به تنهایی نه. ادعاهای رمزگشاییشده میتوانند از یک توکن جعلشده یا منقضیشده باشند. همیشه امضا را تایید کنید و انقضا را سمت سرور پیش از اعتماد به آنها بررسی کنید.
چرا توکنم سه بخش جدا شده با نقطه دارد؟
آنها هدر، محتوا و امضا هستند که هر کدام Base64url-encoded و با نقطهها به هم متصل شدهاند. نقطهها به تجزیهکنندهها میگویند هر بخش کجا شروع و پایان مییابد.
