1. ホーム
  2. javascript

[解決済み] 料金制限のあるAPIを独自にDogfoodする

2022-05-14 13:06:31

質問

概要です。

私の会社では、料金制限のあるAPIを開発しました。私たちの目標は2つあります。

  • A: 私たちの製品の周りに強力な開発者エコシステムを作成します。
  • B: 私たち自身のアプリケーションを駆動するためにそれを使用することによって、私たちのAPIのパワーを実証する。

明確にしてください。なぜレート リミットを行うのですか?

私たちは製品に追加する形でAPIを販売しているため、APIをレート制限しています。当社の API への匿名アクセスは、1 時間あたりの API 呼び出しの閾値が非常に低いのに対して、当社の有料顧客は 1 時間あたり 1000 回以上の呼び出しを許可されています。

問題点

私たちのレート制限付き API は開発者のエコシステムにとって素晴らしいものですが、私たちがそれをドッグフード化するためには、同じレート制限に制限されることを許可するわけにはいかないのです。私たちの API のフロント エンドはすべて JavaScript で、API に直接 Ajax 呼び出しを行います。

そこで質問です。

どのようにAPIを保護すれば、速度制限を解除することができ、速度制限を解除する過程で簡単になりすますことができないのでしょうか?

模索された解決策(と、それがうまくいかなかった理由)

  1. ホストヘッダに対してリファラーを確認します。-- 欠陥があるのは リファラ は簡単に偽造されます。

  2. を使用します。 HMAC を使って、リクエストと共有秘密に基づいて署名を作成し、 サーバ上でリクエストを検証します。-- 秘密とアルゴリズムは、フロントエンドのJavaScriptを調べれば簡単にわかるので、欠陥があります。

  3. リクエストをプロキシし、プロキシ内で署名する --。 プロキシ自身がAPIを公開するため、まだ欠陥があります。

質問です。

私は Stack Overflow の優秀な頭脳に代替ソリューションを提示するよう求めています。あなたなら、この問題をどのように解決しますか?

どのように解決するのですか?

自分のJavaScriptクライアントが直接APIにアクセスしているわけですから、その内容を見て、同じAPIキーを使うなど、誰でも真似することができるようになります。コードを難読化したり、さまざまな障害を設けたりして、より難しくすることはできますが、あなたと抑制しようとしている相手は、根本的に同じアクセス権を持っているのです。権限に差をつけるのではなく、非公式クライアントがその範囲内のアクセスを全部使っても全然OKで、全クライアントでの公式利用が多くなるようにシステムを組む必要があります。

これはしばしば、アプリケーション全体に対して1つのトークンではなく、ユーザーごとのアクセストークンを使って行われます。各トークンの制限は、APIの典型的な使用には十分ですが、それを悪用しようとする人には制限的であるべきです。例えば、1分間に100回の呼び出しは一般的なブラウジングをサポートするには十分すぎるかもしれないが、私があなたをスクレイピングしたい場合、その予算では効果的に行うことができない。

私は多くのボット ユーザー アカウントを作成することによって、制限を回避することができます。しかし、それは、サインアップフローにキャプチャを追加するだけで、本当の人間にほんの少し負担をかけるだけで、かなり解決される問題です。このようなシナリオの場合、すべては利便性と制限のトレードオフに過ぎません。完全に防弾されたものを見つけることはできないので、十分に良いものを作ることに集中し、穴がどこにあったかを知るために誰かに悪用されるのを待つのです。