توکن JSON Web چیست؟
یک توکن JSON Web (JWT) یک پاکت فشرده و URL-ایمن برای یک payload کوچک از claims است. این فرمت اعتبارنامه استاندارد برای session های وب بدون حالت، توکنهای ID OAuth/OIDC، احراز هویت API ماشین به ماشین و magic link های امضاشده است. یک JWT همیشه سه بخش base64url جداشده با نقطه است: header.payload.signature. header و payload از JSON هستند؛ signature یک MAC باینری یا امضای دیجیتال روی دو بخش اول است.
JWT ها چگونه کار میکنند؟
وقتی این ابزار یک توکن را رمزگشایی میکند، همان مسیر سهمرحلهای را که هر کتابخانه JWT دنبال میکند طی میکند:
- تقسیم توکن روی نقطهها به دقیقاً سه بخش غیر خالی. هر شکل دیگری نادرست است.
- رمزگشایی base64url از بخشهای ۰ و ۱، سپس
JSON.parseهر کدام. header الگوریتم (alg) و نوع توکن (typ) را حمل میکند. payload claims را حمل میکند (sub،exp،iat، کلیدهای سفارشی). - اگر یک secret ارائه شد، MAC را روی
<segment0>.<segment1>با استفاده از الگوریتم در header دوباره محاسبه کنید. بایتها را با بخش سوم مقایسه کنید. - نتیجه تأیید را کنار claims رمزگشاییشده نمایش دهید، شامل یک نشانگر انقضا خوانا برای انسان که از claim
expمحاسبه شده است.
چرا JWT ها را در مرورگر رمزگشایی کنیم؟
پیست کردن یک JWT واقعی در حال استفاده در یک دیباگر از راه دور، اعتبارنامه را به لاگهای آن سرویس، stack observability و هر شریکی که سرویس داده به او ارسال میکند، لو میدهد. حتی وقتی سایت شخص ثالث ادعا میکند توکنها را لاگ نمیکند، هیچ راهی برای تأیید آن ندارید. این ابزار ساخته شد تا هرگز مجبور نباشید این مبادله را انجام دهید:
- بدون شبکه: runtime هیچ تابع
fetch،XMLHttpRequestیاsendBeaconندارد. DevTools را باز کنید هنگام رمزگشایی و تأیید — پانل Network ساکت میماند. - Web Crypto بومی: تأیید HMAC از
crypto.subtle.importKeyوcrypto.subtle.signاستفاده میکند، همان عوامل اولیهای که runtime شما صدا میزند. - استقرار استاتیک: هر صفحه یک فایل HTML استاتیک تکی بدون endpoint سرور است که بتوان آن را به خطر انداخت. هیچ توکنی برای فاش شدن وجود ندارد چون هیچ سروری برای فاش شدن به آن وجود ندارد.
این ابزار چه چیزی را تأیید میکند و چه چیزی را نه؟
نسخه ۱ این ابزار فقط امضاهای خانواده HMAC-SHA را تأیید میکند. به طور مشخص:
- پشتیبانیشده: HS256، HS384، HS512. secret مشترک را ارائه دهید و ابزار MAC را دوباره محاسبه و مقایسه میکند.
- هنوز پشتیبانی نمیشود: RS256/384/512 (RSA)، ES256/384/512 (ECDSA)، EdDSA و PS256/384/512 (RSA-PSS). اینها به یک کلید عمومی در فرم PEM یا JWK نیاز دارند و عمداً به یک انتشار بعدی موکول شدهاند.
- رد شده:
alg: "none". ابزار توکن را رمزگشایی میکند اما صراحتاً آن را به عنوان ناامن علامتگذاری میکند — هیچ اعتبارسنجی امضایی در حال انجام نیست، و هر سیستم تولیدی که چنین توکنی را قبول کند یک آسیبپذیری جدی دارد.
یک مثال رمزگشایی JWT چه شکلی است؟
توکن نمونه کانونیک RFC 7519 را در فیلد ورودی بالا پیست کنید:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
header به {"alg":"HS256","typ":"JWT"} و payload به {"sub":"1234567890","name":"John Doe","iat":1516239022} رمزگشایی میشود. your-256-bit-secret را در پانل تأیید وارد کنید و بررسی امضا معتبر برمیگردد. یک کاراکتر از secret را تغییر دهید و نامعتبر برمیگردد. هیچکدام از اینها مرورگر شما را ترک نمیکند.
این همان رمزگشای JWT است که آرزو میکردیم وقتی نیاز داشتیم یک توکن در تولید دیباگ کنیم وجود داشت: محترم با حریم خصوصی، سریع و ساختهشده روی همان عوامل اولیهای که runtime استفاده میکند.