A limitação de taxa é uma estratégia que você pode usar para controlar o tráfego em uma rede. Ele limita o número de solicitações que um usuário pode fazer dentro de um período de tempo específico.

Existem vários algoritmos de limitação de taxa, cada um com suas próprias compensações. Um método simples e popular é rastrear os endereços IP das solicitações e verificar quanto tempo decorre entre as solicitações. O sistema pode então negar uma solicitação se seu endereço IP exceder o número de solicitações permitidas pelo limite.

Essa abordagem de limitação de taxa é fácil de construir em um aplicativo NodeJS-Express, com apenas algumas etapas.

Etapa 1: configurando um ambiente de desenvolvimento

Primeiro, você precisará criar e inicializar um aplicativo Express.

Comece criando um diretório de projeto executando:

aplicativo expresso mkdir

Em seguida, entre nesse diretório executando:

cd aplicativo expresso

A seguir, inicialize npm, o gerenciador de pacotes do nó, e criar um pacote.json arquivo em seu aplicativo executando:

instagram viewer
npm init -y

o -y bandeira irá criar o seu pacote.json arquivo com todas as configurações padrão.

Em seguida, você precisará instalar algumas dependências. As dependências necessárias para este tutorial são:

  • ExpressJS: ExpressJS é um framework NodeJS que fornece um conjunto robusto de recursos para aplicativos da Web e móveis. Ele simplifica o processo de construção de aplicativos de back-end com NodeJS.
  • Limite de taxa expresso: Express rate limit é um middleware de limitação de taxa para ExpressJS. Limita solicitações repetidas a APIs e/ou endpoints públicos, como redefinições de senha, logins de usuários, etc.

Instale as dependências necessárias executando:

npm instalar express express-rate-limite

Etapa 2: criando um aplicativo expresso

Você precisará criar um servidor Express básico que escute as solicitações feitas ao seu aplicativo.

Primeiro, crie um index.js arquivo no diretório raiz do seu projeto. Este será o arquivo de entrada para seu aplicativo.

Em seguida, adicione o seguinte código ao seu index.js Arquivo:

// index.js
const expresso = exigir("expressar");
const aplicativo = expresso();
const porta = processo.env. PORTO || 3000

app.listen (porta, () => {
console.registro(`App rodando na porta ${porta}`);
});

Este código importa expressar e cria um aplicativo Express chamando express() e armazenando seu valor de retorno no aplicativo variável. Em seguida, ele escuta o tráfego na porta 3000 chamando o ouço método no aplicativo objeto.

Etapa 3: criando manipuladores de rota

Em seguida, crie alguns manipuladores de rota nos quais você possa implementar a solução de limitação de taxa.

Primeiro, crie uma pasta, routes, no diretório raiz do seu projeto executando:

rotas mkdir

Crie um arquivo, route.js, dentro de sua pasta de rotas e adicione o seguinte código:

const expresso = exigir("expressar");
const roteador = expresso. Roteador();

roteador.get("/", (req, res) => {
res.send({ mensagem: "Olá, esta é uma solicitação GET" });
});

roteador.post("/add-demo", (req, res) => {
res.status (201).send({ mensagem: "Recurso criado com sucesso" });
});

roteador.put("/update-demo", (req, res) => {
res.status (201).send({ mensagem: "Recurso atualizado com sucesso" });
});

módulo.exportações = roteador;

Este código importa expressar, chama o Roteador método em expressar, e armazena o valor em uma variável, roteador. o Roteador permite criar manipuladores de rotas modulares e montáveis. Você pode criar manipuladores de rota para um PEGUE pedir para “/", uma PUBLICAR pedir para “/add-demo”, e um COLOCAR pedir para “/update-demo”. Por fim, exporte o roteador variável.

A seguir, importe o roteador variável em seu index.js Arquivo:

// index.js
const rotas = exigir("./rotas/rotas");

Em seguida, use-o como um middleware em seu arquivo index.js:

// index.js
aplicativo.usar(rotas);

Certifique-se de colocar o bloco de código acima antes do app.ouvir ligar.

Etapa 4: Implementando a limitação de taxa

Primeiro, crie um “middleware” no diretório raiz do seu projeto executando:

middleware mkdir

Em seguida, crie um arquivo chamado “rate-limiter.js” dentro do diretório de middleware. Adicione o seguinte código a este arquivo:

