有効期限のないAPIキーの問題点
何年も前に発行され、一度もローテーションされず、今も有効なキーは、便利なものではありません。何年も誰も実際に確認していない負債です。
APIキーだけに結びついたレート制限は、暗黙の前提を置いています。1つのキーは1人の正当なユーザーに対応し、そのユーザーはある程度予測可能な1つの方法でキーを使う、という前提です。この前提は、設計が想定しているよりも頻繁に崩れます。キーはチーム全体で共有されることもあれば、多くの異なる訪問者が同じ認証情報でリクエストを発生させるクライアントサイドのアプリに埋め込まれることもあります。あるいは、1つのキーの制限を回避するために複数のキーを積み重ねようとする人が、何度もキーを生成することもあります。
私たちがキー単位だけでなくネットワーク単位でもレート制限を行うのは、まさにこの理由からです。すべてのネットワーク(IPv4では1つの/24ブロック、IPv6では1つの/48ブロック)には1日あたり2,500件の無料リクエスト枠があり、キーなしの利用と、そのネットワーク内のアドレスから登録されたすべてのキーとで共有されます。同じネットワークから10個のキーを生成して無料枠を10倍にすることはできません。その下にいくつの別々のキーがあっても、ネットワーク単位の上限がそのパターンを捕捉するからです。
これは主に悪意ある不正利用を止めるためのものではありません。もちろんその効果もあります。目的は、誠実に利用しているすべての人にとって、無料枠を意味のあるものに保つことです。無料枠のような共有資源が手厚いままでいられるのは、キー単位の制限を回避する少数のアカウントによって、その手厚さがひそかに大量に吸い取られない場合に限られます。ネットワーク単位の割り当てにより、無料枠の計算は、本来提供するよう設計されたもの、つまりその発信元がたまたま持っている認証情報ごとではなく、発信元ごとの実際の1日の割り当てに近い状態に保たれます。
これには、罰しないよう注意しなければならない正当な利用ケースがあります。オフィス、共有ホスティング環境、少数のパブリックIPアドレスの背後にある大規模な組織など、同じネットワークから複数の正当なユーザーやサービスが正当に動作している場合です。まさにこのために、私たちはローリング方式のIPスロットを公開し、割り当てヘッダーを通じてネットワークの利用状況を確認できるようにしています。その中には、キーのIPスロットのうちいくつが上限に対して使われているかを示す専用のヘッダーも含まれます。ネットワークを共有する正当なチームは、予期せず上限に達して初めて共有の上限に気づくのではなく、自分たちの実際の状況を確認できます。
キー単位だけのレート制限は、構築も説明もより簡単で、多くのAPIにとってはおそらくそれで十分です。しかし、意味のある無料枠を持つサービスに限って言えば、キー単位だけの制限には明らかな穴が残ります。無料枠は、認証情報をもっと生成すれば増やせる資源として意図されたものではありません。それを考慮しない制限は、守っていると主張するものを実際には守っていないのです。キー単位の上限にネットワーク単位の上限を重ねることで、すべての正当なユーザーに自分が例外ではないことを証明させることなく、その穴をふさぐことができます。