フロント側からをWebAPIを呼び出して使うみたいなケースは一般的な感じですよね。
認証でアプリの使用を制限する場合には、ログイン後はユーザ認証しているのでわりと安心かもしれませんが、認証する前のpublicなWebAPIの呼び出しって悪意あるユーザに悪用されたりしないんだろうかと気になっていました。
読み取りだけだったら特に気にする感じではないですが、書き込みで悪用されるのは嫌ですよね。
というわけで、少し調べてみました。
背景
- ユーザ登録して、サービスを使い始める
- ユーザ登録後は認証してAPI利用できる
- どのユーザがAPIを利用したのか一定認知できる
- ユーザ登録のAPIエンドポイントを完全にPublicにはしたくない
- 悪意あるユーザに無限にユーザ登録されるのは嫌だ
課題
- publicなAPIエンドポイントが悪意あるユーザに無限に呼び出されてリソース生成される
解決案
- reCAPTCHAを導入してfrontend側でtokenを取得し、backend側のAPIでtokenを評価してBotリクエストを除外する
- 仮に手動でtokenを取得したとしても、有効期間が数分だったりすれば、そのtokenを利用したAPI使用を一定に制限することができる
- 有効期間が過ぎた後で再度手動でtokenを取得するのは面倒となれば標的から相対的なコスパが高いという点でBotリクエストの標的から逃れる可能性が高まる
- reCAPTCHAではドメイン等設定できるようなので、意図したクライアント(自分のサイトやサービス)からのリクエストに制限することもできそう
reCAPTCHAが破られたらどうするんだという点はもちろんありつつ、これが結構手軽な対応な感じがしている。
こういったケースに対するベストプラクティスがあるのであれば、知りたいところではあるけれども、ググった感じだとあまり事例なかった。
自分のググりがあまり良くなかったという話はあるかもしれない。
参考
- reCAPTCHA
- hirokisan/recaptcha-google-sample
- recaptcha のお試し