Fundamentos de rate limiting
Um cliente pode fazer mil requisições por segundo. Nada no HTTP os impede, e seu servidor vai tentar responder a todas elas.
Rate limiting controla quanto tráfego um serviço aceita. É a diferença entre um endpoint que sobrevive a uma tarde ruim e um que cai porque um único script ficou empolgado demais.
Três problemas que ele resolve
Uso justo. Um cliente monopolizando recursos significa que todos os outros esperam. Um limite impede que um único chamador consuma o que toda a base de usuários precisa, então o tráfego legítimo continua sendo atendido enquanto o loop descontrolado de alguém é recusado.
Segurança. Um endpoint de login sem limite é um convite para tentar adivinhar senhas, aos milhares de uma vez. Limites tornam a força bruta lenta demais para ser útil, e amenizam os ataques mais simples de negação de serviço.
Recursos. A sobrecarga deixa um serviço lento antes de deixá-lo indisponível, e é na lentidão que os usuários desistem. Limitar a taxa de processamento mantém os tempos de resposta previsíveis para todo mundo que ainda está dentro do limite.
Limites não são uma defesa contra DDoS por si só
Um ataque distribuído de negação de serviço chega a partir de milhares de máquinas diferentes, cada uma parecendo um cliente comum. Limites por endereço praticamente não afetam isso.
Responder a isso exige algo antes na cadeia: filtragem geográfica, análise comportamental, ou um provedor posicionado à sua frente. Rate limiting é uma camada, não a solução completa.
Limitar a frequência com que alguém pode fazer pedidos é o que torna um aplicativo difícil de abusar e agradável para todo mundo ao mesmo tempo.
Recusar versus desacelerar
Dois controles relacionados que são usados como sinônimos e se comportam de forma diferente.
| Rate limiting | Throttling | |
|---|---|---|
| O que faz | Recusa requisições acima de um teto | Desacelera requisições conforme o limite se aproxima |
| O que o cliente vê | Um erro, geralmente 429 Too Many Requests | Uma resposta, mais demorada que o normal |
| Melhor para | Tetos rígidos que você quer impor | Suavizar picos sem quebrar os clientes |
Rate limiting recusa acima de um teto. Throttling desacelera.
Os dois têm seu lugar, e se combinam: desacelere conforme o tráfego cresce, recuse totalmente acima de um teto rígido. Throttling cobre a segunda metade em detalhes.
Um quebra a requisição do cliente. O outro faz o cliente esperar. Qual é mais gentil depende inteiramente de quem está chamando e por quê.
Contra o que um limite conta
Um limite precisa de algo para contar por unidade. Quatro candidatos, cada um com trocas diferentes:
- Endereço IP. Disponível em toda requisição, inclusive nas anônimas, e compartilhado por todo mundo atrás de uma rede corporativa ou de uma operadora de celular.
- Id do usuário autenticado. Preciso e justo, e só existe depois do login.
- Chave de API. Ideal para clientes automatizados, já que uma chave identifica um chamador com exatidão.
- Uma claim dentro de um JWT. Útil quando a identidade já viaja dentro do token.
Identificar clientes trata de como escolher entre eles. Resumindo: o tráfego anônimo deixa você só com o endereço, e todo o resto é melhor quando está disponível.
Limites também precisam de uma janela de tempo. Por segundo, por minuto, por hora, e essa escolha molda o comportamento tanto quanto o número em si.
Todo rate limit é essas três decisões juntas, e mudar qualquer uma delas muda o que o limite realmente faz.
Coloque em prática
Uma API tem um único limite: 1.000 requisições por hora por endereço IP. Descubra o que ela não consegue evitar.
- Um usuário em uma rede universitária não consegue usar o aplicativo durante o período letivo. Por quê?
- Um atacante quer 10.000 requisições por hora. Quanto isso custa a ele?
- Um script envia todas as 1.000 requisições nos primeiros dois segundos de cada hora. Isso está dentro do limite?
Compare suas respostas
1. O limite conta a coisa errada. Todo mundo naquela rede compartilha um único endereço de saída, então milhares de pessoas estão dividindo um orçamento de mil. A correção é contar por usuário autenticado onde existe um usuário, e manter o limite por endereço só para o tráfego anônimo.
2. Dez endereços. Pools de proxy residencial vendem esses aos milhares por muito pouco. Limites por endereço fazem o abuso custar algo; não o tornam difícil. Essa é a mesma razão pela qual limitar por IP praticamente não afeta um ataque distribuído.
3. Totalmente dentro do limite. Nada diz como as mil requisições devem ser distribuídas, então todas elas podem chegar de uma vez, e o endpoint enfrenta um pico contra o qual nunca esteve protegido. É isso que o tamanho da janela controla, e escolher uma janela de uma hora permite um pico que uma janela de um minuto jamais permitiria.
Três perguntas, três fraquezas diferentes, e só a terceira é sobre o algoritmo. As duas primeiras são sobre o que você conta e quão barato isso pode ser substituído.
Para onde isso vai a seguir
Um limite precisa de três decisões: quanto, em qual janela, contado contra quem. O algoritmo é como você acompanha isso.
Contadores de janela fixa é o mais simples desses algoritmos, e o pico que ele deixa passar é exatamente o que todo algoritmo seguinte existe para corrigir.

