> base64url | jwt | URL 安全 <
// Base64url - 適用於 URL 與檔名的安全 Base64 變體,支援無填充
URL 相容
不使用特殊 URL 字元——適用於查詢參數與路徑。
JWT 標準
廣泛用於 JSON Web Token 與 OAuth 2.0 規範。
可選填充
可省略填充字元 (=),讓 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 的差異
| Base64 | Base64url |
|---|---|
| + | - |
| / | _ |
| = | — |
// 程式碼中的 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 內容是可讀的,請勿在其中放置機密。