Node.js HTTP how to do an HTTP request rate limit?
我想为我的快速http处理创建一个限速中间件,如下所示:
1 | app.post("/v1/authentication/login", rateLimiter(5, 20), require('./api/v1-login')); |
哪个中间件在20秒内仅允许5个请求。
我可以为此使用插件,但是我也正在使用集群/进程,并且我已经阅读到该插件不支持进程。
我知道我可以使用DB-MongoDB或Redis在进程之间共享数据。
此外,我想设置一个自定义的速率限制-例如,对于功能A,我希望允许用户John每20秒请求5次,
但是,对于同一功能,我希望允许Dani每20秒发送10个请求。
我也需要将它应用于我之前提到的所有过程中。
我曾考虑编写自己的脚本来保存请求用户的数据,但是我不知道该保存什么-他的IP?他的Chrome序列号或它的序列号是什么..?
我应该将其存储在Redis DB还是Mongo中?
也许有一个内置在内存中的Node.js更好地将数据保存在那里?
您推荐什么?
使用插件没有错。以Redis商店的
1 2 3 4 5 6 7 | 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 }); |
或者您可以仅限制给定的端点:
1 2 3 4 5 | const someApiLimiter = rateLimit({ windowMs: 5 * 60 * 1000, max: 12, }); app.use('/api/some', someApiLimiter); |
默认使用
我建议将Redis用于这些事情,因为您需要快速处理大量小数据,Redis可以很好地完成这些事情。
rate-limiter-flexible允许为不同的用户设置不同的限制。
它可以在没有任何DB,MongoDB或Redis的Cluster中工作。
在此处了解有关登录端点保护的信息
我建议像Facebook的API一样实现基于令牌的身份验证。这样,您可以监视谁在使用API??,并标识每个用户。
实施该操作后,您可以根据喜欢的时间段内正在调用API的用户(拥有令牌的用户)开始限制调用。