第 11 章 · 限流第 7 页,共 9 页
怎样认出哪些请求来自同一个人?
限流之前,要先决定把哪些请求算在同一个请求者头上。按 IP 地址、按账号、按接口密钥,各有它会误伤的人和漏掉的人。
为什么需要
「每个请求者每 12 秒最多 8 个」里的「每个请求者」,其实看不见人,只能看见请求上带着的信息。拿哪一项信息来分辨请求者,叫作(rate limit key)。选错了,要么把许多人当成一个人,一起拒绝;要么把一个人当成许多人,一一放行。
怎样做
常用的计数依据有三种:
- IP 地址:是网络上用来找到一台设备的一串数字,每个请求都带着它,不登录也能用。但一所学校、一个小区常常几百人共用一个对外的地址;网络运营商也常让许多用户共用同一个地址,替大量网站转发请求的 Cloudflare 公司发现,运营商这样让许多用户共用的地址,被限流的频率约是其他地址的 3 倍(2025)。反过来,攻击者可以借助大量代理服务器(替别人转发请求的电脑,网站看到的是它的地址),把请求分散到许多地址上,让按地址的限流失效(网站安全组织 OWASP,文档未注明日期)。
- 账号:登录以后才有。一个人换多少个地址都算一份,共用地址的人也不受连累。但没登录的请求无从计数;用在登录页上时,别人故意用你的账号名反复输错密码,被锁住的却是你。微软给企业和学校用的身份服务 Microsoft Entra ID 因此把熟悉地点和陌生地点的失败次数分开计算(2026)。
- 接口密钥:百家菜为合作公司的程序开放了(一份写明程序可以向它要什么的请求清单,不是手机上插充电线的接口),并发给每家公司一串专属的字符,叫作(API key),程序每次请求都要带上。它适合区分程序发来的请求,可以按套餐给不同的配额;但浏览网页的读者没有密钥,这条规则管不到他们。
下图里有四个请求者:共用一个对外地址的学校机房,在家登录的小林,不断换地址、想猜中小林密码的人,以及带着接口密钥、程序出了错的智能厨具公司。在三种计数依据之间切换,看限流器把哪些请求算在一起。
按谁来数:限流器把哪些请求算在一起
先看这里先看中间一行:每个框是限流器单独记的一份计数。按 IP 地址计数,40 名学生挤在一个框里,被误伤;猜密码的人分散在 30 个地址里,漏网。换成按账号,看他的请求怎样和小林的算进同一个框。
按 IP 地址计数:误伤 1 个请求者(学校机房),漏掉 1 个(猜密码的人)。
| 请求者 | 发出 | 放行 | 拒绝 | 评价 | 原因 |
|---|---|---|---|---|---|
| 学校机房 | 80 | 8 | 72 | 误伤 | 40 名学生被当成一个请求者,合用 8 个 |
| 小林 | 3 | 3 | 0 | 正常 | 家里的地址只有小林在用 |
| 猜密码的人 | 30 | 30 | 0 | 漏网 | 每个地址只用了 1 次 |
| 智能厨具程序 | 60 | 8 | 52 | 超出配额的被拒绝 | 程序的请求都从同一个地址发出 |
代价是什么
没有一种计数依据处处适用,常见的做法是组合起来:没登录的浏览按 IP 地址,登录以后的操作按账号,程序发来的请求按接口密钥。代码网站 GitHub 就是这样:没登录的按地址计,每小时 60 个;登录以后按用户计,每小时 5,000 个(文档未注明日期)。计数依据还可以带上「做的是什么操作」,给登录、发验证码这类敏感操作单独设更严的上限。
接口密钥还有一个代价:它只是一串字符,被人拿到就能冒用你的配额。各家密钥的作用也不同:有的本身就是通行证,拿着它就能动用账户的权限,例如在线支付公司 Stripe 的秘密密钥能使用它的全部接口(文档未注明日期);有的主要是一个记号,用来分辨请求来自哪个客户、记在谁的配额上,例如亚马逊云服务的 API Gateway(一项替别人的接口统一接收、转交请求的服务):它可以设成不带密钥就不接收请求,但它的文档提醒,不能单靠这种密钥确认对方是谁、有没有权限,还要另外验证身份(文档未注明日期)。无论哪一种,泄露以后都要立即作废、换新。
至于那个不断换地址、猜密码的人,只有按账号计数时他的尝试才会被拒绝,代价是连累账号的主人;而且上限之内的尝试照样放行,每过 12 秒他又能再试几次。所以对付他还要靠识别设备特征、专门的攻击防护等手段,第 13 章再讲。
资料来源
以下资料均于 2026-10-19 访问。