Most Keycloak programs spend too much design energy on protocol checklists and too little on failure boundaries. OIDC and SAML support are mature. The expensive outages usually show up somewhere else: one realm model that grew without tenancy discipline, one cluster where cache invalidation behavior was treated as magic, or one reverse-proxy setup that quietly broke trust assumptions.
That is why this architecture note focuses on three boundaries that actually move reliability.
As of 2026-03-23 UTC, the upstream keycloak/keycloak repository reports 33,485 stars, 8,163 forks, 2,583 open issues, and latest push activity at 2026-03-23T00:27:32Z.[1] The project’s public release track and ecosystem scale are not the risk center; production design choices are.
Boundary 1: realm design is your tenancy and blast-radius contract
Keycloak gives teams a lot of flexibility: realms, clients, roles, identity providers, and protocol mappers can represent many tenancy shapes.[2] Flexibility is useful, but it also creates the first architectural fork:
- put many business domains into one realm and optimize for initial speed, or
- split realms by trust boundary and accept higher governance overhead.
Teams that over-consolidate realms usually pay later during incident response. Configuration drift, role namespace collisions, and emergency policy changes become harder to isolate. Teams that over-fragment realms pay in operational duplication and integration complexity. Neither extreme is free.
The practical architecture decision is not “single realm vs many realms” as a purity argument. It is where your authentication blast radius should stop during a bad deploy or identity-provider outage. If that answer is unclear, the realm model is still under-specified.
Boundary 2: cache topology decides whether your cluster fails gracefully or noisily
Keycloak’s cache model is explicit and operationally meaningful. The distributed-caching guide documents a mixed topology: local caches for persisted realm/user/authorization data, distributed caches for sessions and authentication flows, and a replicated work cache for invalidation messages across nodes.[3]
Key defaults matter here:
- Local
realms,users, andauthorizationcaches default to 10,000 entries each. - Local
keyscache defaults to 1,000 entries and about 1 hour expiry. - Session-heavy paths (
sessions,clientSessions,offlineSessions,authenticationSessions) rely on distributed behavior.[3]
This is where many deployments mis-price risk. Local cache tuning gets treated as a memory tweak, when it is actually a latency and consistency lever. If local caches are undersized, database round-trips rise and latency tails widen. If invalidation pathways are poorly understood, multi-node behavior becomes unpredictable under write-heavy admin changes.
In other words: if realm design defines blast radius, cache design defines whether the radius propagates cleanly.
Boundary 3: reverse-proxy trust configuration is a security control, not just routing
Keycloak’s reverse-proxy guide is blunt on this point. Runtime defaults and header parsing choices can directly alter security posture.[4]
Operational anchors from the docs:
- Public auth/admin traffic typically goes through 8443 (or 8080 when HTTP is explicitly enabled).
- Management endpoints run on 9000 and should not be exposed through internet-facing proxy paths.
--proxy-headersbehavior (forwardedvsxforwarded) must match actual proxy behavior; mismatch can produce 403 failures at best and spoofable client-origin interpretation at worst.[4]
This boundary is often delegated to platform ingress defaults, then revisited only after incident tickets. That is backwards. Header trust and termination mode belong in the same architecture review as token lifetime and session strategy.
The quiet boundary most teams still miss: database mode and upgrade discipline
The database guide still states the same foundational rule: the default dev-file database is for development use and must be replaced for production.[5] That sounds obvious, but production regressions still trace back to “temporary” defaults surviving too long in non-prod paths that later became critical.
The same guide also keeps an explicit tested-version matrix (for example, PostgreSQL through version 18 in current docs), which is a better planning baseline than ad-hoc compatibility assumptions.[5]
Add one more operational check: tie deployment changes to rolling-update compatibility checks and planned maintenance windows, instead of discovering incompatibility during a hot fix.[2]
A deployment shape that works in practice
For teams moving from pilot to shared production:
- Lock realm boundaries to incident domains, not org chart labels.
- Size and monitor caches with explicit DB round-trip SLOs.
- Treat reverse-proxy header policy as a signed security decision.
- Move off
dev-fileearly and pin supported DB versions. - Rehearse upgrade and rollback paths before feature growth.
This sequence is boring by design, which is exactly why it works.
One falsifier and one watchlist
Falsifier for this architecture note: if your environment is truly small, single-tenant, low-concurrency, and can tolerate full-service restarts with limited blast radius, a deeply optimized Keycloak multi-node architecture may be unnecessary overhead right now.
Watchlist for teams running Keycloak in 2026:
- Realm count and policy variance trend (early signal for governance debt).
- Cache hit/miss and DB latency correlation during auth peaks.
- Proxy/header misconfiguration incidents around origin checks and client IP trust.
- Upgrade cadence against supported DB and runtime boundaries.
Bottom line
Keycloak is rarely hard because of standards support. It is hard when architecture boundaries are left implicit. Realm partitioning, cache topology, and reverse-proxy trust are the three levers that decide whether your IAM layer behaves like a stable control plane or a recurring incident generator.
Sources
- GitHub API —
keycloak/keycloakrepository metadata (stars, forks, open issues, push activity) - Keycloak guides index and server/operator references (configuration, production, rolling-update checks)
- Keycloak docs — distributed cache architecture and defaults (
cache-ispn.xml, cache types, default limits) - Keycloak docs — reverse proxy and header trust model (
proxy-headers, ports 8443/8080/9000) - Keycloak docs — database configuration and production baseline (
dev-filescope, supported DB matrix) - Wikipedia — Keycloak project timeline and CNCF donation context (secondary context source)