0005 — Rate limiting: janela fixa in-memory¶
Status: Aprovado · Responsável: Gustavo Madruga · Atualizado em: 2026-06-30 · Decidido em: 2026-04-01
Contexto¶
Os endpoints de autenticação são públicos e precisam de uma defesa básica contra abuso/força bruta, sem adicionar infraestrutura.
Decisão¶
RateLimiter com contador por IP em memória (ConcurrentHashMap +
AtomicInteger), reset de todos os contadores a cada 60 s (@Scheduled).
Limite: 60 req/min por IP; acima disso, 429 com Retry-After: 60. O IP real
vem de X-Real-IP/X-Forwarded-For (atrás do Traefik).
Consequências¶
- Zero dependência externa; suficiente para o volume atual (< 100 usuários por cliente) numa única instância.
- In-memory e single-instance: não persiste entre restarts nem é compartilhado. Escalar horizontalmente tornaria o limite por-instância — exigiria estado compartilhado (ex. Redis).
- Janela fixa permite uma rajada na virada de janela (até ~120 req em ~1 s) — aceito como tradeoff.
Alternativas consideradas¶
- Redis + sliding window: over-engineering para o volume atual. Descartado.
- Micronaut RateLimiter: indisponível sem configuração adicional complexa. Descartado.