一意の識別子に関するおすすめの方法

このドキュメントでは、ユースケースに応じて適切なアプリ ID を選択する方法について説明します。

Android のパーミッションの概要については、権限の概要をご覧ください。Android の権限に関するベスト プラクティスについては、アプリの権限に関するおすすめの設定をご覧ください。

Android ID の使用に関するベスト プラクティス

ユーザーのプライバシーを保護するには、アプリのユースケースに対応した最も制限の厳しい識別子を使用します。特に、次のベスト プラクティスに従ってください。

  1. 可能な限り、ユーザーがリセット可能な識別子を選択します。再設定不可能なハードウェア ID 以外の ID を使用していても、アプリはユースケースのほとんどを実現できます。
  2. ハードウェア ID を使用しない。ほとんどのユースケースにおいて、必要な機能を制限することなく、国際移動体装置識別番号(IMEI)などのハードウェア ID を使用しないように選択することができます。

    Android 10(API レベル 29)以降、IMEI やシリアル番号など、リセット不可能な ID に関して制限が追加されています。このような ID にアクセスできるのは、デバイス オーナーまたはプロファイル オーナーのアプリや、特別な携帯通信会社パーミッションを持っているアプリ、READ_PRIVILEGED_PHONE_STATE 特権パーミッションを持っているアプリに限られます。

  3. ユーザー プロファイル作成や広告のユースケースでは広告 ID だけを使用する。広告 ID を使用する際は、必ず広告のトラッキングに関するユーザーの選択を尊重するようにしてください。広告 ID を個人を特定できる情報に関連付ける必要がある場合は、ユーザーの明示的な同意がある場合にのみ行ってください。

  4. 広告 ID のリセットをブリッジしない。

  5. 不正決済防止と電話機能のユースケースを除き、他のすべてのユースケースでは、可能な限り Firebase インストール ID(FID)または非公開環境に保存した GUID を使用する。広告以外のユースケースのほとんどでは、FID または GUID を使用するだけで十分です。

  6. プライバシーに関するリスクを最小限に抑えるため、ユースケースに適した API を使用する。価値の高いコンテンツの保護には DRM API を、不正行為防止には Play Integrity API を使用します。Play Integrity API は、プライバシー リスクを発生させずにデバイスが正規品であるかどうかを判定できる最も簡単な手段です。

以下のセクションでは、Android アプリの開発時に上記のルールをどのように適用するのかについて詳細に説明します。

広告 ID を使用する

広告 ID は、ユーザーがリセットできる識別子であり、広告のユースケースに適しています。ただし、広告 ID を使用する際は、いくつか注意事項があります。

広告 ID のリセットに関しては、常にユーザーの意図を尊重する。ユーザーの同意なく、ユーザーによるリセットをブリッジする(別の ID やフィンガープリントを使用して新しい広告 ID とリンクする)ことはしないでください。Google Play デベロッパー コンテンツ ポリシーに次のような規定があります。

「リセットが行われた場合に、ユーザーの明示的な同意なしに、新しい広告 ID と、以前の広告 ID や以前の広告 ID から派生したデータとをリンクしてはなりません。」

関連付けられているパーソナライズド広告フラグを必ず尊重する。ユーザーが広告 ID に関連付けられているトラッキングの頻度や範囲を制限できるように広告 ID を設定することができます。必ず AdvertisingIdClient.Info.isLimitAdTrackingEnabled() メソッドを使用して、ユーザーが選択した設定が無視されることのないようにしてください。Google Play デベロッパー コンテンツ ポリシーに次のような規定があります。

「...ユーザーが指定した [インタレスト ベース広告をオプトアウト] または [広告のカスタマイズをオプトアウトする] の設定を遵守する必要があります。ユーザーがこの設定を有効にしている場合、広告の目的のために、またはユーザーをパーソナライズド広告の対象にするために、広告 ID を使用して、ユーザー プロファイルを作成しないでください。広告 ID の使用が許可されるアクティビティは、コンテンツ ターゲット広告や、フリークエンシー キャップ、コンバージョン トラッキング、レポート作成、セキュリティ / 不正行為検出などに限られます。」

