SPA nên dùng Authorization Code flow + PKCE — không dùng Implicit flow (đã lỗi thời, để lộ token trên URL).
PKCE (RFC 7636) chống chặn/inject authorization code:
1. Client sinh code_verifier ngẫu nhiên.
2. Hash ra code_challenge, gửi kèm khi redirect tới authorization server.
3. Server trả về authorization code.
4. Client đổi code lấy token, phải kèm code_verifier gốc.
5. Server kiểm code_verifier khớp code_challenge.
→ Kẻ chặn được authorization code cũng không đổi được token vì thiếu code_verifier. Thêm tham số state để chống CSRF trên bước redirect.