Mỗi chỗ đánh đổi giữa hai nguy cơ khác nhau — XSS và CSRF.
localStorage: JS đọc/ghi dễ, tiện gắnAuthorizationheader (nên miễn nhiễm CSRF). Nhưng XSS đọc được → một script chèn vào là mất token. Không nên dùng cho token nhạy cảm.- Cookie
httpOnly+Secure+SameSite: JS không đọc được → chống XSS đánh cắp token. Nhưng cookie tự động gửi kèm request → mở CSRF, cần phòng bằngSameSite=Lax/Strict+ anti-CSRF token cho thao tác đổi trạng thái. - In-memory (biến JS): an toàn nhất trước XSS-lâu-dài (mất khi reload, không nằm trên disk), nhưng mất khi refresh trang → thường ghép với refresh token trong cookie
httpOnlyđể lấy lại access.
Khuyến nghị thực dụng: refresh token trong cookie httpOnly+Secure+SameSite; access token in-memory. Tránh để token dài hạn trong localStorage. Dù chọn gì, vá XSS vẫn là ưu tiên số một — XSS thắng thì mọi cách lưu đều gãy.