Xác thực và phân quyền khác nhau như thế nào?
Đáp án mẫu
Xác thực (authentication, authn) trả lời câu hỏi "bạn là ai?". Nó kiểm tra danh tính bằng mật khẩu, mã dùng một lần, passkey hoặc token. Phân quyền (authorization, authz) trả lời câu hỏi "bạn được phép làm gì?". Nó quyết định danh tính đó có được thực hiện một hành động trên một tài nguyên hay không.
Xác thực luôn đến trước, vì quyền gắn với một danh tính. Hãy hình dung ở sân bay: kiểm tra hộ chiếu chứng minh bạn là ai, còn thẻ lên máy bay quyết định bạn được vào chuyến nào.
request -> authenticate (who?) -> authorize (may they?) -> handler
| |
401 if missing 403 if forbidden
Trong backend, xác thực thường diễn ra một lần cho mỗi request ở middleware và tạo ra danh tính người dùng. Phân quyền phải diễn ra với từng hành động và từng đối tượng, ví dụ "user này có được sửa hóa đơn 42 không?". Qua được bước này không có nghĩa là qua được bước kia: người đã đăng nhập không được đọc mọi thứ.
Điều cần nhớ: xác minh danh tính một lần, rồi kiểm tra quyền ở mọi lần truy cập tài nguyên.
Ý chính
- Xác thực chứng minh danh tính, phân quyền cấp quyền
- Xác thực đến trước
- Phân quyền kiểm tra theo từng hành động và từng đối tượng
- Lỗi thường gặp là 401 và 403
Câu hỏi nối tiếp thường gặp
- Khi nào trả 401 và khi nào trả 403?
- Bạn đặt từng bước kiểm tra ở đâu trong pipeline xử lý request?
Lỗi thường gặp
- Cho rằng người đã đăng nhập có thể truy cập mọi tài nguyên
- Chỉ kiểm tra quyền ở UI thay vì ở API