ADR 0004 — Cofre de sessão no localStorage
Status
Aceito.
Contexto
A SPA precisa sobreviver a F5 sem re-login, mas gravar JWT em claro no localStorage aumenta o impacto de XSS.
Decisão
Persistir a sessão via sessionVault: payload cifrado no browser, chave derivada de VITE_SESSION_VAULT_SECRET (≥16 caracteres). Sem a variável, há fallback inseguro e um console.warn em produção.
Interceptor global de fetch trata 401 autenticado como sessão expirada.
Consequências
- XSS ainda é crítico (a chave também está no bundle)
- Rotação do secret invalida sessões locais (aceitável)
- Não substitui httpOnly cookies no backend; é mitigação no cliente