精簡的 JWT 只有兩個 Base64url 編碼的 JSON 物件——標頭 (header) 和負載 (payload)——再由第三個稱為簽章 (signature) 的區段連接而成,而且你不需要簽章密鑰就能讀取任一個 JSON 物件。解碼步驟是一種機械式的轉換:在句點上切割 token,套用 Base64url 解碼第一個區段以還原標頭,套用 Base64url 解碼第二個區段以還原負載,除非你真的想驗證簽章,否則第三個區段保持不動。Python 開發者通常會選擇 PyJWT 或一行 base64 程式碼來完成這項工作,這條路徑在腳本中完全沒問題——但它需要一個可運行的直譯器、一個已安裝的相依套件,以及一份放在你終端機或筆記本中的 token。當你只需要快速檢查一個 token 時——例如在共用機器上進行除錯工作階段、在未安裝 Python 的 Windows 主機上,或在無法安裝套件的受限環境中——一個專用的瀏覽器工具可以在兩次點擊內為你提供同樣的解碼 JSON,而不需要匯入任何東西。這正是 JWT Decoder 的用途。

如何在 Python 中解碼 JWT
大多數 Python 開發者會選擇 PyJWT 或標準函式庫。PyJWT 的 decode() 函式接受 options={"verify_signature": False} 以用於僅供檢視的使用情境,而另一個快速的標準函式庫替代方案則使用 base64 模組直接對前兩個區段進行 URL-safe 解碼。這兩種做法都不會上傳 token,都保持在本地執行,並且都不會動到簽章。麻煩出現在你根本不想啟動 Python 開發環境的時候。
典型的 PyJWT 檢視程式碼片段:
import jwt # pip install PyJWT first token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwiaWF0IjoxNTE2MjM5MDIyfQ.signature" payload = jwt.decode(token, options={"verify_signature": False}) print(payload)或僅使用標準函式庫:
import base64, json token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwiaWF0IjoxNTE2MjM5MDIyfQ.signature" def b64url_decode(segment): padding = "=" * (-len(segment) % 4) return base64.urlsafe_b64decode(segment + padding) parts = token.split(".") header = json.loads(b64url_decode(parts[0])) payload = json.loads(b64url_decode(parts[1])) print(header, payload)兩種做法都能運作,而且都不會動到簽章。預期是你只會在獲得授權檢視的 token 上執行它們,並且在結束時從剪貼簿與共享歷史紀錄中清除該 token。
精簡 JWT token 的結構
精簡 JWT——也就是 RFC 7519 所定義且 JWT Decoder 所接受的形式——必定剛好由三個以單個句點分隔的區段組成:標頭、負載,以及簽章。每個區段都使用 RFC 4648 中的 URL-safe Base64 字元集,這意味著它包含大寫字母、小寫字母、數字、連字號字元,以及底線字元——並且省略了通常由填充所加上的尾端等號。
標頭通常用於識別簽章演算法與 token 類型,負載則包含聲明 (claims),例如主體、對象群、發行者、過期時間,以及任何應用程式特有的資料,而簽章則是使用標頭中所宣告的演算法,針對前兩個區段計算出來的數位簽章。了解這個結構很重要,因為 JWT Decoder 會拒絕任何不符合的內容——只有一個區段的 token、含有填充字元的 token,或是其 base64 含有 URL-safe 字元集以外字元的 token,將會產生錯誤而非猜測結果。
如何使用 JWT Decoder 在瀏覽器中解碼同一個 token
- 從 token 所在的任何地方複製精簡 JWT——例如 localStorage 中的值、伺服器日誌中的一行、curl 回應標頭、除錯輸出,或請求檢查器——並確認它確實是 header.payload.signature 的形式。JWT Decoder 會拒絕任何無法剛好切分為三個以句點分隔區段的內容。
- 在瀏覽器中開啟 JWT Decoder。由於該頁面完全在用戶端執行,不會發生上傳、不會擷取簽章金鑰,也不需要帳號;頁面載入完成的瞬間即可開始輸入。
- 將 token 貼到輸入欄位中。該頁面會去除前後空白、在句點上切割、依據 URL-safe Base64 字元集驗證每個區段、將前兩個區段解碼為 UTF-8 JSON,並呈現出所有存在的標準聲明。第三個區段僅進行結構檢查,絕不會被解讀為一組成功的簽章。
- 選擇 Decode JWT。輸入欄位下方會出現兩個標示清楚的區塊——標頭與負載——以及該 token 所包含的 RFC 7519 註冊聲明:發行者、主體、對象群、過期時間、not-before 時間、發行時間,以及 JWT ID。
- 將解碼結果視為未經驗證的資訊。一個可讀的負載可能是偽造的、已過期的、發給不同對象群的,或是以你不信任的金鑰簽署的。每當問題在於某個工作階段 (session) 目前是否有效時,請在擁有該 token 的應用程式內部進行驗證。
JWT Decoder 會呈現什麼——以及它拒絕做什麼
這個工具刻意保持精簡。了解你所見內容與仍然未知內容之間的界線,才能避免一次快速解碼被誤認為是安全性檢查。
| 呈現的內容 | 拒絕執行的項目 |
|---|---|
| 解析為 UTF-8 JSON 物件的標頭 | 驗證 JWS 簽章 |
| 解析為 UTF-8 JSON 物件的負載 | 解密 JWE |
| 註冊聲明:iss、sub、aud、exp、nbf、iat、jti | 擷取簽章金鑰或 JWKS 文件 |
| 每個 NumericDate 值旁邊的 ISO 8601 時間戳記 | 依據政策檢查發行者或對象群 |
| 標頭中的演算法與類型欄位 | 將時鐘偏移 (clock-skew) 規則套用於 exp 或 nbf |
| 來自原始負載的自訂私有聲明 | 做出授權決策 |
| 在每次成功解碼上加上清楚的「unverified」標籤 | 接受秘密、密碼或 PEM 金鑰 |
標準聲明一覽
RFC 7519 定義了七個註冊聲明。JWT Decoder 以與你的 Python 腳本相同的方式呈現每一個聲明,並為三個時間戳記聲明提供 ISO 8601 讀數輔助,讓 Unix 秒數值更易於一目了然地檢查。
| 聲明 | 意義 | 該值描述的內容 |
|---|---|---|
| iss | 發行者 | 發行該 token 的主體 |
| sub | 主體 | 該 token 所描述的主體 |
| aud | 對象群 | 該 token 所針對的服務或接收者 |
| exp | 過期時間 | 該 token 停止可被接受的 NumericDate |
| nbf | Not before | 在此 NumericDate 之前,該 token 必須被拒絕 |
| iat | 發行時間 | 該 token 發行的 NumericDate |
| jti | JWT ID | 用於防止重放攻擊的唯一識別碼 |
對象群聲明可以是單一字串或陣列;該工具會直接呈現 JSON 值,而不會判斷它是否符合你的應用程式。NumericDate 是一種時間戳記慣例,並不代表該 token 目前有效——時間戳記是否可被接受,取決於發行系統、其所設定的時鐘偏移,以及其驗證政策。
解碼不等於驗證
已解碼的 token 是一段資料,而不是一項證據。任何曾經持有該 token 的參與者,都可能以不同的金鑰、更早的過期時間、由攻擊者控制的對象群,或是完全沒有簽章,重新簽署出類似的 token。JWT Decoder 刻意將每次成功解碼標示為未經驗證 (unverified),以免一個方便的檢查步驟被誤認為是安全性檢查——而做出信任決策的正確位置,是發行該 token 之應用程式的身分驗證函式庫。
安全的工作流程:僅從你獲得授權檢視的環境中取得 token;將其貼到 JWT Decoder 中;檢視演算法欄位、標準聲明,以及任何自訂聲明;然後在完成後從輸入欄位中移除該 token。避免將正式環境的憑證貼到共用畫面、問題追蹤系統、聊天訊息、螢幕擷圖,或是第三方線上解碼器中——token 即使不是密碼,也可能包含個人識別碼、租戶資料、權限範圍 (scopes),或其他應用程式詳細資料。
如果你確實需要驗證 token,請在擁有安全性決策的服務內部使用一個有維護的 JWT 函式庫,並在其中驗證演算法、金鑰、發行者、對象群、過期時間範圍,以及任何應用程式特有的需求。JWT Decoder 無法揭示加密 JWE 內部的內容、無法修復一個損壞的 token、無法找到簽章金鑰,也無法告訴你簽章是否正確。
將 JWT 解碼與鄰近工具搭配使用
幾秒鐘的後續工作往往能比單獨的 token 揭露更多資訊:
- Unix Timestamp Converter 可讓你將已解碼的 exp 或 iat 值以 UTC 日期或你所在的當地時區進行檢查,這在本地除錯時對於「這個 token 是否仍然有效」的判斷很有幫助。
- JSON Formatter 能在結構巢狀到單行 JSON 變得難以閱讀時,對其進行美化輸出。