広告 ID の使用に関して、使用している SDK に適用されるプライバシー ポリシーやセキュリティ ポリシーに注意する。たとえば、Google アナリティクス SDK の enableAdvertisingIdCollection() メソッドに true を渡す場合、必ず、適用されるすべてのアナリティクス 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

この場合は、クリック イベントがごくまれにしか発生しなかったときに、イベントのタイムスタンプとデバイスモデルを使用して TABLE-01 の広告主 ID と TABLE-02 の PII が関連付けられる可能性があります。

多くの場合、データセットにこのような疑似識別子が一切存在しないようにすることは困難ですが、関連付けが発生する明らかなリスクがある場合については、できる限り一意のデータを一般化することによってリスクを回避できます。この例では、タイムスタンプの精度を低下させると、同じモデルの複数のデバイスが同じタイムスタンプで存在することになります。

他にも次のような解決策が考えられます。

  • PII と広告 ID を明示的にリンクするようなテーブル設計は行わない。上記の最初の例でこのようにすると、account_id 列が TABLE-01 に含まれません。

  • 広告 ID のキー付きデータと PII の両方にアクセスできるユーザーまたは役割のアクセス コントロール リストを分離および監視する。両方のソースに同時にアクセスする(たとえば、テーブル間で JOIN を実行する)機能が厳密に制御および監査されている場合、広告 ID と PII の関連付けから生じるリスクが軽減されます。一般的に、アクセスの制御とは、次の操作のことです。

    1. 広告主 ID をキーとするデータ用と PII 用の各アクセス制御リスト(ACL)を相互に関連付けないように維持し、両方の ACL に含まれるメンバーやロールの数を最小限に抑える。
    2. アクセスログ作成と監査の機能を実装し、ルールの例外を検知して管理する。

広告 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 プロファイルごとに行われ、次のフィールドに基づいて一意の MAC アドレスが生成されます。

  • 完全修飾ドメイン名(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 など)に基づいて作成したランダム ID は、インストールの Unix タイムスタンプ(1551414181 など)に基づいて作成した ID に比べて、競合が発生する可能性が格段に高くなります。

一般に、ユーザー アカウント ID は一意であると見なすことができます。つまり、デバイスとアカウントの組み合わせによって、一意の ID を生成できます。一方、母集団の中で識別子の一意性のレベルが低くなると、個々のユーザーのトラッキングに使用される際の有用性が低くなるため、プライバシーの保護が強化されます。

整合性保護と否認防止

なりすましやリプレイ攻撃が難しい ID を使用することで、関連付けられているデバイスやアカウントが特定の特性を持っていることを証明できます。たとえば、デバイスがスパム送信者が使用している仮想デバイスではないことを証明できます。なりすましが難しい ID は、否認防止性も備えています。デバイスがシークレット鍵を使用してメッセージに署名すると、「他の誰かのデバイスがメッセージを送信した」と主張することは困難になります。否認防止は、ユーザーにとって望ましいものであるとき(決済の認証に使用する場合など)もあれば、望ましくないものであるとき(送信すべきでないメッセージを送信してしまった場合など)もあります。

一般的なユースケースと使用すべき識別子

このセクションでは、ハードウェア ID(IMEI など)の代わりに使用できる ID について説明します。ハードウェア ID は、ユーザーがリセットできず、デバイス全体がスコープとなるため、推奨されません。多くの場合、アプリをスコープとする ID で十分です。

アカウント

携帯通信会社のステータス

アプリが携帯通信会社アカウントを使用してデバイスの通話機能やテキスト メッセージ機能を利用するケースが該当します。

推奨される識別子: IMEI、IMSI、Line1

この ID が推奨される理由

携帯通信会社に関連する機能に必要な場合にはハードウェア識別子の使用が認められます。たとえば、ハードウェア識別子を使用して、他の携帯通信会社や SIM スロットに切り替えたり、IP(Line1 の場合) - SIM ベースのユーザー アカウントで SMS メッセージを送信したりできます。ただし、特権のないアプリの場合は、アカウント ログインを使用してサーバー側でユーザー デバイス情報を取得することをおすすめします。Android 6.0(API レベル 23)以降ではランタイム権限を介してのみハードウェア識別子を使用できるようになっていることも理由の 1 つです。ユーザーがこの権限をオフにする可能性があるため、アプリの方で例外を適切に処理する必要があります。

