Play Integrity API の概要

Play Integrity API は、不正行為や不正アクセスなど、潜在的に危険で不正な操作からアプリやゲームを保護するのに役立ちます。この API により、デベロッパーは、攻撃を回避し不正行為を減らすための適切な措置を講じることができます。

Android 4.4(API レベル 19)以降を搭載しているデバイスでアプリまたはゲームが使用されている場合、Play Integrity API は、次の情報を含む署名付きの暗号化されたレスポンスを返します。

  • 正規のアプリバイナリ: Google Play で認識されている、改変されていないバイナリとやり取りしているかどうかを判断します。
  • 正規の Play インストール: 現在のユーザー アカウントにライセンスが付与されているかどうか(つまりユーザーが Google Play でアプリまたはゲームのインストールや支払いを行ったかどうか)を判断します。
  • 正規の Android デバイス: Google Play 開発者サービスを搭載した正規の Android デバイスでアプリが動作しているかどうかを示します。

利用規約とデータ セーフティ

Play Integrity API にアクセスするか Play Integrity API を使用すると、Play Integrity API 利用規約に同意したものと見なされます。適用されるすべての利用規約とポリシーを読んで理解したうえで、API にアクセスしてください。

Google Play には、デベロッパーがアプリによるデータの収集および共有とアプリのセキュリティ対策を開示するためのデータ セーフティ セクションがあります。データ セーフティ セクションの要件を遵守するために、Play Integrity API によるデータ処理の仕組みに関する情報をご参照ください。

セキュリティ上の考慮事項

Play Integrity API はセキュリティを強化し、改ざんを防止しますが、以下のおすすめの方法を実施すると、アプリで最大限の効果を発揮します。

不正使用対策戦略を持つ

Play Integrity API は、単独の不正使用対策メカニズムとして使用するのでなく、不正使用対策戦略の一環として他のシグナルと併用すると、最大限の効果を発揮します。この API は、アプリに適した他のセキュリティに関するおすすめの方法と組み合わせて使用してください。

完全性トークンを頻繁に取得しない

完全性トークンの生成は、時間とデータと電力を消費します。各アプリには、使用量ティアで定義されている 1 日あたりの呼び出し回数の上限があります。したがって、この API の呼び出しは、ユーザー エクスペリエンスにとって不可欠な、価値が高く頻度が低いアクション(サービスへのログインやマルチプレーヤー サーバーへの参加など)を保護する場合に限定する必要があります。この API は、頻度の高いアクションや価値の低いアクションでは呼び出さないでください。たとえば、アプリがフォアグラウンドに移行するたびに呼び出したり、バックグラウンドで数分おきに呼び出したりしないでください。API 呼び出しを多く行うアプリは、不適切な実装からユーザーを保護するためにスロットリングされる可能性があります。

ノンス フィールドを使用してアプリの保護を強化する

Play Integrity API には nonce というフィールドが用意されています。このフィールドを使用すると、リプレイ攻撃や中間者(PITM)改ざん攻撃のような特定のタイプの攻撃から、アプリをさらに強力に保護することができます。Play Integrity API は、このフィールドに設定した値を、署名付きの完全性レスポンス内で返します。アプリを攻撃から保護するには、ノンスを生成する方法のガイダンスに記載されている手順を慎重に実施してください。

安全なサーバー環境を使用する

復号と検証はすべて、安全なサーバー環境内で行ってください。クライアント アプリからなんらかのセキュリティの詳細情報が漏洩すると、攻撃者が APK またはリポジトリからその情報を抽出して、アプリまたはゲームに関する貴重な情報を入手する可能性があります。

サーバーからアプリに多様なレスポンスを送信する

サーバーからアプリに対して毎回同じ成功 / 失敗レスポンスをバイナリで返すよりも、さまざまな決定結果を返す方が適切です。その方が、複製が難しくなるからです。たとえば、「許可」、「制限付きで許可」、「reCAPTCHA の完了後に制限付きで許可」、「拒否」のような一連の関連するレスポンスを使用します。

階層型の適用戦略を持つ

Google Play Console では、追加のデバイスラベルを受け取るように設定することで、複数の階層で適用される不正使用対策戦略を構築できます。追加のラベルを受け取るように設定すると、それぞれのラベル基準が満たされた場合、同じデバイスに対する複数のラベルが完全性レスポンスに含まれるようになります。これにより、返される可能性のあるレスポンスの範囲に応じて異なる動作をするバックエンド サーバーを準備できます。

