端末特定に使える情報(Android編)
システムで端末を識別し、特定する(認証などに使う)場合、どのようなデータが使えるのか整理します。
端末識別において、現在大事な考え方は、利用者のプライバシー保護です。多くのユースケースにおいて、ハードウェアIDを使用せずとも目的が果たせるようなIDがあります。
基本方針
1.ハードウェア ID を使用しない
Android 10以降、SSAID(Android ID)や IMEI などの再設定不可能なデバイス ID にアプリがアクセスするには、特権パーミッションが必要になります。通常のアプリがユーザに特権パーミッションを操作させるのは難しいため、使用しない方が無難です。
特にSSAIDは、Android8.0以降に仕様変更され、デバイス固有とは言えないIDとなったようです。(apkビルド時の署名により別アプリの扱いとなる)
2.可能な限りインスタンスIDまたはGUIDを使用する
アプリ内での一意なIDや、UUIDの実装のひとつであるGUIDを使用することで、様々なユースケースに対応することができます。
※不正決済防止と電話機能のユースケースを除く
インスタンスIDとはアプリ内の一意のIDです。リファレンスはこちら。
デバイス上で実行されているアプリのインスタンスを特定する方法としては、インスタンス ID が最もわかりやすく、広告以外の大多数のユースケースではこの方法をおすすめします。インスタンス ID には、割り当てられたアプリ インスタンスのみがアクセスできます。アプリがインストールされている間のみ存続するため、インスタンス ID は比較的簡単にリセットできます。そのため、インスタンス ID は、リセットできないデバイスレベルのハードウェア ID に比べて、優れたプライバシー特性を備えています。
(Androidデベロッパーガイド)
インスタンス ID が使えない場合、GUID(Globally-Unique ID)を使用します。これはアプリインスタンスを一意に識別するためです。
String uniqueID = UUID.randomUUID().toString();
3.MAC アドレスは使用しない
MAC アドレスはグローバルに一意な値であるため、端末識別には最適であるように思います。しかし、この値は、デバイスを初期化してさえもユーザーがリセットすることはできません。スマートフォンはユーザとの結びつきが強く、利用者のプライバシーを映し出すデバイスです。
先に書いたように、ユーザが再設定できないデバイスIDをアプリが使うユースケースは制限されています。Android 10以降を搭載しているデバイスは、デバイス オーナーアプリではないすべてのアプリに対して、ランダム化された MAC アドレスを返すようです(!)
また、Android 6.0~から Android 9までの場合、Wi-Fi や Bluetooth など、ローカル デバイスの MAC アドレスをサードパーティ API で使用することはできません。
WifiInfo.getMacAddress() メソッドと BluetoothAdapter.getDefaultAdapter().getAddress() メソッドの返却値はいずれも 02:00:00:00:00:00です。
ユースケースと使用するIDの例
1.ログイン認証していないユーザの状態を管理する場合
インスタンス ID または GUIDを使用
ユーザーアカウント情報を含まないデバイスの状態をサーバー側で保存する場合には、インスタンスIDやGUIDを使用します。
ユーザーが設定をリセットするためにアプリを再インストールする場合があるため、再インストール後も存続する情報を使用することは推奨されません。
2.複数デバイスで同一ユーザがアプリを使用する場合
インスタンス ID または GUIDを使用
同じユーザーの複数のデバイスにインストールされる各アプリインスタンスを正しく特定する必要がある場合は、インスタンスIDを使用します。ただし、インスタンスIDは、スコープがそのアプリに限定されているため、複数のアプリ間でユーザトラッキングをすることはできません。場合によって、GUID を使用して対処します。
3.ログアウトしたユーザーの設定を、署名キーが同じ複数のアプリでトラッキングする場合
SSAIDを使用
あるアプリから別のアプリに対して、デバイスの状態を転送する場合は、SSAIDを使用します。デバイス状態はサーバで保存します。転送元と転送先のアプリは同じデベロッパー署名キーで署名されている必要があります。(Android 8.0以降)ユーザーがアカウントにログインしなくてもアプリ間で状態を共有できます。
この記事が気に入ったらサポートをしてみませんか?