Google の reCAPTCHA のバージョンについて

reCAPTCHA を利用したのですが、機能や料金に関わるバージョン情報あたりが複雑だったのでそれについてと、いくつかの疑問について少しまとめます。

実装については話しません。

# reCAPTCHA とは

詳しい説明は公式や他の記事がしていると思うので、軽くどんなものかだけ。

こういうやつです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315470/7ff80213-065a-bae8-11e6-77fa33389210.png)

ユーザーの行動を監視して BOT であるかどうかを判定するやつですね。
ただし最新のバージョンはユーザーにこういった追加のアクションを求めずに勝手に BOT かどうかを判断します。

# バージョンについて
reCAPTCHA には enterprise, v3, v2 の3バージョンがあるという説明がよく行われていますが、詳しく見てみます。

大別して [reCAPTCHA](https://www.google.com/recaptcha/about/) と [reCAPTCHA enterprise](https://cloud.google.com/recaptcha-enterprise?hl=ja) の2種が google より提供されています。

本記事でも
v2, v3 といった旧環境のものを reCAPTCHA
Google Cloud Platform (GCP) で管理されるものを reCAPTCHA enterprise と呼び分けます。

## reCAPTCHA
reCAPTCHA には v2 と v3 が存在します。(v1 は 2018 年に廃止済み)

https://developers.google.com/recaptcha/docs/versions?hl=ja

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315470/8d634805-ed6a-4c81-9b09-3c03f0f242af.png)

(ただし、単純な精度向上といったバージョン違いではなく、利用できる機能自体にも違いがあります。)

### v2
v2 では複数のタイプのキーを作成することができます。

#### 「私はロボットではありません」チェックボックス
https://developers.google.com/recaptcha/docs/display?hl=ja

ドキュメント上では単に reCAPTCHA v2 と呼ばれることがある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315470/0ae899b2-a167-853d-4e30-3a2aa2bceb0f.png)

こういったチェックボックスをユーザーにクリックさせ、この時の動作を分析することで BOT かどうかを判断します。
また、チェックボックス操作で BOT の疑いのあるユーザーには記事冒頭の画像のような CAPTCHA チャレンジとドキュメントで呼ばれている画像テストが課されます。
結果、BOT と判断したかを真偽値で取得できます。

#### 非表示 reCAPTCHA バッジ
https://developers.google.com/recaptcha/docs/invisible?hl=ja

ドキュメント上では単に非表示の reCAPTCHA と呼ばれることがある。
しばしば v2 と名乗らない。

このタイプはユーザーにチェックボックスのクリックのような追加の動作を求めません。
勝手に BOT かどうかが判断されます。

ただし、BOT と疑わしいユーザーには同じく画像テストが課されます。

#### reCAPTCHA Android
classic キーでのみ利用できます。
(classic キーについては後述)

> reCAPTCHA Android ライブラリは、Google Play 開発者サービスの SafetyNet API の一部です。

と公式ドキュメントに記載されています。

今回は web サイトへの組み込みで情報を集めていたこともあってこのタイプの詳細は見送ります。

### v3
スコアベースキーのみが作成できます。

非表示の reCAPTCHA と同様にユーザーに追加の動作を求めません。
さらに、結果も BOT かどうかの真偽値ではなく人間っぽさに対する 1.0 ~ 0.0 のスコアを返します。
BOT の疑いがあるからと勝手に画像チャレンジがを出してユーザーの動作を阻害しません。

その代わり、スコアを返すだけなのでどの程度のスコアのユーザーをどういった扱いにするかはこちらで決める必要があります。

## reCAPTCHA enterprise
コチラは Google Cloud Platform 管理になるので先ほどまでの reCAPTCHA とは管理画面から異なります。
スコアベースキーとチェックボックスキー(および WAF 用の challenge-page key のみ invisible key)が選択できます。

https://cloud.google.com/recaptcha-enterprise/docs/choose-key-type?hl=ja

スコアベースキーは reCAPTCHA v3 と同じく、ユーザーに追加動作を求めずスコアを獲得します。
チェックボックスキーは reCAPTCHA v2 と同じく、チェックボックスのクリックを求めて、疑わしいユーザーには CAPTCHA チャレンジを追加で求めます。

ただしスコアは初期状態では 0.1、0.3、0.7、0.9 の4段階でしか返ってこないので 0.1 刻みの 11 段階のスコアが欲しい場合はかなり事前に google へ問い合わせをしておく必要があります。
詳細は [スコアの解釈](https://cloud.google.com/recaptcha-enterprise/docs/interpret-assessment-website?hl=ja) に記載

# reCAPTCHA classic キーについて
reCAPTCHA のキー作成画面には以下のような記載があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315470/6fae280d-2cc6-3c93-f794-01fb91712757.png)

個の右下の「Switch to create a classic key」を押下すると GCP で管理されない旧来の reCAPTCHA キーを作成することができます。