たとえば、MEETS_BASIC_INTEGRITYMEETS_DEVICE_INTEGRITYMEETS_STRONG_INTEGRITY を返すデバイスは、MEETS_BASIC_INTEGRITY のみを返すデバイスよりも、信頼性が高くなります。サーバーのレスポンスは、必要に応じて構成できます。このアプローチを、ユーザー アカウントが LICENSED であるか UNLICENSED であるかに応じて、異なるアクションと組み合わせることができます。

指数バックオフで再試行する

不安定なインターネット接続や過負荷のデバイスといった環境条件が原因で、デバイスの完全性チェックが失敗することがあります。そのために、本来であれば信頼性が高いデバイスのラベルが生成されないことがあります。こうした条件の影響を軽減するには、指数バックオフによる再試行オプションを追加してください。

実用的なエラー メッセージを表示する

可能であれば、有用なエラー メッセージをユーザーに提供して、再試行、インターネット接続の有効化、Google Play ストア アプリが最新かどうかのチェックといった解決手段をユーザーに伝えてください。

不測の問題や障害に対する計画を立てる

Play ステータス ダッシュボードには、Play Integrity API のサービスのステータスに関する情報に加えて、停止や障害に関する情報も表示されます。Play Integrity API で万が一大規模な障害が起きた場合に備えて、バックエンド サーバーの動作を事前に構成できます。

API の使用方法の概要

図 1. Play Integrity API の設計の概要を示すシーケンス図。

ユーザーがアプリで実行する価値の高いアクションを完全性チェックで保護したい場合は、次の手順を実施します。

  1. アプリのサーバーサイド バックエンドが、一意の値を生成してクライアントサイド ロジックに送信します。以下、このロジックを「アプリ」と呼びます。
  2. アプリが、一意の値と、ユーザによる価値の高いアクションの内容からノンスを作成します。次に、アプリが Play Integrity API を呼び出し、ノンスを渡します。
  3. アプリが、Play Integrity API から署名付きの暗号化された判定結果を受け取ります。
  4. アプリが、署名付きの暗号化された判定結果をアプリのバックエンドに渡します。
  5. アプリのバックエンドが、判定結果を Google Play サーバーに送信します。Google Play サーバーが判定結果を復号して検証し、その結果をアプリのバックエンドに返します。
  6. アプリのバックエンドが、トークン ペイロードに含まれるシグナルに基づいて処理方法を決定します。
  7. アプリのバックエンドが決定結果をアプリに送信します。

API の使用量ティア

API のリクエスト回数には、呼び出し元アプリに割り当てられた使用量ティアに基づいて適用される、アプリごとの 1 日あたりの上限があります。次の表に、ティアの一覧を示します。

表 1. Play Integrity API の使用量ティア
使用量ティア 1 日あたりの許容される API 呼び出し回数 条件
標準 最大 10,000 どの配信チャネルのアプリでも利用可能
10,000 超 - 上限は承認が必要 再試行を含む API ロジックを正しく実装する必要がある
Google Play だけでなく、あらゆる配信チャネルのアプリで利用可能

Google Play と他の配信チャネルでパッケージ名が同じであれば、API の使用量に関して同一のアプリとしてカウントされます。パッケージ名の異なる複数のアプリに対して、1 つの Google Cloud プロジェクト ID を使用できます。その場合、API の使用量に関しては同一のアプリとしてカウントされます。

使用量ティアを表示する

Play Integrity API を操作する頻度を評価できるようにするために、Google Play Console にはアプリの使用量ティアが表示されます。この使用量ティアを表示する手順は次のとおりです。

  1. Google Play Console にログインします。
  2. Play Integrity API を使用しているアプリを選択します。
  3. 左側のメニューの [リリース] セクションで、[設定] > [アプリの完全性] に移動します。
  4. [Integrity API] タブの [設定] セクションで、使用量ティア プロパティを見つけます。このプロパティの値が、アプリの使用量ティアを示します。

使用量ティアを変更する

アプリの使用量ティアの変更をリクエストするには、こちらのフォームをご利用ください。アプリで処理するユーザーの数を増やす必要があるものの、ユーザーごとに API を呼び出す頻度を増やす必要がない場合は、使用量ティアの引き上げをリクエストする必要があります。使用量ティアを引き上げる場合でも、アプリでは引き続き API 呼び出しを低頻度で価値の高いアクションに制限する必要があります。

割り当てモニタリングと割り当てアラートを設定する

ティア引き上げのリクエストは、通常であれば数営業日で処理されます。緊急事態を回避して良好なユーザー エクスペリエンスを維持するには、Cloud Monitoring でアプリの API 割り当て使用量のモニタリングとアラートを設定することをおすすめします。