BFF là một backend nhỏ đi kèm SPA, đóng vai trò confidential client: nó chạy toàn bộ luồng OAuth, giữ access/refresh token phía server, và chỉ trả về cho trình duyệt một cookie phiên HttpOnly.
Mọi lời gọi API đi qua BFF, BFF gắn Authorization: Bearer giúp.
Browser --(cookie HttpOnly, SameSite=Lax)--> BFF --(Bearer token)--> APILý do khuyến nghị: mọi chỗ lưu token trong trình duyệt đều đọc được bằng JavaScript ở mức nào đó. localStorage bị XSS lấy trực tiếp; kể cả biến in-memory thì script chạy cùng origin vẫn moi được. Với BFF, XSS chỉ có thể gửi request thay user trong lúc phiên còn sống, chứ không trích xuất được token để dùng ở nơi khác — thiệt hại bị đóng khung lại.
Đánh đổi phải nói ra khi phỏng vấn:
- Dùng cookie thì phải xử lý CSRF (
SameSite=Lax/Strict, thêm CSRF token cho request đổi trạng thái). - BFF là thành phần có trạng thái cần scale, và trở thành một hop thêm về độ trễ.
- Ràng SPA vào chính domain của BFF; kiến trúc nhiều frontend dùng chung một API sẽ phức tạp hơn.
RFC 9700 xếp BFF là lựa chọn ưu tiên cho browser-based app; nếu không dùng BFF thì bắt buộc Authorization Code + PKCE, access token ngắn hạn, refresh token có rotation.