The same ADR, reviewed by five. Compare what the larger board found.
All reviewers agree the single-node Redis design introduces an unacceptable availability risk on the authentication hot path and lacks production-grade hardening for security, observability, and data durability. While moving sessions to Redis improves revocation capability, the current proposal would create catastrophic outage exposure and authorization stalemate without remediation.
The single-node ElastiCache instance on the auth hot path means any node failure or maintenance event causes a total platform outage for all authenticated users. The team must remove this SPOF before release.
Raised by Principal Software Architect
Storing sessions solely by opaque session_id prevents revoking all sessions for a compromised user_id without a blocking full-keyspace SCAN, undermining the stated theft-response goal.
Raised by Principal Software Architect
Caching roles inside a 14-day sliding session creates a distributed stale-authorization problem: revoked permissions remain valid until the session expires or is manually deleted.
Raised by Principal Software Architect
During dual-read migration, a session deleted in Redis can still be accepted via the legacy cookie fallback, allowing revoked or stolen sessions to persist undetected.
Raised by Data and Analytics Reviewer
Unthrottled TTL refreshes on every request generate unnecessary write load, and the absence of persistence, encryption-at-rest, and eviction policies threatens session integrity.
Raised by Data and Analytics Reviewer
This is an architecture decision for moving user sessions to Redis, a fast data store. The reviewers concluded that the current design is not safe for release because one Redis failure could log out or block all authenticated users, and other security and operating controls are missing.
A score of 35/100 means the document has serious problems that make the proposed design unsafe for production. The low score reflects major gaps in reliability, security, monitoring, and operating plans.
Status: Proposed
Date: 2026-07-28
Deciders: Platform team
Supersedes: ADR-006 (stateless signed-cookie sessions)
Our web tier is stateless today. Session data lives in a signed cookie
(HMAC-SHA256, 4KB ceiling). Two constraints have made this uncomfortable:
from the browser limit, and every request carries it on the wire.
copied cookie stays valid until its 14-day expiry. Support has escalated
this twice after laptop-theft reports from enterprise customers.
We evaluated three options.
Option A — Keep signed cookies, shrink the payload. Move everything except
user_id and issued_at into a per-request
database lookup. Cheapest change,
but adds a DB round trip to every authenticated request (~4,000 rps peak) and
does not solve revocation.
Option B — Redis-backed sessions. Cookie carries only an opaque session id.
Session body lives in Redis with a 14-day TTL. Revocation is a
DEL. Adds an
external dependency to the auth path.
Option C — Database-backed sessions. Same shape as B, but Postgres instead
of Redis. Reuses infrastructure we already operate and back up. Higher latency
(~6ms vs ~0.4ms measured on a spike) and adds write load to the primary.
Adopt Option B. A single ElastiCache Redis node in
us-east-1, cache.r6g.large,
with the session body serialised as JSON.
Revocation is the requirement that actually forced this, and B is the only
option that makes it a constant-time operation. Latency matters on the auth
path and Redis is an order of magnitude faster than Postgres for this access
pattern. We already run Redis for the rate limiter, so the operational surface
is not new to the team.
authenticate. We accept this.
by roughly 12%.
on the rate limiter's observed behaviour.
cookie-carried sessions are rejected.
user_id, org_id,
roles, impersonator_id when an
admin is acting as a customer, and a csrf_token.
Week 1: dual-write, read from cookie. Week 2: dual-write, read from Redis with
cookie fallback. Week 3: Redis only. Week 5: remove cookie-session code path.
replica roughly doubles cost and the team has not operated Redis replication
before.
roles live in the session at all, or be
re-fetched per request so a
permission change takes effect immediately?