O que um limite protege

Prévia grátis 4 min de leitura

Um limite de taxa não é uma ideia só. Cada limite numa aplicação real protege uma coisa diferente, e o que ele protege decide o algoritmo, o número e contra o que a requisição é contada.

Esta aplicação tem nove deles, num arquivo só, e eles não são variações de um mesmo tema.

Os nove

req/ip              300 por minuto   tráfego anônimo, por IP
req/user            600 por minuto   tráfego de quem está logado, por aluno
logins/ip           não publicado    tentativas de login, por IP
logins/email        não publicado    tentativas de login, por e-mail
signups/ip          3 por hora       contas novas, por IP
comments/ip         10 por minuto    posts na discussão, por IP
inquiries/ip        5 por hora       contatos de parceiros, por IP
sandbox/user        não publicado    execuções de código, por aluno
verdict_poll/user   não publicado    consultas ao status da correção, por aluno

Os valores de login e de execução de código ficam de fora de propósito. Mesmo assim, repare na amplitude: de 600 por minuto até 3 por hora. É um fator de doze mil, e não é descuido. Cada número vem do que daria errado se ele não existisse.

Quatro proteções diferentes

Capacidade

O req/ip, com 300 por minuto, e o req/user, com 600 por minuto, protegem os servidores. Nada numa requisição isolada é perigoso. O perigo é o volume, e os dois limites ficam bem acima do que uma pessoa navegando conseguiria produzir. O tráfego anônimo é contado por IP e o de quem está logado, por aluno, por um motivo que a lição 6 explica.

Um segredo

O logins/ip e o logins/email protegem as senhas contra adivinhação. Os limites são baixos porque um punhado de tentativas já é generoso: quem esqueceu a senha usa o fluxo de redefinição, e não uma tentativa atrás da outra.

Um recurso escasso

O sandbox/user e o verdict_poll/user protegem o caminho de execução de código, em que cada requisição custa muito mais do que renderizar uma página. Os dois são contados por aluno.

Algo com custo fora do sistema

O signups/ip, com 3 por hora, e o inquiries/ip, com 5 por hora, protegem contra lixo que depois alguém precisa tratar: contas para limpar, contatos para ler.

flowchart TB
  Q["o que este limite protege?"] --> C["capacidade: os servidores"]
  Q --> S["um segredo: senhas"]
  Q --> R["um recurso escasso: execução de código"]
  Q --> H["tempo humano: cadastros, consultas"]
  C --> C1["300-600/min. generoso, o volume é o único perigo"]
  S --> S1["baixo. um punhado de tentativas já é generoso"]
  R --> R1["dimensionado pelo custo por requisição, contado por aluno"]
  H --> H1["3-5/hora. o custo cai sobre uma pessoa"]

O número segue a proteção

Nenhum desses limites poderia trocar de lugar com outro. Três logins por hora travariam pessoas de verdade, e trezentos não atrasariam um atacante. O número não é um botão que você gira até os alertas pararem. É uma afirmação sobre o que alguém legítimo faz e do que um atacante precisa.

O jeito justo de escolher: descreva o pior caso legítimo e deixe folga. Quem erra a senha erra três ou quatro vezes, e não cinquenta. Quem se cadastra faz isso uma vez, e não oito.

O que um limite não é

Um limite de taxa não é uma cota, e confundir os dois causa estrago de verdade.

Uma cota é um orçamento para um período longo, como mil chamadas de API por mês. Esgotá-la é um evento normal e esperado do negócio, com o qual a pessoa já contava.

Um limite de taxa trata do formato do tráfego no curto prazo. Passar dele é sinal de que algo está errado agora, e a resposta certa é ir mais devagar e tentar de novo, e não comprar mais.

Os dois falham de jeitos diferentes e devem ser comunicados de jeitos diferentes. Esta aplicação devolve 429 Too Many Requests com a mensagem "Please try again later". Essa frase enganaria numa cota, porque tentar mais tarde é justamente o que não vai ajudar.

Pontos-chave

  • Esta aplicação tem nove throttles, de 600 por minuto a 3 por hora, e a amplitude é proposital, e não incoerente.
  • Os limites protegem quatro coisas distintas: capacidade, um segredo, um recurso escasso e o tempo das pessoas.
  • O número segue a proteção: descreva o pior caso legítimo e deixe folga.
  • Um limite de taxa trata do formato do tráfego agora. Uma cota é um orçamento para um período longo.
  • Passar de um limite significa ir mais devagar e tentar de novo. Esgotar uma cota significa que tentar de novo não vai ajudar.
Aula 1 de 7 · grátis

Continue com a aula 2

O contador de janela fixa

Como o contador de janela fixa embute o número da janela na chave de cache e incrementa de forma atômica.

Com uma conta grátis você também tem os quizzes, seu progresso e suas anotações, e a discussão.

Digite para buscar...