Node.js HTTP如何做HTTP请求速率限制?



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

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

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

我可以使用插件,但我也在使用集群/进程,并且我已经读到该插件不支持进程。

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

此外,我想做一个自定义速率限制 - 这意味着,对于函数 A,我希望允许用户 John 被允许在每 5 秒内请求 20 次,例如, 但是,对于相同的功能,我希望允许 Dani 每 20 秒发送 10 个请求。

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

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

我应该将其存储在 Redis DB 还是 Mongo 中? 也许有一个内置在内存中的 Node.js 最好将数据保存在那里?

你有什么建议?

使用插件没有错。以 Redis Store 为例express-rate-limit,您可以对每个用户 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 做得很好。

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

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

速率限制器灵活允许为不同的用户设置不同的限制。

它可以在没有任何DB,MongoDB或Redis的集群中工作。

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

最新更新