features/security/ratelimit

Rate limit per IP

Sliding window 10 richieste/ora + 30 richieste/24h per indirizzo IP.

Implementato con @upstash/ratelimit + @upstash/redis su Vercel KV. Due finestre indipendenti: 10 richieste/ora (per tagliare picchi improvvisi) e 30 richieste/24h (per tagliare drip persistenti). Entrambe sliding-window, non reset a mezzanotte.

Quando un IP supera uno dei due limiti, la route risponde 429 con header Retry-After che indica i secondi da attendere. Il client mostra un messaggio sotto la chatbox ("troppo veloce, riprova tra N minuti") e disabilita l'invio fino allo scadere.

Fail-open in dev: se le env vars KV non sono settate, il rate limit è disabilitato. Fail-closed in prod: senza KV configurato, il sito continua a girare ma avvisa nei log. I limiti sono modificabili in lib/ratelimit.ts.