UltKit

JWT 解碼器

貼上 JSON Web Token,即可以格式化 JSON 查看標頭與 payload。到期時間與簽發時間會顯示為日期,並註明這個 Token 目前是否有效。解碼完全在您的瀏覽器中進行。如果 Token 是仍在使用中的憑證,這點特別重要。

0 個字元 · 0 個字詞 · 0 行

0 個字元 · 0 個字詞 · 0 行

完全在此瀏覽器分頁中執行,您的文字不會被上傳或儲存。

已註冊的宣告

RFC 7519 §4.1 定義的七個宣告名稱。全部皆為選用;時間為自 1970-01-01 UTC 起算的秒數。

宣告意義
iss簽發者:建立並簽署權杖的一方
sub主體:權杖所指的使用者或實體
aud受眾:權杖預定給誰使用
exp到期時間:此時間之後應拒絕權杖
nbf生效時間:此時間之前應拒絕權杖
iat簽發時間:權杖的建立時間
jtiJWT ID:唯一識別碼,用於防止重放攻擊

常見的 alg 值

alg 值意義
HS256使用 SHA-256 的 HMAC;同一個共用密鑰負責簽署與驗證
RS256使用 SHA-256 的 RSA PKCS#1 v1.5 簽章;私鑰簽署,公鑰驗證
PS256使用 SHA-256 的 RSA-PSS
ES256P-256 曲線上使用 SHA-256 的 ECDSA;簽章較短
EdDSAEd25519 或 Ed448 簽章
none未簽署的權杖;伺服器應拒絕

JSON Web Token 的結構

JWT 定義於 RFC 7519(2015 年 5 月),該規範建議讀作英文單字 "jot"。常見的簽章形式是以句點連接的三段 Base64url 字串:header.payload.signature。標頭(header)會在 alg 中註明簽章演算法,例如 HS256 或 RS256,也常在 kid 中附上金鑰 ID。內容(payload)存放聲明(claims),也就是 JSON 欄位,例如 sub(使用者)、iss(簽發者)、aud(預期受眾),以及 exp、nbf 和 iat,這三個是自 1970 年 1 月 1 日 UTC 起算的秒數時間。解碼器會把這三個時間轉成您的當地時間與 ISO 8601 格式,並告訴您權杖是已過期、尚未生效,還是在有效期間內。

Base64url 只是編碼,不是加密,所以任何拿到權杖的人都能像本頁一樣讀取其內容。請勿在聲明中放入密碼、信用卡號或其他機密資訊。由五段以句點分隔的權杖是 JWE,也就是加密權杖;沒有金鑰就無法讀取內容,解碼器也會如此提示。從 Authorization 標頭複製而來、開頭的 "Bearer " 會自動移除。

為什麼這裡不驗證簽章

簽章用來證明標頭和內容是由持有金鑰的人產生,且之後未被更動。驗證簽章需要該金鑰:HS256 這類 HMAC 演算法要用共用密鑰,RS256、ES256 或 EdDSA 則要用簽發者的公開金鑰。把正式環境的簽章密鑰貼到任何網頁都不是好主意,而沒有金鑰卻假裝能擔保權杖的解碼器只會帶來錯誤的安心感,因此本工具只顯示簽章,不進行驗證。請把您看到的內容視為權杖自己的聲明,而非事實。

驗證應在您的伺服器上進行,使用持續維護的函式庫,並固定預期的演算法。兩個歷史上的錯誤說明了原因:一是接受 alg 為 "none",讓任何人都能偽造未簽章的權杖;二是演算法混淆,也就是預期 RS256 的伺服器被誘騙,用公開金鑰當作 HMAC 密鑰來檢查 HS256 簽章。解碼器是用來除錯的:查看服務提供者簽發了哪些聲明、找出錯誤的受眾,或發現工作階段失敗是因為 exp 在一分鐘前剛過期。若要查看原始的 Base64url 片段,請使用 Base64 解碼器。

常見問題

把真實的存取 Token 貼到 JWT 解碼器安全嗎?
在本頁上,權杖不會離開您的瀏覽器。不過有效的權杖在過期前等同於密碼,所以建議使用已過期或測試用的權杖,並避免讓正式權杖出現在螢幕截圖和聊天訊息中。
Token 才剛簽發,為什麼顯示已過期?
請先檢查裝置的時鐘。有些簽發者給存取權杖的有效期只有幾分鐘,而從記錄檔複製的權杖可能比看起來更舊。若 exp 以毫秒而非秒寫成,情況則相反,會變成幾千年後。
別人能竄改我的 JWT payload 嗎?
他們可以修改並重新編碼,但簽章就不再相符。使用正確金鑰和演算法驗證簽章的伺服器會拒絕被更動的權杖。
JWS 和 JWE 有什麼不同?
JWS(RFC 7515)有簽章、分為三段,任何人都能讀取。JWE(RFC 7516)已加密、分為五段,只有持有金鑰的人能讀取內容。
登出後 JWT 就會失效嗎?
光靠權杖本身做不到。已簽章的 JWT 在 exp 之前都有效,除非伺服器維護拒絕清單或檢查工作階段記錄,這也是存取權杖通常只給短效期的原因。