Authentication
6#01 Implicit Flow for a single-page app
#implicit-flow-in-spaProblem
Returning an access token directly in the URL fragment via response_type=token or id_token token.
Cost
Tokens leak via browser history, referer headers, analytics scripts, and bookmarks. OAuth 2.1 removed this for a reason.
Fix
Authorization Code + PKCE. Every modern SPA framework + IdP supports it.
#02 Resource Owner Password Credentials grant as the default
#ropc-as-defaultProblem
Client collects the user's username + password directly and exchanges them at /token with grant_type=password.
Cost
Defeats the entire point of OAuth — the third-party app now has the password. Bypasses MFA. Removed in OAuth 2.1.
Fix
Authorization Code + PKCE. ROPC was always a migration-only crutch.
#03 Push MFA without number-matching
#push-mfa-without-number-matchingProblem
Tap-to-approve push notifications without showing a number the user must verify in the originating app.
Cost
MFA fatigue: attackers spam push prompts until a tired user taps approve. The pattern that compromised Uber, Cisco, MGM.
Fix
Number-matching is now a feature in every major MFA platform (Microsoft Authenticator, Okta Verify, Duo Push). Turn it on for privileged users at minimum.
#04 SMS MFA on admin accounts
#sms-mfa-on-admin-accountsProblem
SMS as the second factor for accounts with privileged access.
Cost
SIM swap attacks. NIST 800-63B has discouraged SMS OTP since 2017; modern guidance explicitly requires phishing-resistant factors for privileged users.
Fix
FIDO2 / passkeys / hardware security keys for any privileged user. SMS is acceptable for low-risk consumer accounts only.
#06 Strong password policy without compromised-password screening
#password-policy-without-screenProblem
Enforcing 16-character minimums and complexity rules but not checking against breach corpora.
Cost
Users pick strong-looking passwords that were leaked in a prior breach — credential stuffing still works.
Fix
Screen against HIBP Pwned Passwords (or equivalent) at password-set time. Modern IdPs offer this as a toggle.