Pular para conteúdo

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.