Appearance
Bảo vệ bước đăng nhập
Trước khi có session hay token, phải có một bước xác minh mật khẩu an toàn — đây là nền móng thường bị bỏ qua khi chỉ tập trung vào OAuth2/JWT.
- Hash mật khẩu, không lưu plaintext: thuật toán khuyến nghị hiện nay là Argon2id (thắng cuộc thi Password Hashing Competition, chống được tấn công bằng GPU/ASIC vì tốn nhiều bộ nhớ để tính).
bcryptvẫn chấp nhận được nhưng Argon2id là lựa chọn mới. Tuyệt đối không tự nghĩ ra cách mã hoá riêng hay dùng hash thường (MD5, SHA-1) cho mật khẩu. - Session fixation — vì sao phải tạo session ID mới sau khi đăng nhập: nếu hệ thống tái sử dụng một session ID đã tồn tại từ trước khi đăng nhập (ví dụ session ID được cấp ngay khi vừa mở trang), kẻ tấn công có thể gài trước một session ID cho nạn nhân (qua link, qua cookie), đợi nạn nhân đăng nhập vào chính session ID đó, rồi dùng session ID đó để chiếm quyền truy cập — đây gọi là session fixation. Cách phòng: luôn tạo session ID mới ngay sau khi đăng nhập thành công (và sau mỗi lần nâng quyền), không giữ lại session ID cũ.
- Rate limiting và account lockout — chống brute-force: nếu endpoint đăng nhập không giới hạn số lần thử, kẻ tấn công có thể dò mật khẩu bằng cách thử hàng loạt (brute-force) hoặc dùng danh sách mật khẩu rò rỉ từ nơi khác (credential stuffing). Cách phòng phổ biến: giới hạn số lần thử sai trong một khoảng thời gian (ví dụ tối đa 10 lần/15 phút cho một tài khoản hoặc một IP), khoá tạm thời tài khoản sau nhiều lần sai liên tiếp.
- Thời gian sống của session: nên có cả idle timeout (tự đăng xuất nếu không hoạt động, ví dụ 15 phút) và absolute timeout (bắt buộc đăng nhập lại sau một mốc cố định, ví dụ 8 giờ, dù vẫn đang hoạt động) — chỉ đặt
Max-Agecho cookie là chưa đủ nếu không có chiến lược timeout rõ ràng.