このドキュメントでは、ユースケースに応じて適切なアプリ ID を選択する方法について説明します。
Android の権限の概要については、権限 概要をご覧ください。Android の権限に関するベスト プラクティスについては、アプリの権限に関するおすすめの設定をご覧ください。
Android ID の使用に関するベスト プラクティス
ユーザーのプライバシーを保護するために、最も制限の厳しい ID を使用してください。 アプリのユースケースに適している特に、次のベスト プラクティスに従ってください。
- 可能な限り、ユーザーがリセット可能な識別子を選択します。再設定不可能なハードウェア ID 以外の ID を使用していても、アプリはユースケースのほとんどを実現できます。
ハードウェア ID を使用しない。ほとんどのユースケースでは International Mobile Equipment Identity(国際移動機構番号)などのハードウェア識別子を使用する 。
Android 10(API レベル 29)以降、IMEI やシリアル番号など、リセット不可能な ID に関して制限が追加されています。アプリはデバイスまたは プロファイル所有者 アプリ、 特別な配送業者が 許可する、または
READ_PRIVILEGED_PHONE_STATE
特権が必要です。 識別しますユーザー プロファイル作成や広告のユースケースでは広告 ID だけを使用する。広告 ID を使用する際は、必ず広告のトラッキングに関するユーザーの選択を尊重するようにしてください。条件 広告 ID と個人を特定できる情報を 使用者の明示的な同意がある場合にのみ、 user です。
広告 ID のリセットをブリッジしない。
Firebase インストール ID(FID)または非公開に保存された GUID を ほぼすべてのユースケースに対応できます。ただし、不正行為の防止と サポートしています。広告以外のほとんどのユースケースでは、FID または GUID 十分でしょう
ユースケースに適した API を使用してプライバシーを最小限に抑える おすすめします。価値の高いコンテンツの保護には DRM API を、不正行為防止には Play Integrity API を使用します。Play Integrity API は、プライバシー リスクを発生させずにデバイスが正規品であるかどうかを判定できる最も簡単な手段です。
このガイドの残りのセクションでは、Terraform のコンテキストでこれらのルールについて Android アプリの開発です。
広告 ID を使用する
広告 ID は、ユーザーがリセットできる識別子であり、広告のユースケースに適しています。ただし、広告 ID を使用する際は、いくつか注意事項があります。
広告 ID のリセットに関しては、常にユーザーの意図を尊重する。ユーザーの同意なく、ユーザーによるリセットをブリッジする(別の ID やフィンガープリントを使用して新しい広告 ID とリンクする)ことはしないでください。Google Play デベロッパー コンテンツ ポリシーでは、 次のとおりです。
「リセットした場合、新しい広告 ID を 以前の広告 ID または以前の広告から取得したデータ ユーザーの明示的な同意を得ずにコンテンツを識別します。
関連付けられているパーソナライズド広告フラグを必ず尊重する。広告 ID
ユーザーがイベントに関連付けられたトラッキングの量を制限できる
あります。必ず AdvertisingIdClient.Info.isLimitAdTrackingEnabled()
メソッドを使用して、ユーザーが選択した設定が無視されることのないようにしてください。Google Play デベロッパー コンテンツ ポリシーに次のような規定があります。
「...ユーザーが指定した [インタレスト ベース広告をオプトアウト] または [広告のカスタマイズをオプトアウトする] の設定を遵守する必要があります。ユーザーがこの設定を有効にしている場合、広告の目的のために、またはユーザーをパーソナライズド広告の対象にするために、広告 ID を使用して、ユーザー プロファイルを作成しないでください。許可されるアクティビティには、コンテンツ ターゲット広告、フリークエンシー キャップ、コンバージョンが含まれます トラッキング、レポート、セキュリティと不正行為の検出です。」
広告 ID の使用に関して、使用している SDK に適用されるプライバシー ポリシーやセキュリティ ポリシーに注意する。たとえば、true
を
enableAdvertisingIdCollection()
使用する場合は、Google アナリティクス SDK の
該当するアナリティクス SDK
に関するポリシー。
また、Google Play デベロッパー コンテンツ ポリシーは、広告 ID を「個人情報にリンクしたり、永続的なデバイス ID(SSAID、MAC アドレス、IMEI など)に関連付けたりしない」ことを求めています。
例として、データベースに入力するための情報を収集するとします。 次の列を含むテーブル:
TABLE-01 | |||
timestamp |
ad_id |
account_id |
clickid |
TABLE-02 | |||
account_id |
name |
dob |
country |
この例の場合、両方のテーブルの account_id
列を使用することで、ad_id
列と PII を関連付けることができます。ただし、ユーザーの明示的なパーミッションなくこの処理を行うと、Google Play デベロッパー コンテンツ ポリシーに違反することになります。
なお、広告主 ID と個人情報(PII)のリンクは必ずしもこのとおりとは限りません 明示的です。PII と広告 ID をキーとするテーブルの両方に「疑似識別子」が存在する可能性があり、そのことによって問題が発生することもあります。たとえば、TABLE-01 と TABLE-02 を次のように変更するとします。
TABLE-01 | ||||
timestamp |
ad_id |
clickid |
dev_model |
|
TABLE-02 | ||||
timestamp |
demo |
account_id |
dev_model |
name |
このケースでもクリック イベントの発生はまれですが、 広告主 ID TABLE-01 と TABLE-02 に含まれる PII を、 タイムスタンプとデバイスモデルが含まれます。
多くの場合、そのような疑似識別子が存在しないことを保証するのは困難 結合する方法を一般化することで、明らかな結合のリスクを回避できます。 使用することは避けましょう。この例では、タイムスタンプの精度を低下させると、同じモデルの複数のデバイスが同じタイムスタンプで存在することになります。
他にも次のような解決策が考えられます。
PII と広告 ID を明示的にリンクするようなテーブル設計は行わない。イン 上記の例の場合、
account_id
列は含まれません。 TABLE-01 に指定します。広告 ID をキーとするデータと PII の両方にアクセスできるユーザーまたはロールのアクセス制御リストの分離と監視。 両方のソースに同時にアクセスする(たとえば、テーブル間で JOIN を実行する)機能が厳密に制御および監査されている場合、広告 ID と PII の関連付けから生じるリスクが軽減されます。一般的に、アクセスの制御とは、次の操作のことです。
- 広告主 ID をキーとするデータと個人情報(PII)のアクセス制御リスト(ACL)を保持する 分離して、両方に属する個人または役割の数を ACL を使用します。
- アクセスログ作成と監査の機能を実装し、ルールの例外を検知して管理する。
広告 ID の望ましい使用方法について詳しくは、AdvertisingIdClient
API リファレンスをご覧ください。
FID と GUID を操作する
デバイス上で実行されているアプリのインスタンスを特定する方法としては、Firebase インストール ID(FID)が最もわかりやすく、広告以外の大多数のユースケースではこの方法をおすすめします。インスタンス ID にアクセスできるのは、割り当てられたアプリ インスタンスだけに限られます。また、インスタンス ID は、アプリがインストールされている間しか存続しないため、比較的簡単にリセットできます。
そのため FID は、
デバイス スコープのハードウェア ID。リセットできません。詳しくは、
firebase.installations
API リファレンス。
FID を使用することが実用的でないケースでは、カスタム GUID(Globally-Unique ID)を使用してアプリ インスタンスを一意に識別することもできます。最も簡単なのは、次のコードを使用して独自の GUID を作成する方法です。
Kotlin
var uniqueID = UUID.randomUUID().toString()
Java
String uniqueID = UUID.randomUUID().toString();
この識別子はグローバルに一意であるため、特定のアプリ インスタンスの識別に使用できます。複数のアプリ間での識別子の関連付けによる問題を避けるため、GUID は外部(共有)ストレージではなく内部のストレージに保存します。詳細情報 詳しくは、データとファイルの保存に関するページ 概要ページをご覧ください。
MAC アドレスは使用しない
MAC アドレスはグローバルに一意であり、ユーザーによるリセットは不可能で、工場出荷後も維持されます。 できます。このような理由から、ユーザーのプライバシーを保護するため、Android バージョン 6 以降では、MAC アドレスへのアクセスはシステムアプリに制限されています。サードパーティ製アプリはアクセスできません。
Android 11 で使用できる MAC アドレスの変更
Android 11 以降をターゲットとするアプリの場合、Passpoint の MAC アドレスのランダム化 Passpoint プロファイルごとに設定され、 次のフィールドがあります。
- 完全修飾ドメイン名(FQDN)
- レルム
- 認証情報(Passpoint プロファイルで使用される認証情報に基づく):
- ユーザー認証情報: ユーザー名
- 証明書の認証情報: 証明書と証明書タイプ
- SIM 認証情報: EAP タイプと IMSI
また、非特権アプリはデバイスの MAC アドレスにアクセスできません。専用
IP アドレスを持つネットワーク インターフェースが表示されます。これにより、getifaddrs()
メソッドと NetworkInterface.getHardwareAddress()
メソッドのほか、RTM_GETLINK
Netlink メッセージの送信が影響を受けます。
この変更がアプリに与える影響は次のとおりです。
NetworkInterface.getHardwareAddress()
はどのインターフェースにも null を返します。- アプリは
NETLINK_ROUTE
ソケット上でbind()
関数を使用できません。 ip
コマンドはインターフェースに関する情報を返しません。- アプリは
RTM_GETLINK
メッセージを送信できません。
デベロッパーは通常、下位レベルの NetworkInterface
API、getifaddrs()
API、Netlink ソケットではなく、ConnectivityManager
の上位レベル API を使用してください。たとえば、
ConnectivityManager.registerNetworkCallback()
を使用してネットワークの変更をリッスンすることにより、現在のルートでこの情報を取得できます。
関連付けられているネットワークの
LinkProperties.getRoutes()
。
識別子の特性
Android OS では、動作特性の異なるさまざまな ID を使用できます。どの ID を使用するべきかは、以下の特性がそのユースケースでどのように機能するかによって判断します。これらの特性にはプライバシーへの影響もあります ですからこれらの特性がビジネスモデルと 相互に通信します。
範囲
識別子のスコープとは、どのシステムがその識別子にアクセスできるかということです。Android 通常、識別子のスコープには次の 3 種類があります。
- 単一アプリ: 識別子はアプリの内部に存在し、他のアプリからはアクセスできません。
- アプリグループ: 所定の関連アプリグループからアクセスできます。
- デバイス: デバイスにインストールされたすべてのアプリからアクセスできます。
識別子に付与されるスコープが広いほど、識別子が悪用されるリスクは高くなる 使用しないでください。反対に、単一のアプリ インスタンスからしかアクセスできない識別子であれば、複数のアプリでの複数のトランザクションを対象としたデバイスのトラッキングに使用することはできません。
リセット可能性と永続性
リセット可能性と永続性により、識別子の有効期間が定義され、 確認します。一般にリセットのトリガーとなるイベントは、アプリ内リセット、システム設定を介したリセット、起動時のリセット、インストール時のリセットなどです。Android 識別子の有効期間にはばらつきがあるが、通常、識別子の有効期間は ID のリセット方法を指定します。
- セッションのみ: ユーザーがアプリを再起動するたびに新しい ID が使用されます。
- インストール リセット: ユーザーがアプリをアンインストールして再インストールするたびに新しい ID が使用されます。
- FDR リセット: ユーザーがデバイスを初期化するたびに新しい ID が使用されます。
- FDR 後存続: デバイスを初期化しても ID は失われません。
リセットできる場合、ユーザーは既存のプロファイル情報との関連付けが解除された新しい ID を作成できます。期間が長く、信頼性が高いほど、 初期状態へのリセット後も持続する ID、 ユーザーが長期的な追跡の対象となるリスクが高くなります。アプリの再インストール時に識別子がリセットされる場合は、アプリ内やシステム設定からユーザーが明示的に識別子をリセットする手段がなくても、識別子の永続性が低くなり、ID をリセットする手段が提供されることになります。
一意性
一意性は、衝突の可能性を確立する。つまり
識別子が、関連付けられたスコープ内に存在します。一意性が最高レベルの GUID(Globally-Unique ID)の場合、他のデバイスやアプリも含めて競合は発生しません。それ以外の場合、一意性のレベルは、識別子のエントロピーと識別子の作成に使用したランダム性のソースによって異なります。たとえば、
カレンダーの日付でシードされたランダムな識別子では、
インストール(2019-03-01
など)は、Unix でシードされた識別子を使用する場合との比較
インストールのタイムスタンプ(1551414181
など)。
一般に、ユーザー アカウント ID は一意であると見なすことができます。つまり、 デバイスとアカウントの組み合わせには、一意の ID があります。一方、母集団の中で識別子の一意性のレベルが低くなると、個々のユーザーのトラッキングに使用される際の有用性が低くなるため、プライバシーの保護が強化されます。
整合性保護と否認防止
なりすましやリプレイが難しい識別子を使用して、 関連付けられたデバイスまたはアカウントに、特定のプロパティがあります。たとえば、デバイスがスパム送信者が使用している仮想デバイスではないことを証明できます。なりすましが難しい ID は、否認防止性も備えています。デバイスが 秘密鍵でメッセージに署名すると、 メッセージを送信しました。否認防止は、ユーザーが求めているものもあれば、 たとえば、支払いの認証などの目的でこれを行う必要がある場合や、 後悔するようなメールを送るときです
一般的なユースケースと使用すべき識別子
このセクションでは、ハードウェア ID(IMEI など)の代わりに使用できる ID について説明します。使用 ハードウェア ID はユーザーがリセットできないため、推奨されません。また、 デバイスに適用されます。多くの場合、アプリをスコープとする ID で十分です。
アカウント
携帯通信会社のステータス
アプリが携帯通信会社アカウントを使用してデバイスの通話機能やテキスト メッセージ機能を操作する場合です。
推奨される ID: IMEI、IMSI、Line1
この ID が推奨される理由
携帯通信会社に関連する機能に必要な場合にはハードウェア識別子の使用が認められます。たとえば、これらの識別子を使用して、 携帯通信会社や SIM スロットの切り替え、SMS メッセージの配信を IP(Line1 用)- SIM ベースのユーザー アカウント。ただし、権限のないアプリについては、 アカウント ログインを使用してユーザーのデバイス情報を取得することを推奨 あります。その理由の一つとして、Android 6.0(API レベル 23)以降では、 これらの識別子は実行時の権限でのみ使用できます。ユーザーがこの権限をオフにする可能性があるため、アプリの方で例外を適切に処理する必要があります。
モバイル サブスクリプションのステータス
この場合は、アプリの機能をデバイス上の特定のモバイル サービス サブスクリプションに関連付ける必要があります。たとえば、あなたは Google Cloud の デバイスのモバイル情報に基づいて、特定のプレミアム アプリ機能へのアクセスを確認する 定期購入。
推奨される識別子: Subscription ID API。デバイスで使用されている SIM を識別します。
サブスクリプション ID は、サブスクリプションを一意に識別するためのインデックス値(1 から始まります) デバイスで使用されている、挿入された SIM(物理 SIM と電子 SIM を含む)を特定する ダウンロードしますこの ID により、アプリは特定の SIM のさまざまな定期購入情報に機能を関連付けることができます。この値は、デバイスが出荷時の設定にリセットされない限り、特定の SIM に対して安定的な値を示します。ただし、同じ SIM でデバイスごとに異なる定期購入 ID が割り当てられる場合や、異なる SIM でデバイスごとに同じ ID が割り当てられる場合もあります。
この ID が推奨される理由
一部のアプリでは、現在この目的で ICC ID を使用している場合があります。ICC ID はグローバルに一意であり再設定不可能なため、
は READ_PRIVILEGED_PHONE_STATE
のアプリに制限されています
権限が必要になります。Android 11 以降、Android はさらに
規則による ICCID へのアクセス制限
getIccId()
API のみをサポートしています。影響を受けるアプリは、代わりにサブスクリプション ID を使用するように移行する必要があります。
シングル サインオン
この場合、アプリはシングル サインオン エクスペリエンスを提供します。これにより、ユーザーは既存のアカウントを組織に関連付けることができます。
推奨される ID: アカウント マネージャーと互換性のあるアカウント(Google アカウントのリンクなど)
この ID が推奨される理由
Google アカウントのリンクを使用すると、ユーザーは既存の Google アカウントをアプリに関連付けることができ、組織のプロダクトやサービスにシームレスかつ安全にアクセスできます。また、カスタム OAuth スコープを定義して必要なデータのみを共有し、データの使用方法を明確に定義することで、ユーザーの信頼を高めることができます。
広告
ターゲティング
この場合、アプリはユーザーの興味 / 関心のプロフィールを構築し、より関連性の高い広告を表示します。
使用に推奨される識別子: アプリで広告、アップロード、 広告 ID である必要があります。
この ID が推奨される理由
これは広告関連のユースケースであり、利用可能な ID が必要になる場合があります 使用されるため、広告 ID は、 最適なソリューションを選ぶことができます広告配信 ID の使用が必須の場合、 使用ケースについて、 Google Play デベロッパー コンテンツ ポリシー ユーザーがリセットできるからです。
アプリでユーザーデータを共有するかどうかにかかわらず、広告目的でユーザーデータを収集して使用する場合は、Google Play Console の [アプリのコンテンツ] ページの [データ セーフティ] セクションで広告目的を宣言する必要があります。
測定
この場合、アプリは同じデバイス上の組織のアプリでのユーザーの行動に基づいて、ユーザーのプロファイルを作成します。
使用する推奨 ID: 広告 ID または Play インストール リファラー API
この ID が推奨される理由
これは広告関連のユースケースであり、組織のさまざまなアプリで使用できる ID が必要となる可能性があるため、広告 ID が最適です。広告のユースケースで ID を使用する場合、その ID は ユーザーがリセットできるため、広告 ID である必要があります。詳しくは、 Google Play デベロッパー コンテンツ ポリシー
コンバージョン
マーケティング戦略の成否を判断するためにコンバージョンをトラッキングするケースが該当します。
推奨される識別子: Advertising ID API または Play Install Referrer API
この ID が推奨される理由
これは広告関連のユースケースであり、組織のさまざまなアプリで使用できる ID が必要となる可能性があるため、広告 ID が最適です。Google Play デベロッパー コンテンツ ポリシーの規定により、広告のユースケースでは、ユーザーがリセット可能な広告 ID を使用する必要があります。
リマーケティング
この場合、アプリはユーザーの過去の興味 / 関心に基づいて広告を表示します。
推奨される識別子: 広告 ID
この ID が推奨される理由
これは広告関連のユースケースであり、利用可能な ID が必要になる場合があります 使用されるため、広告 ID は、 最適なソリューションを選ぶことができます広告配信 ID の使用が必須の場合、 使用ケースについて、 Google Play デベロッパー コンテンツ ポリシー ユーザーがリセットできるからです。
アプリ分析
この場合、アプリはユーザーの動作を評価して、以下を判断します。
- 組織の他のプロダクトやサービスのうち、 ユーザーです。
- ユーザーがアプリの使用に興味を持ち続けるようにする方法。
- ログアウトしたユーザーまたは匿名ユーザーの使用状況統計情報を収集、分析する。
考えられる解決策は次のとおりです。
- アプリセット ID: アプリセット ID を使用すると、広告目的でユーザーデータを使用しない限り、組織が所有する複数のアプリ全体でユーザーの行動を分析できます。Google Play を利用するデバイスをターゲットに設定している場合 アプリセット ID を使用することをおすすめします。
- Firebase ID(FID): FID のスコープは、作成元のアプリです。 は、識別子を使ってアプリをまたいでユーザーをトラッキングするのを防ぎます。また、 ユーザーはアプリのデータを消去したり、アプリを再インストールしたりできるため、簡単にリセットできます。「 FID の作成プロセスは簡単です。「新規顧客の獲得」目標を ご覧ください
アプリの開発
クラッシュ レポート
この例では、アプリがクラッシュするタイミングと理由に関するデータを収集しています。 制限します
推奨 ID: FID またはアプリセット ID
この ID が推奨される理由
FID は、その ID を作成したアプリがスコープとなるため、複数のアプリを横断してユーザーをトラッキングする目的には使用できないようになっています。また、簡単にリセットできます。 アプリデータを消去したり、アプリを再インストールしたりできます。FID の作成プロセスは、 わかりやすい詳しくは、 Firebase インストール ガイド アプリセット ID を使用すると、複数のアプリでのユーザー行動を、 ユーザーのデータを広告目的で使用しない限り、組織が所有する あります。
パフォーマンス レポート
この場合、アプリは、アプリの品質を改善するために、読み込み時間やバッテリー使用量などのパフォーマンス指標を収集します。
推奨される ID: Firebase Performance Monitoring
この ID が推奨される理由
Firebase Performance Monitoring を使用すると、重要な指標に集中できます アプリに加えた変更が及ぼす影響をテストできます。
アプリのテスト
この場合、アプリはテストまたはデバッグ目的で、アプリでのユーザー エクスペリエンスを評価します。
推奨される識別子: FID またはアプリセット ID
この ID が推奨される理由
FID は、その ID を作成したアプリがスコープとなるため、複数のアプリを横断してユーザーをトラッキングする目的には使用できないようになっています。また、ユーザーがアプリのデータを消去したりアプリを再インストールしたりすることで簡単にリセットできます。FID の作成プロセスは簡単です。Firebase インストール ガイドをご覧ください。アプリセット ID を使用すると、複数のアプリでのユーザー行動を、 ユーザーのデータを広告目的で使用しない限り、組織が所有する あります。
クロスデバイスでのインストール
1 人のユーザーが複数のデバイス上に同じアプリをインストールした場合に、アプリ インスタンスを正しく識別する必要があるケースが該当します。
推奨される ID: FID または GUID
この ID が推奨される理由
FID はこの目的で明示的に設計されています。スコープは 異なるアプリ間のユーザー トラッキングには使用できません。また、 アプリの再インストール時にリセットされます。まれに FID が GUID を使用することもできます。
セキュリティ
不正行為の検出
バックエンド サービスを攻撃する複数のフェイク デバイスを検知するケースが該当します。
推奨される ID: Google Play Integrity API 完全性トークン
この ID が推奨される理由
リクエストの送信元が正規の Android デバイスではなく正規の Android デバイスであることを確認する エミュレータなど、他のデバイスになりすましているコードに対しては、 Google Play Integrity API。
広告の不正行為
この例では、アプリでのユーザーのインプレッションとアクションが 本物であり、検証可能です。
推奨される識別子: 広告 ID
この ID が推奨される理由
Google Play デベロッパー コンテンツ ポリシーの規定により、広告のユースケースでは、ユーザーがリセット可能な広告 ID を使用する必要があります。
デジタル著作権管理(DRM)
今回の場合、お客様のアプリは、 有料コンテンツなどです
推奨される ID: FID または GUID を使用すると、ユーザーに コンテンツの制限を回避するためにアプリを再インストールする ほとんどの人が抑止できるほどの重荷になっていました十分な保護が得られない場合は Android は、DRM API を使用して、 コンテンツへのアクセスを制限するために使用できます。これには APK ごとの ID、 Widevine ID。
ユーザー設定
この場合、アプリはデバイスごとのユーザー状態をアプリに保存します(特に、ログインしていないユーザーの場合)。この状態は、同じデバイスで同じ鍵で署名されている別のアプリに転送できます。
推奨される ID: FID または GUID
この ID が推奨される理由
ユーザーが設定をリセットするためにアプリを再インストールする場合があるため、再インストール後も存続する情報を使用することは推奨されません。