HTTP Basic Authentication là một trong những cách lâu đời và đơn giản nhất để bảo vệ một tài nguyên bằng mật khẩu: trình duyệt yêu cầu tên đăng nhập và mật khẩu, rồi gửi cả hai kèm theo mỗi request đến server. Chính sự đơn giản này lại là điểm yếu lớn nhất của nó.
Header Authorization được tạo ra như thế nào
Tên đăng nhập và mật khẩu được nối lại bằng dấu hai chấm (username:password), sau đó toàn bộ chuỗi được mã hóa Base64 và đặt vào header Authorization: Basic <chuỗi_đã_mã_hóa>. Trình duyệt tự động gửi lại header này ở mọi request tiếp theo sau lần đăng nhập thành công đầu tiên.
Vì sao Base64 không phải là bảo mật
Base64 là một cách mã hóa (encoding), không phải mã hóa bảo mật (encryption): bất kỳ ai cũng có thể giải mã chuỗi này ngược trở lại username:password chỉ trong vài giây, không cần bất kỳ khóa nào. Nếu request bị chặn — chẳng hạn qua mạng Wi-Fi công cộng không bảo mật — thông tin đăng nhập sẽ lộ ra ngay lập tức.
Dấu thanh tiếng Việt và kích thước chuỗi Base64
Base64 mã hóa byte chứ không phải ký tự, nên cách mã hóa của chuỗi gốc rất quan trọng. Một ký tự Latin thường chỉ chiếm 1 byte trong UTF-8, nhưng các ký tự tiếng Việt có dấu như ệ, ữ, ộ, ắ — kết hợp cả dấu phụ và thanh điệu — thường chiếm 2 byte mỗi ký tự khi ở dạng precomposed. Vì vậy một mật khẩu như MậtKhẩu123 sẽ cho ra một chuỗi Base64 dài hơn đáng kể so với một mật khẩu thuần ASCII có cùng số ký tự. Trước RFC 7617 (2015), đặc tả gốc của Basic Auth thậm chí không quy định bảng mã ký tự cho username/password, khiến các client HTTP khác nhau có thể diễn giải ký tự có dấu theo những cách không nhất quán.
Dùng để làm gì
- Nhanh chóng bảo vệ bằng mật khẩu một server staging hoặc công cụ nội bộ trong quá trình phát triển.
- Tạo đúng header Authorization để test API thủ công bằng curl hoặc Postman.
- Hiểu vì sao dùng Basic Auth qua HTTP thường (không có HTTPS) bị coi là lỗ hổng bảo mật nghiêm trọng.
Basic Auth không có cơ chế đăng xuất tích hợp sẵn
Trình duyệt lưu cache thông tin đăng nhập và tự động gắn header Authorization vào mọi request tiếp theo đến cùng origin cho đến khi tab được đóng — bản thân giao thức không hề có nút "đăng xuất" tiêu chuẩn. Để buộc người dùng đăng xuất, server thường dùng mẹo: cố tình trả về 401 với giá trị realm khác, hoặc trông chờ người dùng tự đóng hết các tab trình duyệt.