JWT 偵錯工具

解碼、編碼和驗證 JSON Web 令牌 (JWT)。

免費線上 JWT 偵錯器和解碼器

JWT在現代APIs中具有權力認證,但它們的Base64編碼結構使它們一目瞭然。 Dokall 解碼標頭和有效負載,驗證結構,並協助您在開發過程中編碼或驗證令牌。

調試 OAuth 流、檢查會話令牌並測試簽名驗證 - 一切都在您的瀏覽器中進行。切勿將生產機密貼到不受信任的網站上; Dokall 在客户端處理令牌。

JWT 身份驗證如何工作

用户登錄時,服務器創建包含用户身份和權限的 JWT,用密鑰簽名後返回。之後每次請求,客户端發送 JWT——通常在 Authorization 頭中以 Bearer <token> 形式。服務器驗證簽名,無需查詢會話存儲。

這種無狀態設計意味着任何持有簽名密鑰的服務器都能獨立驗證令牌。因此 JWT 在微服務架構、單頁應用和移動 API 中很受歡迎——這些場景下認證服務器與資源服務器可能是不同機器。

JWT 結構:Header、Payload、Signature

JWT 是三個由點分隔的 Base64url 編碼 JSON 對象:header.payload.signature。

header 聲明令牌類型(始終為 JWT)和簽名算法,例如 {"alg": "HS256", "typ": "JWT"}。payload 攜帶聲明——描述用户或會話的鍵值對。聲明可以是註冊的(由規範定義)、公開的(自定義但抗衝突)或私有的(各方約定)。signature 通過對編碼後的 header 和 payload 用密鑰或私鑰簽名產生。持有對應密鑰的人可驗證令牌未被篡改。

將令牌粘貼到本調試器時,它按點分割、解碼各部分並顯示 JSON。讀取 header 和 payload 無需密鑰——僅驗證簽名時需要。

簽名算法:HS256 vs RS256 vs ES256

HS256(HMAC + SHA-256)是對稱算法。同一密鑰用於簽名和驗證。快速簡單,但每個需要驗證令牌的服務都必須知道密鑰。若一個服務被攻破,密鑰即暴露。

RS256(RSA + SHA-256)是非對稱的。私鑰簽名,公鑰驗證。只有認證服務器需要私鑰——下游服務使用可安全分發的公鑰。RS256 密鑰更大(2048+ 位),簽名較慢,但驗證很快。

ES256(ECDSA + P-256)也是非對稱的,但使用橢圓曲線密碼學。密鑰遠小於 RSA(256 位對比 2048 位),運算更快,是新系統的良好預設選擇。多數 JWT 庫和雲提供商都支持。

簡單單服務器部署選 HS256。多個服務驗證令牌或發佈 JWKS 端點時,選 RS256 或 ES256。

標準 JWT 聲明參考

JWT 規範(RFC 7519)定義了七個註冊聲明。均非強制,但一致使用有助於互操作。

iss(issuer)標識誰創建並簽名令牌,通常是如 https://auth.example.com 的 URL。sub(subject)標識主體——通常是用户 ID。aud(audience)指定預期接收方,常為 API 域名。exp(expiration time)是 Unix 時間戳,之後令牌必須被拒絕。iat(issued at)記錄令牌創建時間。nbf(not before)防止令牌在特定時間之前使用。jti(JWT ID)是唯一標識符,適用於一次性令牌或吊銷列表。

除註冊聲明外,可添加應用所需的任意自定義數據——角色、權限、租户 ID、郵箱地址。請保持 payload 精簡。每多一字節都會增大攜帶該令牌的每個 HTTP 請求。

JWT 與基於會話的身份驗證

基於會話的認證在服務器上存儲狀態。用户登錄時,服務器創建會話記錄(內存、數據庫或 Redis),分配會話 ID,並以 cookie 發給客户端。每次請求包含該 cookie,服務器查找會話。吊銷訪問即時生效——刪除會話即可。

JWT 認證是無狀態的。令牌本身包含服務器所需全部資訊。每次請求無需查庫,服務器間也無需共享會話存儲。缺點是:若不維護黑名單,無法在過期前真正吊銷 JWT,而這又部分抵消了無狀態優勢。

需要即時吊銷時(銀行、管理面板),會話更簡單更好。分佈式系統、跨域 API,以及 cookie 不便的移動客户端,JWT 更好。許多生產系統兩者結合——用短生命週期 JWT 做 API 訪問,配合可吊銷的服務端刷新令牌。

常見 JWT 錯誤及修復方法

「Token expired」表示當前時間已過 exp 聲明。檢查服務器時鐘是否同步(容器中 NTP 漂移是常見原因)。若令牌生命週期過短,可延長或實現刷新令牌流程。