モバイル サブスクリプションのステータス

この場合は、アプリの機能をデバイス上の特定のモバイル サービス サブスクリプションに関連付ける必要があります。たとえば、デバイスの SIM 経由のモバイル サブスクリプションに基づいて、特定のプレミアム アプリ機能へのアクセスを確認する必要がある場合があります。

推奨される識別子: Subscription ID API。デバイスで使用されている SIM を識別します。

サブスクリプション ID は、デバイスで使用されている装着済みの SIM(物理 SIM、電子 SIM など)を一意に識別するためのインデックス値(1 から開始)を提供します。この ID により、アプリは特定の SIM のさまざまな定期購入情報に機能を関連付けることができます。この値は、デバイスが出荷時の設定にリセットされない限り、特定の SIM に対して安定的な値を示します。ただし、同じ SIM でデバイスごとに異なる定期購入 ID が割り当てられる場合や、異なる SIM でデバイスごとに同じ ID が割り当てられる場合もあります。

この ID が推奨される理由

一部のアプリでは、現在この目的で ICC ID を使用している場合があります。ICC ID はグローバルに一意でリセットできないため、Android 10 以降、アクセスは READ_PRIVILEGED_PHONE_STATE 権限を持つアプリに制限されています。Android 11 以降では、アプリの対象 API レベルに関係なく、getIccId() API を介した ICCID へのアクセスがさらに制限されました。影響を受けるアプリは、代わりにサブスクリプション ID を使用するように移行する必要があります。

シングル サインオン

この場合、アプリはシングル サインオン エクスペリエンスを提供します。これにより、ユーザーは既存のアカウントを組織に関連付けることができます。

推奨される ID: アカウント マネージャーと互換性のあるアカウント(Google アカウントのリンクなど)

この ID が推奨される理由

Google アカウントのリンクを使用すると、ユーザーは既存の Google アカウントをアプリに関連付けることができ、組織のプロダクトやサービスにシームレスかつ安全にアクセスできます。また、カスタム OAuth スコープを定義して必要なデータのみを共有し、データの使用方法を明確に定義することで、ユーザーの信頼を高めることができます。

広告

ターゲティング

この場合、アプリはユーザーの興味 / 関心のプロフィールを作成し、より関連性の高い広告を表示します。

推奨される ID: アプリが広告に ID を使用し、Google Play にアップロードまたは公開する場合、その ID は広告 ID である必要があります。

この ID が推奨される理由

これは広告関連のユースケースであり、組織のさまざまなアプリで使用できる ID が必要となる可能性があるため、広告 ID が最適です。Google Play デベロッパー コンテンツ ポリシーの規定により、広告のユースケースでは、ユーザーがリセット可能な広告 ID を使用する必要があります。

アプリでユーザーデータを共有するかどうかにかかわらず、広告目的でユーザーデータを収集して使用する場合は、Google Play Console の [アプリのコンテンツ] ページの [データ セーフティ] セクションで広告目的を宣言する必要があります。

測定

この場合、アプリは同じデバイス上の組織のアプリでのユーザーの行動に基づいて、ユーザーのプロファイルを作成します。

推奨される識別子: Advertising ID API または Play Install Referrer API

この ID が推奨される理由

これは広告関連のユースケースであり、組織のさまざまなアプリで使用できる ID が必要となる可能性があるため、広告 ID が最適です。広告のユースケースで ID を使用する場合は、ユーザーがリセットできる広告 ID である必要があります。詳しくは、Google Play デベロッパー コンテンツ ポリシーをご覧ください。

コンバージョン

マーケティング戦略の成否を判断するためにコンバージョンをトラッキングするケースが該当します。

推奨される識別子: Advertising ID API または Play Install Referrer API

この ID が推奨される理由

