Login and admin events are recorded
Events are the only record of who logged in and who changed the realm. Turned off, an incident has no timeline and a malicious admin change leaves no trace at all.
The bound browser flow can ask for a second factor
A browser flow with no OTP or WebAuthn step means every account in the realm is exactly one password away, however strong the OTP policy is.
Brute force detection is enabled and reacts early
Without brute force detection a Keycloak realm answers password guesses as fast as it can serve them, and the only trace is in the login events nobody reads.
An email address identifies at most one account
Duplicate emails plus login-with-email is an ambiguous identity: password reset and broker account linking then act on whichever account they happen to find first.
The audited realm is actually in use
A disabled realm answers no login, so its findings are not incidents — but a realm left disabled next to a live one is usually a forgotten migration, and it still holds the users, clients and secrets that become exposure the day someone re-enables it.
Offline tokens expire
An offline token with no max lifespan never expires — it is a permanent credential handed to whoever asked for offline_access, and it survives every password change.
The OTP policy is strong enough to be worth having
A 4-digit OTP is 10 000 guesses; with brute force detection tuned for passwords, that is a plausible online attack.
A password policy is set, with a modern hash
A realm with no password policy accepts a one-character password. The hash settings matter just as much: an offline crack of a weak PBKDF2 iteration count is arithmetic, not research.
Refresh tokens are rotated and single-use
Without rotation a leaked refresh token is a renewable credential nobody can distinguish from the real client; with rotation, a replay invalidates the chain and shows up.
Self-registration does not create unverified identities
Open registration without email verification lets anyone create an account with someone else's address — which is also the account an identity broker will happily link to later.
SSO sessions expire in a working day, not a season
The SSO session is what silently re-issues tokens: a session that idles for weeks turns one browser compromise into standing access.
HTTPS is required for every request to the realm
With sslRequired=external Keycloak still serves and accepts plaintext HTTP from private addresses, so tokens and codes travel in the clear over any internal hop — a reverse proxy, a service mesh sidecar, a developer's tunnel. With none it accepts plaintext from anywhere.
Access tokens are short-lived
Keycloak cannot revoke an issued access token: it is valid until it expires, whatever happens to the session behind it. The lifespan is the window an attacker keeps a stolen token.