Mã hóa Base64 an toàn cho URL: Nó là gì và tại sao quan trọng
Mã hóa an toàn cho URL Base64 là gì?
Mã hóa an toàn cho URL Base64 (còn gọi là Base64url) là một biến thể của Base64 tiêu chuẩn, thay thế các ký tự có ý nghĩa đặc biệt trong URL và tên tệp bằng các lựa chọn thay thế an toàn. Base64 tiêu chuẩn sử dụng + và / như một phần trong bảng chữ cái 64 ký tự của nó, cộng với = cho phần đệm, và cả ba ký tự này đều gây vấn đề trong URL, chuỗi truy vấn và đường dẫn tệp.
Base64url giải quyết vấn đề này bằng hai phép thay thế đơn giản:
| Base64 tiêu chuẩn | Base64 an toàn cho URL |
|-----------------|-----------------|
| + (dấu cộng) | - (dấu trừ) |
| / (dấu gạch chéo) | _ (dấu gạch dưới) |
| = (đệm) | được bỏ qua (thường là) |
Tại sao Base64 tiêu chuẩn làm hỏng URL
Khi một chuỗi được mã hóa Base64 chứa + hoặc / xuất hiện trong URL, hành vi của trình duyệt và máy chủ trở nên khó đoán.
Vấn đề với +
Trong chuỗi truy vấn URL, ký tự + được hiểu là dấu cách. Hành vi này đến từ đặc tả application/x-www-form-urlencoded và khiến dữ liệu được giải mã chứa các dấu cách bất ngờ.
Ví dụ, một chuỗi Base64 như Pj4+Pz8/Pw== chứa các ký tự +. Nếu chuỗi này xuất hiện trong tham số URL ?token=Pj4+Pz8/Pw==, máy chủ sẽ thấy ?token=Pj4 Pz8/Pw== — dấu + trở thành dấu cách.
Vấn đề với /
Trong đường dẫn URL, ký tự / là dấu phân cách đường dẫn. Một chuỗi Base64 như ab/CD+Ef== chứa dấu / sẽ được hiểu là một cấp thư mục. Nếu chuỗi này xuất hiện trong một phân đoạn URL, cả máy khách và máy chủ đều có thể hiểu sai cấu trúc.
Vấn đề với =
Ký tự = được sử dụng cho các cặp khóa-giá trị trong chuỗi truy vấn. Một dấu = ở cuối trong ?data=SGVsbG8= có thể gây mơ hồ — dấu = đó là một phần của phần đệm Base64 hay là cú pháp tham số truy vấn?
Mặc dù mã hóa phần trăm (percent-encoding) có thể khắc phục các vấn đề này (+ thành %2B, / thành %2F), nó làm phình to độ dài chuỗi và khiến việc gỡ lỗi khó khăn hơn. Base64url là một giải pháp sạch hơn.
Cách Base64url hoạt động
Base64url được định nghĩa chính thức trong RFC 4648 Mục 5. Nó sử dụng chính xác cùng một thuật toán như Base64 tiêu chuẩn — 3 byte trở thành 4 ký tự — nhưng với phép thay thế một ký tự tại vị trí 62 và 63 của bảng chữ cái:
- Chỉ mục bảng chữ cái 62:
+→-(dấu trừ) - Chỉ mục bảng chữ cái 63:
/→_(dấu gạch dưới)
Phần đệm (=) thường bị loại bỏ, vì nó có thể được suy ra từ độ dài chuỗi khi giải mã. Một chuỗi Base64url luôn là một thành phần URL hợp lệ mà không cần thoát bổ sung.
Trước và sau
Đây là cùng một dữ liệu nhị phân trông như thế nào ở cả hai định dạng:
Standard: Pj4+Pz8/Pw==
URL-safe: Pj4-Pz8_Pw
Nơi Base64url được sử dụng
JSON Web Token (JWT)
JWT là người sử dụng Base64url nổi bật nhất. Mỗi JWT bao gồm ba phần — header, payload và chữ ký — mỗi phần được mã hóa Base64 an toàn cho URL và phân tách bằng dấu chấm:
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNqP0m2iTgCjD0
Chú ý các dấu gạch ngang và gạch dưới — không có dấu cộng hay dấu gạch chéo. Nếu JWT sử dụng Base64 tiêu chuẩn, token sẽ bị hỏng khi được truyền dưới dạng tham số URL, đây là cách phổ biến nhất mà chúng được sử dụng trong các ứng dụng web.
OAuth và OpenID Connect
Cả OAuth 2.0 và OpenID Connect đều dựa vào JWT cho token truy cập và token ID, khiến mã hóa Base64url trở nên nền tảng cho xác thực hiện đại. Luồng mã ủy quyền, luồng ngầm (implicit flow) và luồng thông tin xác thực máy khách đều truyền token sử dụng Base64url.
API web và tham số truy vấn
Nhiều API REST và GraphQL chấp nhận dữ liệu được mã hóa Base64 trong tham số truy vấn cho con trỏ phân trang, bộ lọc hoặc payload được mã hóa. Base64url đảm bảo các tham số này hoạt động chính xác mà không cần mã hóa URL bổ sung.
Ví dụ thực tế — phân trang con trỏ API:
GET /api/users?cursor=MjAyNC0wMS0xNVQxMDozMDowMFo
API của GitHub sử dụng đúng mẫu này để phân trang các tập kết quả lớn.
Tên tệp và lưu trữ tệp
Các chuỗi Base64url tạo ra tên tệp an toàn vì chúng không chứa dấu phân cách đường dẫn (/), không có ký tự đặc biệt gây nhầm lẫn cho hệ thống tệp và không có ký tự không hợp lệ trên Windows (:, *, ?, v.v.).
Mạng phân phối nội dung và khóa bộ nhớ đệm
CDN và các lớp lưu trữ đệm thường sử dụng các giá trị được mã hóa Base64url làm khóa bộ nhớ đệm. Base64 tiêu chuẩn với dấu / sẽ tạo ra các phân cấp thư mục giả trong không gian tên bộ nhớ đệm, dẫn đến các khóa mơ hồ.
Chuyển đổi giữa Base64 tiêu chuẩn và Base64url
Việc chuyển đổi giữa hai biến thể này rất đơn giản trong bất kỳ ngôn ngữ nào:
JavaScript
// Standard Base64 to URL-safe Base64
function base64ToBase64url(base64) {
return base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
}
// URL-safe Base64 to Standard Base64
function base64urlToBase64(base64url) {
let result = base64url.replace(/-/g, '+').replace(/_/g, '/');
// Restore padding
while (result.length % 4) {
result += '=';
}
return result;
}
Node.js
Node.js cung cấp hỗ trợ Base64url gốc kể từ phiên bản 15.7.0:
// Encode to Base64url
const encodedUrl = Buffer.from('Hello, world!').toString('base64url');
console.log(encodedUrl);
// Output: SGVsbG8sIHdvcmxkIQ
// Decode from Base64url
const decoded = Buffer.from(encodedUrl, 'base64url').toString('utf-8');
console.log(decoded);
// Output: Hello, world!
Python
import base64
# Encode to Base64url
encoded = base64.urlsafe_b64encode(b"Hello, world!")
print(encoded.decode())
# Output: SGVsbG8sIHdvcmxkIQ==
# Decode from Base64url
decoded = base64.urlsafe_b64decode(encoded)
print(decoded.decode())
# Output: Hello, world!
Khi nào sử dụng Base64 tiêu chuẩn so với Base64url
Sử dụng Base64 tiêu chuẩn khi:
- Mã hóa tệp đính kèm email (tiêu chuẩn MIME yêu cầu điều này)
- Tạo data URL để nhúng HTML/CSS
- Lưu trữ dữ liệu trong cơ sở dữ liệu nơi tính an toàn cho URL không liên quan
- Tương tác với các hệ thống cũ mong đợi Base64 tiêu chuẩn
Sử dụng Base64url khi:
- Tạo hoặc phân tích token JWT
- Truyền dữ liệu được mã hóa trong tham số truy vấn URL hoặc phân đoạn đường dẫn
- Tạo tên tệp từ dữ liệu nhị phân
- Tạo khóa bộ nhớ đệm hoặc định danh
- Làm việc với token OAuth hoặc OpenID Connect
Thử mã hóa an toàn cho URL Base64 trực tuyến
Sử dụng trình mã hóa và giải mã Base64 trực tuyến miễn phí của chúng tôi để chuyển đổi giữa các định dạng Base64 tiêu chuẩn và Base64 an toàn cho URL. Dán dữ liệu của bạn, chọn biến thể và nhận kết quả ngay lập tức.