1.2 KiB
1.2 KiB
ADR 0002: Session-based authentication with HttpOnly cookies
Status
Accepted — 2026-06-26
Context
Phase 1 requires secure user authentication without binding to external identity providers. The web app (Next.js) and API (NestJS) run on different origins in development (localhost:3000 / localhost:3001) but share credentials via CORS.
Decision
- Use opaque session tokens (32 random bytes), stored as SHA-256 hash in
UserSession. - Deliver sessions via HttpOnly cookie
hgc_sessionwithSameSite=laxandSecurein production. - Password hashing with Argon2id via
@node-rs/argon2. - TOTP 2FA with
otplib; recovery codes stored hashed. - Login challenges for 2FA stored in Redis (5 min TTL).
- Transactional emails via BullMQ
notificationsqueue processed by worker + SMTP.
Consequences
- Browser clients must use
credentials: 'include'. - API CORS must allow
APP_URLwith credentials. - Session revocation is immediate via DB
revokedAt. - No JWT in localStorage (reduces XSS token theft risk).
Alternatives considered
- JWT in Authorization header — rejected for Phase 1 due to refresh complexity and XSS exposure in SPA storage.
- External auth (Auth0, Clerk) — rejected per product requirements.