編碼 | 解碼 | 壓縮

> base64url | jwt | URL 安全 <

// Base64url - 適用於 URL 與檔名的安全 Base64 變體,支援無填充

[URL-SAFE]

URL 相容

不使用特殊 URL 字元——適用於查詢參數與路徑。

[JWT]

JWT 標準

廣泛用於 JSON Web Token 與 OAuth 2.0 規範。

[NO-PADDING]

可選填充

可省略填充字元 (=),讓 URL 更精簡。

>> 技術資訊

Base64url 的運作原理:

Base64url 是 Base64 的一種變體,將「+」替換為「-」、將「/」替換為「_」,因此可安全用於 URL 與檔名。填充字元「=」通常會被省略,因為它可能在 URL 中造成問題。

比較範例:

Base64: SGVsbG8+Pw== Base64url: SGVsbG8-Pw

為什麼要使用 Base64url:

  • >JWT 權杖
  • >OAuth 2.0 流程
  • >URL 查詢參數
  • >檔名編碼
  • >Web API 簽章

>> 常見問題

什麼是 Base64url?

Base64url 是一種適用於 URL 與檔名的安全 Base64 編碼變體。它將「+」替換成「-」、將「/」替換成「_」,並可選擇移除填充「=」字元,以避免 URL 編碼問題。

為什麼不能在 URL 中直接使用一般 Base64?

一般 Base64 使用「+」「/」「=」等在 URL 中具有特殊意義的字元。「+」可能被解讀為空白,「/」是路徑分隔符號,「=」則用於參數指定,容易造成解析錯誤。

Base64url 通常用在什麼地方?

Base64url 廣泛用於 JWT(JSON Web Token)、OAuth 2.0 授權碼、SAML 斷言,以及任何需要在 URL 或 HTTP 標頭中傳遞二進位資料的 API。

Base64url 是否一定要使用填充?

不一定。許多實作會省略填充,因為可以根據長度推算。JWT 規範特別要求不使用填充,以獲得更精簡的 URL。

// 與 Base64 的差異

Base64Base64url
+-
/_
=—

// 程式碼中的 Base64url

JavaScript   btoa(s).replace(/\+/g,'-').replace(/\//g,'_').replace(/=+$/,'')
Node.js      Buffer.from(s).toString('base64url')
Python       base64.urlsafe_b64encode(b).rstrip(b'=')
Go           base64.RawURLEncoding.EncodeToString(b)
Padding      s + '=' * (-len(s) % 4)

>> 更多問題

問:為什麼 Base64url 省略「=」?

答:填充可由長度推算,而「=」在 URL 與查詢字串中有特殊意義。因此 JWT(RFC 7515)和許多 API 採用無填充的 Base64url。

問:解碼前如何補回填充?

答:看長度除以 4 的餘數:餘 2 補 ==,餘 3 補 =,餘 0 不補;餘 1 永遠無效。同時把 - 換回 +,_ 換回 /。

問:Base64url 是加密嗎?

答:不是,它只是編碼,任何人都能還原。JWT 的 payload 內容是可讀的,請勿在其中放置機密。

其他語言