Node.jsHTTP如何做HTTP请求限速?

Node.js HTTP how to do an HTTP request rate limit?

我想为我的快速 http 处理创建一个速率限制中间件,如下所示:

app.post("/v1/authentication/login", rateLimiter(5, 20), require('./api/v1-login'));

哪个中间件在 20 秒内只允许 5 个请求。

我可以为此使用插件,但我也在使用 clusters/processes 并且我了解到该插件不支持进程。

我知道我可以使用数据库在进程之间共享数据 - MongoDB 或 Redis。

此外,我想自定义速率限制 - 也就是说,对于功能 A,我希望允许用户 John 每 20 秒请求 5 次,例如, 但是,对于相同的功能,我希望允许 Dani 每 20 秒发送 10 个请求。

我还需要将其应用到我之前提到的所有流程中。

我考虑过编写自己的脚本来保存请求用户的数据,但我不知道到底要保存什么 - 他的 IP?他的 chrome 序列号还是什么..?

我应该将其存储在 Redis 数据库中还是 Mongo? 也许有一个 Node.js 内置内存可以更好地保存数据?

你推荐什么?

我建议实施基于令牌的身份验证,就像 Facebook 的 API 一样。这样您就可以监控谁在使用 API 并识别每个用户。

实施后,您可以开始根据在您喜欢的时间段内呼叫 API 的用户(拥有令牌的用户)限制呼叫。

使用插件没有错。以 express-rate-limit with Redis Store 为例,您可以对每个用户 IP 的整个应用程序进行速率限制,并将其存储在 Redis 中:

const rateLimit = require("express-rate-limit");
const RedisStore = require('rate-limit-redis');
app.use(rateLimit({
  store: new RedisStore({ /* ... config */ });
  windowMs: 15 * 60 * 1000, // 15 minutes
  max: 100 // limit each IP to 100 requests per windowMs
});

或者您可以只限制给定的端点:

const someApiLimiter = rateLimit({
  windowMs: 5 * 60 * 1000,
  max: 12,
});
app.use('/api/some', someApiLimiter);

默认使用 req.ip,但您可以提供一个 keyGenerator 函数,并使用类似 req.ipreq.user._id 的组合。所以你在所有基础上都被覆盖了。

我推荐 Redis 来处理这些事情,因为它需要快速处理大量小数据,Redis 可以很好地处理这些事情。

rate-limiter-flexible 允许为不同的用户设置不同的限制。

它在没有任何数据库、MongoDB 或 Redis 的集群中工作。

在此处阅读有关登录端点保护的信息login endpoints protection here