これは広告関連のユースケースであり、組織のさまざまなアプリで使用できる ID が必要となる可能性があるため、広告 ID が最適です。Google Play デベロッパー コンテンツ ポリシーの規定により、広告のユースケースでは、ユーザーがリセット可能な広告 ID を使用する必要があります。

リマーケティング

この場合、アプリはユーザーの過去の興味 / 関心に基づいて広告を表示します。

推奨される識別子: 広告 ID

この ID が推奨される理由

これは広告関連のユースケースであり、組織のさまざまなアプリで使用できる ID が必要となる可能性があるため、広告 ID が最適です。Google Play デベロッパー コンテンツ ポリシーの規定により、広告のユースケースでは、ユーザーがリセット可能な広告 ID を使用する必要があります。

アプリ分析

この場合、アプリはユーザーの動作を評価して、以下を判断します。

  • お客様に適した、組織の他のプロダクトやアプリ
  • ユーザーがアプリを使い続けるようにする方法。
  • ログアウトしたユーザーまたは匿名ユーザーの使用状況統計情報を収集、分析する。

考えられる解決策は次のとおりです。

  • アプリセット ID: アプリセット ID を使用すると、広告目的でユーザーデータを使用しない限り、組織が所有する複数のアプリ全体でユーザーの行動を分析できます。Google Play 開発者サービス搭載デバイスをターゲットとする場合は、アプリセット ID を使用することをおすすめします。
  • Firebase ID(FID): FID は、作成したアプリに適用されるため、複数のアプリでユーザーをトラッキングするために使用されることはありません。また、ユーザーがアプリのデータを消去したりアプリを再インストールしたりすることで簡単にリセットできます。FID の作成プロセスは簡単です。Firebase のインストール ガイドをご覧ください。

アプリの開発

クラッシュ レポート

この場合、アプリはユーザーのデバイスでクラッシュしたタイミングと原因に関するデータを収集します。

推奨される識別子: 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 人のユーザーが複数のデバイス上に同じアプリをインストールした場合に、アプリ インスタンスを正しく識別する必要があるケースが該当します。

推奨される識別子: FID または GUID

この ID が推奨される理由

FID は、まさにこの目的のために設計されています。スコープがそのアプリに限定されているため、複数のアプリ間でのユーザーのトラッキングには使用できません。また、再インストール時にリセットされます。まれに、FID では不十分な場合は、GUID を使用することもできます。

セキュリティ

不正行為の検出

バックエンド サービスを攻撃する複数のフェイク デバイスを検知するケースが該当します。

推奨される ID: Google Play Integrity API 完全性トークン

この ID が推奨される理由

エミュレータや、デバイスになりすましたコードではなく、正規の Android デバイスから送信されたリクエストであるか検証するには、Google Play Integrity API を使用します。

広告の不正行為

この場合、アプリはユーザーのインプレッションとアプリでの操作が真正で検証可能であることを確認します。

推奨される識別子: 広告 ID

この ID が推奨される理由

Google Play デベロッパー コンテンツ ポリシーの規定により、広告のユースケースでは、ユーザーがリセット可能な広告 ID を使用する必要があります。

デジタル著作権管理(DRM)

この場合、アプリは知的財産または有料コンテンツへの不正アクセスを保護することを目的としています。

推奨される ID: FID または GUID を使用すると、ユーザーはコンテンツ上限の適用を回避するにはアプリを再インストールしなければならなくなるため、ほとんどのユーザーに思いとどまらせることができます。それでも保護が十分でないという場合は、Android の DRM API を使用できます。APK ごとの識別子である Widevine ID を使用してコンテンツへのアクセスを制限できます。

ユーザー設定

この場合、アプリはデバイスごとのユーザー状態をアプリに保存します(特に、ログインしていないユーザーの場合)。この状態は、同じデバイスで同じ鍵で署名されている別のアプリに転送できます。

推奨される識別子: FID または GUID

この ID が推奨される理由

ユーザーが設定をリセットするためにアプリを再インストールする場合があるため、再インストール後も存続する情報を使用することは推奨されません。