限流按谁来计数

为什么需要

「每个请求者每 12 秒最多 8 个」里的「每个请求者」,其实看不见人,只能看见请求上带着的信息。拿哪一项信息来分辨请求者,叫作(rate limit key)。选错了,要么把许多人当成一个人,一起拒绝;要么把一个人当成许多人,一一放行。

怎样做

常用的计数依据有三种:

  • IP 地址:是网络上用来找到一台设备的一串数字,每个请求都带着它,不登录也能用。但一所学校、一个小区常常几百人共用一个对外的地址;网络运营商也常让许多用户共用同一个地址,替大量网站转发请求的 Cloudflare 公司发现,运营商这样让许多用户共用的地址,被限流的频率约是其他地址的 3 倍(2025)。反过来,攻击者可以借助大量代理服务器(替别人转发请求的电脑,网站看到的是它的地址),把请求分散到许多地址上,让按地址的限流失效(网站安全组织 OWASP,文档未注明日期)。
  • 账号:登录以后才有。一个人换多少个地址都算一份,共用地址的人也不受连累。但没登录的请求无从计数;用在登录页上时,别人故意用你的账号名反复输错密码,被锁住的却是你。微软给企业和学校用的身份服务 Microsoft Entra ID 因此把熟悉地点和陌生地点的失败次数分开计算(2026)。
  • 接口密钥:百家菜为合作公司的程序开放了(一份写明程序可以向它要什么的请求清单,不是手机上插充电线的接口),并发给每家公司一串专属的字符,叫作(API key),程序每次请求都要带上。它适合区分程序发来的请求,可以按套餐给不同的配额;但浏览网页的读者没有密钥,这条规则管不到他们。

下图里有四个请求者:共用一个对外地址的学校机房,在家登录的小林,不断换地址、想猜中小林密码的人,以及带着接口密钥、程序出了错的智能厨具公司。在三种计数依据之间切换,看限流器把哪些请求算在一起。

按谁来数:限流器把哪些请求算在一起

先看这里先看中间一行:每个框是限流器单独记的一份计数。按 IP 地址计数,40 名学生挤在一个框里,被误伤;猜密码的人分散在 30 个地址里,漏网。换成按账号,看他的请求怎样和小林的算进同一个框。

计数依据
请求者
限流器的计数

按 IP 地址计数:误伤 1 个请求者(学校机房),漏掉 1 个(猜密码的人)。

12 秒里,每个请求者的结果
请求者发出放行拒绝评价原因
学校机房80872误伤40 名学生被当成一个请求者,合用 8 个
小林330正常家里的地址只有小林在用
猜密码的人30300漏网每个地址只用了 1 次
智能厨具程序60852超出配额的被拒绝程序的请求都从同一个地址发出

代价是什么

没有一种计数依据处处适用,常见的做法是组合起来:没登录的浏览按 IP 地址,登录以后的操作按账号,程序发来的请求按接口密钥。代码网站 GitHub 就是这样:没登录的按地址计,每小时 60 个;登录以后按用户计,每小时 5,000 个(文档未注明日期)。计数依据还可以带上「做的是什么操作」,给登录、发验证码这类敏感操作单独设更严的上限。

接口密钥还有一个代价:它只是一串字符,被人拿到就能冒用你的配额。各家密钥的作用也不同:有的本身就是通行证,拿着它就能动用账户的权限,例如在线支付公司 Stripe 的秘密密钥能使用它的全部接口(文档未注明日期);有的主要是一个记号,用来分辨请求来自哪个客户、记在谁的配额上,例如亚马逊云服务的 API Gateway(一项替别人的接口统一接收、转交请求的服务):它可以设成不带密钥就不接收请求,但它的文档提醒,不能单靠这种密钥确认对方是谁、有没有权限,还要另外验证身份(文档未注明日期)。无论哪一种,泄露以后都要立即作废、换新。

至于那个不断换地址、猜密码的人,只有按账号计数时他的尝试才会被拒绝,代价是连累账号的主人;而且上限之内的尝试照样放行,每过 12 秒他又能再试几次。所以对付他还要靠识别设备特征、专门的攻击防护等手段,第 13 章再讲。

资料来源

以下资料均于 2026-10-19 访问。

  1. One IP address, many users: Detecting CGNAT to reduce collateral effectsVasilis Giotsas、Marwan Fayed,Cloudflare,2025-10-29
  2. Credential Stuffing Prevention Cheat SheetOWASP 速查表,未注明日期
  3. Prevent attacks using smart lockout (Microsoft Entra ID)Microsoft Learn,2026-06-03
  4. Rate limits for the REST APIGitHub 文档,未注明日期
  5. API keysStripe 文档,未注明日期
  6. Usage plans and API keys for REST APIs in API GatewayAWS,未注明日期