Vibecoding
Como configurar rate limit pra proteger seu app
Sem rate limit, uma pessoa mal-intencionada faz 10 mil requisições por minuto no seu login. E você paga a conta.
Você subiu seu app. Tem uma tela de login. Sem rate limit, alguém pode tentar 10 mil senhas por minuto até acertar. Ou fazer 100 mil chamadas na sua rota de IA e estourar sua conta da OpenAI num fim de semana.
Rate limit é o freio. Ele limita quantas requisições um mesmo cliente faz num intervalo de tempo. Simples e essencial.
Meu take: rate limit não é feature avançada. É higiene básica. Todo app público precisa. Ponto.
O que rate limit resolve
Três problemas de uma vez:
- Brute force: impede tentar mil senhas na tela de login.
- Abuso de API: impede alguém drenar sua cota de IA ou de e-mail.
- Sobrecarga: impede que um cliente sozinho derrube seu servidor.
Sem ele, você está dependendo da boa vontade de quem acessa. Boa vontade não é estratégia de segurança.
A ideia por trás
Simples: para cada cliente, conte quantas requisições ele fez numa janela de tempo. Passou do limite, bloqueia por um tempo.
O cliente costuma ser identificado por IP. Em rotas autenticadas, pode ser o ID do usuário.
Exemplo de política: máximo 5 tentativas de login por minuto por IP. Na sexta, espera.
Passo 1: instale uma lib testada
Não escreva isso do zero. Controle de tempo e concorrência é onde bugs se escondem. Em Node com Express:
npm install express-rate-limit
Configuração básica pro login:
import rateLimit from "express-rate-limit"
const loginLimiter = rateLimit({
windowMs: 60 * 1000,
max: 5,
message: "Muitas tentativas. Tente de novo em 1 minuto.",
standardHeaders: true,
})
Aplique só na rota que precisa:
app.post("/login", loginLimiter, loginHandler)
Cinco tentativas por minuto por IP. Na sexta, resposta 429 e a mensagem.
Passo 2: proteja as rotas caras
Login é o óbvio. Mas pense em qualquer rota que custa dinheiro ou recurso:
- Rota que chama IA (cada chamada custa tokens).
- Envio de e-mail ou SMS.
- Upload de arquivo.
- Geração de relatório pesado.
Limite mais apertado nessas:
const iaLimiter = rateLimit({
windowMs: 60 * 1000,
max: 10,
})
app.post("/gerar", iaLimiter, autenticar, gerarHandler)
Dez chamadas por minuto por pessoa. Usuário normal nunca sente. Abusador para na porta.
Passo 3: em produção, use um store compartilhado
O limite em memória funciona num servidor só. Se você escala pra vários, cada um conta separado e o limite vaza.
A solução é guardar a contagem num lugar central, tipo Redis:
npm install rate-limit-redis
Aí todos os servidores compartilham a mesma contagem. Se você ainda está num servidor só, deixe pra depois. Mas saiba que existe.
Passo 4: responda direito
Quando bloquear, use o status certo: 429 Too Many Requests. E diga quando a pessoa pode tentar de novo, pelo header Retry-After.
Cliente legítimo que esbarrou por acaso entende e espera. Bot que estava abusando leva porta na cara.
O checklist de rate limit
- Login, cadastro e recuperação de senha protegidos.
- Rotas que custam dinheiro com limite mais apertado.
- Lib testada, não código próprio.
- Store compartilhado se roda em vários servidores.
- Resposta 429 com Retry-After.
Vibecoding com engenharia é lembrar que seu app vai ser testado por gente que não te quer bem. Rate limit é o primeiro muro. Barato de colocar. Caro de não ter.
A decisão é sua.
Perguntas frequentes
Perguntas rápidas
+Rate limit atrapalha usuario legitimo?
Se bem configurado, nao. Usuario normal nunca chega perto do limite. So quem abusa esbarra nele.
+Onde aplicar primeiro?
Login, cadastro, recuperacao de senha e qualquer rota que chame IA ou custe dinheiro por requisicao.
+Da pra fazer sem lib?
Da, mas nao vale a pena. Use uma lib testada. Reinventar controle de concorrencia e pedir bug.
Continue lendo
Como não virar refém de uma ferramenta de IA
A ferramenta que você ama hoje pode dobrar de preço, mudar de dono ou fechar amanhã. Não construa em cima de uma só.
VibecodingO que fazer quando a IA te dá código que você não entende
A tentação é apertar aceitar e seguir. Não faça. Código que você não entende é código que você não mantém.
VibecodingPor que backup não é opcional
Existe quem faz backup e quem ainda não perdeu tudo. Você escolhe de qual lado ficar antes ou depois.