如何解碼 Base64 字串(以及 JWT Payload)

Base64 是可逆編碼,並非加密。一步完成解碼,正確處理 Unicode,並讀取使用 Base64url 的 JWT 段落。

Base64 到底是什麼

Base64 把二進位資料對應到 64 個可列印的 ASCII 字元。它完全可逆且不需要金鑰,因此是編碼而非加密 —— 千萬不要拿它來「藏」機密資料。

編碼與解碼

在瀏覽器裡用 btoa 編碼、atob 解碼。對非 ASCII 文字,要走一次 UTF-8 來回,這樣 é、ü、你這些字才不會變成亂碼位元組。

讀取 JWT

JWT 是用點號連起來的三段 Base64url 字串:header、payload、signature。前兩段解碼後就能讀出 claim;signature 是二進位內容,不是給人讀的。

Base64 與 Base64url 的差別

標準 Base64 用 + 與 /,並用 = 填補長度;URL 安全的 Base64url 把它們換成 - 與 _,並省略填補,這樣這個值就可以安全地放進 URL 與 JWT。

解碼並不等於驗證

解碼 JWT 只是讀出 claim,不能證明它是真的。任何人都能偽造一個 payload 寫著 "role":"admin" 的 token;只有用簽發方的金鑰驗過簽章,才能證明 token 為真。永遠不要根據未經驗證的 token 做出信任判斷。

常見的 JWT claim 與意義

iss 是簽發者,sub 是主體(使用者 id),aud 是預期受眾,exp 是逾期時間(Unix 秒),iat 是簽發時間,nbf 是「不早於」時間,jti 是唯一 id。自訂 claim 會與這些並列。永遠在伺服器端而不是只在用戶端檢查 exp 與 aud。

填補與 URL 安全變體

Base64url 常常沒有 = 填補。要在程式中解碼,先用 = 把長度補成 4 的倍數,再把 - 換回 +、_ 換回 /,然後用一般的 Base64 解碼器處理。瀏覽器的 atob 不能直接吃 Base64url —— 必須先轉換過。