免費線上 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 令牌竊取。