これを選択せず普通に作成すると GCP プロジェクト情報の選択を求められて、作成したキーはそのプロジェクトの reCAPTCHA enterprise 管理画面でも確認できるようになります。

また、classic key も作成後に reCAPTCHA enterprise 管理画面から enterprise 対応キーにアップグレードすることが可能です。

ただし、前述の通り reCAPTCHA Android キーは classic でしか作成できないので、これはアップグレード不能かもしれません。(未確認) 


# バージョンごとの料金や利用制限
https://cloud.google.com/recaptcha-enterprise/docs/compare-versions?hl=ja

## reCAPTCHA
[よくある質問 - reCAPTCHA の使用に QPS や 1 日あたりの上限はありますか？](https://developers.google.com/recaptcha/docs/faq?hl=ja#are-there-any-qps-or-daily-limits-on-my-use-of-recaptcha)

v2, v3 は無料だが、1ヶ月に100万回までという呼び出し制限がある。
それ以上の呼び出しを行う場合はクォータの例外承認をよくある質問にあるフォームからリクエストするか enterprise の利用を求められます。

## reCAPTCHA enterprise
enterprise も1ヶ月に100万回までは無料枠があります。
それ以降は料金表に応じたコストが発生します。

https://cloud.google.com/security/products/recaptcha-enterprise/pricing?hl=ja

また、料金表には 1,000万回 / 月 を超える利用の場合はスコア制限の解除と同じく申請をするように記載されています。


# 補遺1: classic ではない reCAPTCHA キーはどの料金や利用制限に従う？
それなりに詳しく書いたつもりですが、以上が基本的にドキュメントや他の記事で収集できる reCAPTCHA の各バージョンに関する情報でしょう。

ここでちょっと気になることがあります。

## 疑問
- reCAPTCHA (v2, v3) と reCAPTCHA enterprise では利用制限や料金体系が異なる
- 現在は、reCAPTCHA 管理コンソールからは reCAPTCHA, reCAPTCHA enterprise のどちらでも管理できる v2, v3 のキーがデフォルトで作成される

ならば enterprise でも管理できる v2, v3 キーを作成したら利用制限や料金は何に従っている？
そもそもこのキーの扱いは reCAPTCHA enterprise のものなのか？reCAPTCHA のものなのか？


## 回答
※公式回答ではなくあくまで個人の推測です

先ほどの料金や利用制限に関してはこれまで調べた reCAPTCHA キーに関する情報ではなく、このキーを使って呼び出す reCAPTCHA API についての情報だと考えます。

これまでいくつかドキュメント上で 非表示の reCAPTCHA が v2 を名乗らないことがあるなど、用語のずれのようなものがありましたが、同じような現象としてドキュメント上ではよく reCAPTCHA キー のことも reCAPTCHA API の事も単に reCAPTCHA と呼ばれているようです。

API にも reCAPTCHA と reCAPTCHA enterprise があります。

reCAPTCHA enterprise を例にとると、ユーザーの評価を行うためには
1. reCAPTCHA キーを使って grecaptcha.enterprise.execute() で token の取得
1. reRAPTCHA enterprise API の [projects.assessments.create](https://cloud.google.com/recaptcha-enterprise/docs/reference/rest#rest-resource:-v1.projects.assessments) メソッドに reCAPTCHA キーや token を報告しスコアの取得
の2手順を踏む必要があります。

ここで改めて[reCAPTCHA Enterprise の料金](https://cloud.google.com/security/products/recaptcha-enterprise/pricing?hl=ja)を確認すると、`assessments.create` について料金が記載されています。

また、料金表には「不正防止の料金」という表があるが、これは「reCAPTCHA Enterprise の不正防止 (reCAPTCHA Enterprise Fraud Prevention)」の事です。
ドキュメントによると reCAPTCHA Enterprise の不正防止を実装する際も普通に enterprise のスコアキーの作成を求められます。

https://cloud.google.com/recaptcha-enterprise/docs/fraud-prevention?hl=ja

つまり、この料金表は reCAPTCHA Enterprise API についてのものなのでしょう。

よって、enterprise で管理できる v2, v3 のキーを作成しても非 enterprise の API を利用している場合、料金が発生することはなく、利用制限が発生すると思われます。

# 補遺2: 残る未検討・未検証な疑問
今回ドキュメントを読み、実装をしている中で浮かんだ疑問はまだある。
興が乗れば追加で検証をしたい。

1. enterprise ではスコアベースキーかチェックボックスキーしか作成できないが、v2 で作成した非表示キーは enterprise 管理にできる。これを使えば enterprise で web ページに「非表示の reCAPTCHA」を実行できる？
1. v2 として作成したキーも enterprise API で検証を行えば正否ではなくスコアを取得できる？
1. token 発行までなら無制限なのか？