「Invalid signature」表示驗證密鑰與簽名密鑰不匹配。常見於按環境部署密鑰時加載了錯誤密鑰、輪換密鑰後未更新所有服務,或在環境間複製了令牌。

「Token not yet valid」在當前時間早於 nbf 聲明時觸發。通常是簽發服務器與驗證服務器之間的時鐘偏差。多數 JWT 庫接受較小時鐘容差(通常 30–60 秒)。

「Malformed JWT」表示令牌沒有三個用點分隔的部分,或某部分不是有效 Base64url。檢查從日誌或郵件複製令牌時是否有意外空格、換行或截斷。

JWT 安全最佳實踐

payload 是編碼的,不是加密的。任何截獲 JWT 的人都能閲讀其聲明。切勿在 payload 中放入密碼、信用卡號或其他機密。

使用短過期時間——訪問令牌常用 15 分鐘。搭配安全存儲在服務器上的更長生命週期刷新令牌。這樣即使令牌被盜,損害窗口也有限。

對 HS256,密鑰應至少有 256 比特密碼學隨機性。短口令易受暴力破解。請用密鑰生成器創建合適的密鑰。

始終在服務端驗證 alg 聲明。「算法混淆」攻擊會誘使服務器將 RS256 令牌當作 HS256,並用公鑰作為 HMAC 密鑰。現代庫可防範此問題,但仍建議顯式配置算法。

在瀏覽器中存儲 JWT 時,優先使用 httpOnly、Secure、SameSite cookie。localStorage 可被頁面上任意 JavaScript 訪問,易受 XSS 攻擊。帶正確標誌的 cookie 可免疫 XSS 令牌竊取。

常見問題

什麼是 JSON Web Token(JWT)?
JSON Web Token 是 RFC 7519 定義的緊湊、URL 安全的令牌格式。它以 JSON 對象攜帶一組聲明,並用密鑰(HMAC)或公私鑰對(RSA、ECDSA)簽名。JWT 廣泛用於 Web API 的身份驗證與授權。令牌由三部分組成——header、payload 和 signature——用點分隔。
在在線工具中解碼 JWT 安全嗎?
Dokall 完全在瀏覽器中解碼令牌。不會發送到服務器。對開發和調試,基於瀏覽器的解碼器安全且方便。即便如此,也請避免在任何公共網站上粘貼含真實用户數據的生產令牌——即使是純客户端工具——因為瀏覽器擴展或剪貼板管理器可能泄露它們。
沒有密鑰也能讀取 JWT 嗎?
可以。header 和 payload 只是 Base64url 編碼,並非加密。任何人都能解碼並閲讀。密鑰僅用於驗證簽名——確認令牌未被篡改。因此切勿在 JWT payload 中存儲敏感數據。
HS256 和 RS256 有什麼區別?
HS256 是對稱的——同一密鑰簽名並驗證令牌。RS256 是非對稱的——私鑰簽名,單獨的公鑰驗證。僅一台服務器簽發並驗證令牌時用 HS256。多個服務需要在不知道簽名密鑰的情況下驗證令牌時,用 RS256 或 ES256。
為什麼我的 JWT 顯示已過期?
令牌的 exp(expiration)聲明是 Unix 時間戳。若當前時間超過它,令牌即已過期。常見原因:令牌生命週期對你的用例過短、服務器時鐘不同步(容器中的 NTP 問題),或令牌數小時前簽發並已自然過期。可通過調整令牌生命週期、同步時鐘或實現刷新令牌流程來解決。
JWT 應該存在 localStorage 還是 cookie?
優先使用 httpOnly、Secure、SameSite cookie。localStorage 可被頁面上運行的任意 JavaScript 訪問,因此一次 XSS 漏洞就能竊取令牌。httpOnly cookie 完全無法被 JavaScript 讀取。代價是 cookie 會隨每個請求自動發送(包括到子域名),因此請仔細配置 cookie 的 domain 和 path。
如何在過期前吊銷 JWT?
JWT 本質上是無狀態的,因此沒有內置的吊銷機制。常見做法包括:將訪問令牌設為短生命週期(5–15 分鐘),並配合可刪除的服務端刷新令牌;維護已吊銷令牌 ID(jti 聲明)的黑名單並在每次請求時校驗;或在數據庫中使用令牌版本計數器,拒絕舊版本令牌。
JWT 密鑰泄露會怎樣?
任何持有密鑰的人都可以偽造帶任意聲明的有效令牌——相當於可冒充任何用户。應立即輪換密鑰,這將使所有現有令牌失效,用户需要重新登錄。對於 HS256,更換密鑰即可;對於 RS256/ES256,生成新密鑰對並更新 JWKS 端點。建議採用帶重疊有效期的密鑰輪換,避免硬性切斷。