Không kéo dài tuổi thọ của cookie phiên thường. Cách chuẩn là tách làm hai token:
- Session cookie — ngắn (vài chục phút tới vài giờ), là thứ dùng cho mọi request.
- Remember-me token — dài (14–30 ngày), chỉ dùng một lần để tạo lại phiên khi session hết hạn.
Cách lưu remember-me token (mô hình selector/validator):
sql
create table remember_tokens (
selector text primary key, -- lookup key, sent in clear
validator_hash text not null, -- SHA-256 of the secret half
user_id uuid not null,
expires_at timestamptz not null
);
-- cookie value = selector + ':' + validatorTra bằng selector (có index), rồi so validator bằng hàm so sánh constant-time. Tách hai nửa như vậy tránh việc phải tra cứu bằng chính giá trị bí mật, và DB không giữ token thô.
Các quy tắc kèm theo:
- Xoay token sau mỗi lần dùng — dùng xong thì xoá hàng cũ, phát hàng mới; token cũ tái xuất hiện là dấu hiệu bị đánh cắp.
- Cookie phải
HttpOnly; Secure; SameSite=Lax. - Đổi mật khẩu / đăng xuất mọi thiết bị phải xoá hết remember token của user.
- Phiên khôi phục từ remember-me chỉ nên được coi là đã xác thực ở mức thấp: các thao tác nhạy cảm (đổi mật khẩu, đổi email, thanh toán) phải yêu cầu nhập lại mật khẩu.
- Không nhét username/password hay bất kỳ dữ liệu tự giải mã được nào vào cookie.