Ý chính: Token hợp lệ chỉ cho biết ai đang gọi. Nó không chứng minh người đó được phép thực hiện mọi thao tác.
Thuật ngữ trong bài: Authentication: xác minh danh tính; authorization: kiểm tra quyền; webhook: thông báo do hệ thống khác gửi tới API.
Bài toán thực tế
Khóa API dài hạn có thể bị lộ. Người dùng đã đăng nhập vẫn có thể đổi mã tài nguyên để truy cập dữ liệu khác. Webhook cũng có thể bị giả mạo hoặc phát lại nếu hệ thống chỉ tin vào nội dung nhận được.
Điểm dễ bị bỏ qua
Một token hợp lệ chứng minh danh tính nhưng không chứng minh quyền trên mọi tài nguyên. API phải kiểm tra quyền theo đối tượng, phạm vi và trạng thái hiện tại ở mỗi thao tác nhạy cảm.
Webhook còn cần xác minh chữ ký, thời gian gửi và mã chống phát lại. Tin tưởng kết nối HTTPS hoặc một khóa dùng lâu dài là chưa đủ.
Luồng xử lý
Giới hạn quy mô và abuse→Identity
Issuer và audience→Chính sách
Khách hàng và object access→Audit
Quyết định và vòng đời khóa
Thiết kế và triển khai
Chính sách tập trung, chế độ bắt buộc tại chỗ
Chia sẻ chính sách definition và test, nhưng chế độ bắt buộc ở service sở hữu dữ liệu. Gateway không thể authorize field nó không hiểu.
Ưu tiên danh tính của tiến trình
Dùng machine thông tin xác thực ngắn hạn cấp cho khối lượng công việc thay vì chép secret vĩnh viễn vào môi trường.
Xem webhook là input không tin cậy
Xác minh chữ ký trước khi parse, lưu delivery ID, giới hạn timestamp và xử lý tác động phụ an toàn khi xử lý lặp.
Đi sâu vào thiết kế
Phân quyền phải hiểu dữ liệu
Role name đơn thuần quá thô. Quyết định thường cần khách hàng membership, tài nguyên trách nhiệm sở hữu, record trạng thái và độ nhạy field.
Break-glass là một tính năng sản phẩm
Emergency access cần phê duyệt, thời điểm hết hạn, nguyên nhân, phạm vi hẹp và audit bất biến. Admin bỏ qua kiểm soát không tài liệu sẽ trở thành đường chính sách yếu nhất.
Cách triển khai
- Kiểm tra bên phát hành, đối tượng nhận, thuật toán, thời hạn và trạng thái khóa của mọi token.
- Phân quyền đồng thời theo hành động, khách hàng và tài nguyên tại ranh giới phía máy chủ.
- Ký webhook trên đúng chuỗi byte gốc, kèm thời gian gửi, mã chống phát lại và quy trình xoay bí mật.
Mã minh họa: Xác minh đầy đủ một webhook
signed = timestamp + '.' + rawBody
expected = HMAC(activeSecret, signed)
reject unless constantTimeEqual(signature, expected)
reject if abs(now - timestamp) > 5 minutes
reject if deliveryId already processedKhi xoay bí mật, chấp nhận khóa hiện tại và khóa kế tiếp trong một khoảng ngắn; ghi nhận khóa đã xác minh nhưng không ghi bí mật hay dữ liệu nhạy cảm.
Rủi ro cần tính trước
- Gateway kiểm tra token nhưng dịch vụ bên trong lại tin một header danh tính có thể bị giả mạo.
- Đồng hồ lệch giữa hai hệ thống làm webhook hợp lệ bị từ chối.
- Thông tin xác thực đã thu hồi vẫn được chấp nhận vì cache giữ quá lâu.
Nên theo dõi gì?
| Tín hiệu | Điều tín hiệu cho biết |
|---|---|
| Quyết định từ chối theo từng nguyên nhân chính sách | Phân biệt tấn công, lỗi ứng dụng khách và lỗi hồi quy trong chính sách. |
| Tuổi thông tin xác thực và trạng thái xoay vòng | Phát hiện quyền truy cập tồn tại quá lâu hoặc không còn người phụ trách. |
| Lỗi chữ ký và số lần webhook bị phát lại | Phân biệt lỗi tích hợp thông thường với hành vi lạm dụng chủ động. |
Cách kiểm chứng
- Chạy ma trận user, khách hàng, object và action gồm cả negative case.
- Rotate rồi revoke khóa trong khi lưu lượng vẫn chạy.
- Replay và sửa nội dung dữ liệu webhook có chữ ký, gồm delivery ID trùng.
Đưa vào production từng bước
Kiểm kê thông tin xác thực và các điểm kiểm tra quyền trước. Ghi lại quyết định phân quyền mà chưa đổi kết quả, chuyển từng nhóm API sang chính sách dùng chung, sau đó rút ngắn tuổi token và diễn tập xoay khóa khẩn cấp trước khi bật bắt buộc toàn hệ thống.
Checklist trước khi vận hành
- Service thông tin xác thực có tuổi ngắn và phạm vi cho đúng một khối lượng công việc.
- Xoay vòng khóa hỗ trợ thời gian overlap và revoke ngay.
- Truy cập bị từ chối cùng thay đổi đặc quyền tạo audit sự kiện chống sửa đổi.
Điều cần nhớ
Bảo mật API là quá trình liên tục thu hẹp quyền và kiểm chứng từng thao tác, không phải một cổng đăng nhập đặt ở đầu hệ thống.
