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

how to decode jwt token in python
在 Python 與瀏覽器中解碼 JWT

如何在 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

  1. 從 token 所在的任何地方複製精簡 JWT——例如 localStorage 中的值、伺服器日誌中的一行、curl 回應標頭、除錯輸出,或請求檢查器——並確認它確實是 header.payload.signature 的形式。JWT Decoder 會拒絕任何無法剛好切分為三個以句點分隔區段的內容。
  2. 在瀏覽器中開啟 JWT Decoder。由於該頁面完全在用戶端執行,不會發生上傳、不會擷取簽章金鑰,也不需要帳號;頁面載入完成的瞬間即可開始輸入。
  3. 將 token 貼到輸入欄位中。該頁面會去除前後空白、在句點上切割、依據 URL-safe Base64 字元集驗證每個區段、將前兩個區段解碼為 UTF-8 JSON,並呈現出所有存在的標準聲明。第三個區段僅進行結構檢查,絕不會被解讀為一組成功的簽章。
  4. 選擇 Decode JWT。輸入欄位下方會出現兩個標示清楚的區塊——標頭與負載——以及該 token 所包含的 RFC 7519 註冊聲明:發行者、主體、對象群、過期時間、not-before 時間、發行時間,以及 JWT ID。
  5. 將解碼結果視為未經驗證的資訊。一個可讀的負載可能是偽造的、已過期的、發給不同對象群的,或是以你不信任的金鑰簽署的。每當問題在於某個工作階段 (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
nbfNot before在此 NumericDate 之前,該 token 必須被拒絕
iat發行時間該 token 發行的 NumericDate
jtiJWT 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 變得難以閱讀時,對其進行美化輸出。

相關閱讀:Generate a JWT Token With a Secret Key Online (HS256)。