Base64 與 URL 編碼都是「讓資料能安全地以文字傳遞」的工具,所以很容易搞混。但它們解決的是不同問題。以下說明差別。
Base64:二進位 → 文字
Base64 把任何二進位資料(圖片、檔案、原始位元組)變成純 ASCII 的字母、數字、+、/、=。它會讓資料變大約 33%,而且不是加密——誰都能解回來。當只能走純文字的通道卻要帶二進位時使用:
- 把圖片以
data:URI 嵌進 HTML/CSS - 電子郵件附件(MIME)
- 把小型二進位塞進 JSON 或權杖
延伸見 Base64 是加密嗎?(劇透:不是)。
URL 編碼:讓文字能安全放進網址
URL 編碼(又稱百分比編碼)把在網址裡有特殊意義或不允許的字元換成 %XX——空格變 %20、& 變 %26,以此類推。當要把文字放進以下位置時使用:
- 查詢字串(
?q=hello%20world) - 路徑片段
- 表單送出
細節見 URL 編碼指南。
一眼看懂差異
- 目的:Base64 = 用文字帶二進位 · URL 編碼 = 讓文字能安全放進網址。
- 輸出:Base64 = A–Z a–z 0–9 + / = · URL 編碼 = 原文字加上
%XX轉義。 - 大小:Base64 ≈ +33% · URL 編碼只讓被轉義的字元變長。
兩者常搭配使用
Base64 字串可能含 +、/、=,這些在網址裡不安全——所以若要把 Base64 放進網址,要嘛再做 URL 編碼,要嘛用 Base64URL(用 - 和 _ 的網址安全變體)。
兩個都試試(本機)
- Base64 編解碼——二進位/文字 ⇄ Base64。
- URL 編解碼——把文字做百分比編碼給網址用。
原則:Base64 用來以文字承載二進位;URL 編碼用來把文字安全放進連結。
實際範例
拿文字 a b&c 來看,兩種編碼的處理方式完全不同:
輸入: a b&c
URL 編碼: a%20b%26c
Base64 編碼: YSBiJmM=
URL 編碼不動英文字母,只把空格與 & 轉義,所以結果還看得懂。Base64 則把每一個位元組改寫進它自己的字母表(每 3 個位元組換成 4 個字元),輸出跟原文完全不像——但它現在能通過只容許少數安全字元的通道。任務不同,輸出自然不同。
常見誤用
- 用 Base64 來「藏」資料:它一步就能還原,什麼都保護不了——請把它當信封,不是鎖。見 Base64 是加密嗎?
- 對整條網址做 URL 編碼:只該編碼各部分(查詢值、路徑片段),不是整個網址,否則
https://會變成https%3A%2F%2F,連結就壞了。 - 重複編碼:對已編碼的值再編一次會得到
%2520(連%本身都被轉義了)。若空格是以%2520而非%20抵達,就表示被編了兩次。 - 忘了 Base64 的
+與/:純 Base64 在網址裡並不安全;放進網址時請用 Base64URL,或把整串再做一次 URL 編碼。
各自出現在哪裡
- Base64 出現在任何要用文字承載二進位的地方:
data:URI、電子郵件的 MIME 區段、JWT 的各段,以及硬塞進 JSON 的二進位欄位。 - URL 編碼 出現在任何要把文字放進網址的地方:查詢字串、表單送出(
application/x-www-form-urlencoded),以及含空格或非 ASCII 字元的路徑片段。
常見問題
可以用 Base64 取代 URL 編碼嗎?
不行——兩者不能互換。Base64 讓二進位變成文字安全;URL 編碼讓文字變成網址安全。把純 Base64 直接放進網址,仍可能因為 +、/、= 而出錯。
為什麼我的 Base64 結尾是 =?
那是填補字元,用來把輸出長度補到 4 的倍數。這很正常,某些網址安全變體會省略它。
這兩種能讓資料變安全嗎?
不能。編碼講的是格式,不是保密——任何人都能還原。要保密得用加密;要防竄改得用雜湊或簽章。