我们的观点

为什么账户级和网络级配额都应该存在

账户级配额回答的是一个简单的问题:这个特定的密钥用了多少。这是最自然、最先要跟踪的指标,但仅靠它是不够的,因为密钥只是一个凭证,而凭证是可以成倍增加的。一个决意突破账户级限制的人,往往只需再创建一个账户、再生成一个密钥,就能获得一份全新的配额,除非有别的机制在跟踪某个不会因为签发新凭证就重置的维度。

这正是网络级配额的用途。每个网络(IPv4 地址为一个 /24 地址段,IPv6 地址为一个 /48 地址段)每天共享 2,500 次免费请求额度,无密钥流量和从该网络注册的所有密钥都计入其中。如果只有账户级限制,就会有人不断生成新密钥,反复重置自己的免费额度。网络级限制恰好填补了这个漏洞,因为它跟踪的是流量实际来自哪里,而不只是流量碰巧附带了哪个凭证。

两种衡量方式单独使用都不够,而且值得具体说明各自防范的是什么,因为它们解决的是不同的问题。账户级跟踪防范的是单个凭证的使用量远远超出应有范围,这关系到计费的准确性,也有助于发现泄露的密钥被用在不该用的地方。网络级跟踪防范的则是免费额度通过反复注册被成倍放大,这是另一种失效模式,单靠账户级跟踪是看不到的,因为每个新账户单独来看都完全正常。

同时运行两者确实会带来一个合理的复杂问题:多个真实用户共享同一个网络,例如一家公司位于少量公共 IP 地址之后,理论上可能会触及网络级上限,而这与任何单个用户的实际用量毫无关系。我们用滚动 IP 名额来处理这种情况,即一个密钥可以从固定数量的不同地址使用,同时配额响应头会准确显示已经占用了多少名额以及上限是多少,这样合法的共享网络就能看到自己的真实状况,而不是毫无解释地撞上一堵不透明的墙。

我们认为,在这种情况下,更简单的设计(只跟踪一个维度)实际上对诚实的用户更不利,而不仅仅是对滥用的防护更弱。只有网络级限制,会因为同一网络上其他无关的活动而惩罚某个账户。只有账户级限制,则会让免费额度被任何愿意创建足够多账户的人无限放大。同时运行两者,并通过响应头让每一项都清晰可见,确实意味着更多的环节,但这才是真正保护免费额度本应保护的东西,同时不会暗中惩罚那些按预期使用它的人的版本。