PKCE bắt buộc cho SPA/mobile (không có client secret); token để đúng chỗ (memory + httpOnly cookie); BFF pattern là gold standard cho SPA vì server giữ token hoàn toàn.
- PKCE (Proof Key for Code Exchange) — bắt buộc cho public client: app tạo
code_verifier(random 43–128 ký tự), tínhcode_challenge = base64url(sha256(code_verifier)), gửi challenge trong authorization request; khi đổi code lấy token, gửi verifier; server verifysha256(verifier) === challenge— chặn authorization code interception. - State parameter — chuỗi ngẫu nhiên trong authorization request, verify sau redirect — chặn CSRF trên OAuth flow.
- Token storage SPA — access token trong memory, refresh token trong httpOnly cookie, không dùng localStorage — chi tiết ở câu JWT vs Session.
- BFF (Backend For Frontend) — SPA gọi BFF server, BFF thực hiện OAuth flow và giữ token server-side — SPA không bao giờ chạm vào token.
- Scope limitation — chỉ request scope cần thiết (least privilege); prompt xin ít quyền hơn → consent rate cao hơn.
- Sender-constrained tokens — DPoP (RFC 9449) ràng buộc token với key pair của client qua proof JWT mỗi request; mTLS (RFC 8705) ràng buộc token với client certificate — token bị đánh cắp không dùng được ở nơi khác.
- Lưu ý — validate
redirect_uritheo exact match: partial match cho phép attacker chuyển token đến subdomain độc hại.