// rate-limiter.js
const taxaLimiter = exigir("limite de taxa expressa");

const limitador = taxaLimiter({
máximo: 5,
janelaMS: 10000, // 10 segundos
mensagem: "Você pode't fazer mais pedidos no momento. Tente mais tarde",
});

módulo.exportações = limitador

o limitador de taxa A função recebe um objeto de configuração com as condições para limitar o número de solicitações.

As propriedades no objeto de configuração acima são:

  • máximo: Esta propriedade deve ser sempre uma número ou uma função que retorna um número. Ele representa o número máximo de solicitações que um usuário pode fazer dentro de um período de tempo especificado. Se esta propriedade não estiver configurada no objeto de configuração, o padrão será 5.
  • windowsMS: esta propriedade deve ser sempre um número. Representa o período de tempo em que várias solicitações são permitidas em milissegundos. Se esta propriedade não estiver configurada no objeto de configuração, o padrão será 60.000 milissegundos (um minuto).
  • mensagem: Esta propriedade pode ser um corda, um objeto JSON ou qualquer outro valor suportado por Resposta do Express.send método. Se esta propriedade não estiver configurada no objeto de configuração, o padrão será “Muitas solicitações. Por favor, tente novamente mais tarde."

A função irá então verificar se há solicitações repetidas para seu aplicativo. Se um usuário exceder o limite (máximo, 5) dentro do prazo (janela MS, 10s), ele bloqueará a solicitação. Ele também lançará um erro “Too Many Requests” com um código de status de 429.

Finalmente, importe a função do limitador em seu index.js e aplique-o como um middleware global em seu aplicativo. Faça isso colocando app.use (limitador) acima do middleware de rotas. Isso aplica a solução de limitação de taxa a todas as rotas do seu aplicativo.

aplicativo.usar(limitador);

Rotas Específicas de Limitação de Tarifa

Você também pode aplicar a limitação de taxa a rotas específicas. Você pode configurá-los separadamente para rejeitar solicitações feitas em um período de tempo diferente, exibir uma mensagem diferente etc.

Por exemplo, suponha que você esteja implementando uma rota de login do usuário em seu aplicativo. Talvez seja necessário adicionar uma configuração de limitação de taxa para a rota de entrada diferente da configuração usada pelas outras rotas.

Primeiro, você terá que remover limitador como um middleware de nível de aplicativo e aplique-o porque não há um sistema de filtro de middleware integrado no ExpressJS. Portanto, mesmo se você adicionar uma solução de limitação de taxa específica a uma rota, o middleware global ainda será executado nessa rota.

Em seguida, crie uma nova configuração de limitação de taxa em seu rate-limiter.js arquivo e exportá-lo.

const signInLimiter = rateLimiter({
máximo: 3,
janelaMS: 10000, //10 segundos
mensagem: "Muitas tentativas de login. Tente mais tarde."
})

módulo.exportações = {
limitador,
signInLimiter
}

o signInLimiter objeto de configuração tem um número diferente de máximo solicitações e uma mensagem de erro diferente do limitador de taxa geral.

Por fim, atualize seu roteador.js arquivo com o bloco de código abaixo:

// roteador.js
const expresso = exigir("expressar");
const roteador = expresso. Roteador();
const {limiter, signInLimiter} = exigir("../middleware/rate-limiter")

roteador.get("/sign-in", signInLimiter, (req, res, próximo) => {
res.send({ mensagem: "Olá, esta é uma solicitação GET" });
});

roteador.usar(limitador)

roteador.post("/post", (req, res) => {
res.status (201).send({ mensagem: "Recurso criado com sucesso" });
});

roteador.put("/put", (req, res) => {
res.status (201).send({ mensagem: "Recurso atualizado com sucesso" });
});

módulo.exportações = roteador;

No bloco de código acima, você importou limitador e signInLimiter. Então você se candidatou signInLimiter como um limitador de taxa específico para o “/sign-in" rota.

Por fim, colocando roteador.use (limitador) acima do restante das rotas, você aplicou o limitador como limitador de taxa para o restante das rotas.

A Importância da Limitação de Taxas

A limitação de taxa reduz a tensão em seu servidor web, evitando ter que processar muitas solicitações de uma só vez. Ele reduz a atividade do bot, protege você contra ataques de negação de serviço (DoS) e evita ataques de força bruta.