アイリッジでは様々なスマホ向けのサービスを開発していますが、その際にあると便利なのが端末を識別するIDです。 本日は端末を識別するIDについて、最新の動向をご紹介したいと思います。

iOS

UDID

端末を識別するIDと聞いて、多くの方が真っ先に思い浮かべるのはUDIDではないでしょうか。 UDIDは端末を一意に識別する強力なIDですが、複数のアプリ間で特定のユーザーを追跡可能で、ユーザーが自由にIDを変更することができないため、現在は利用できません。 iOS5の時代にUDIDの取得が非推奨になり、iOS6の時代にUDIDを取得するアプリはAppStoreでの公開を拒否されるようになりました。 iOS7では、UDIDを取得すると “FFFFFFFF”+identifierForVendor(後述)が返されるようになっています。

MACアドレス

iOS5の時代にUDIDの取得が非推奨になり、一部のアプリでは代わりにMACアドレス(またはMACアドレスをハッシュ化した文字列)が使われるようになりました。 これは、当時からUDIDの取得を非推奨にした趣旨を尊重しない行為(※1)として賛否両論でしたが、2013年の中頃からMACアドレスを取得するアプリもAppStoreでの公開を拒否されるようになり、iOS7ではMACアドレスを取得すると固定値(20:00:00:00:00:00)が返されるようになりました。

※1 MACアドレスはUDIDと同様、複数のアプリ間で特定のユーザーを追跡可能で、ユーザーが自由に変更することができません。

identifierForVendor(IDFV)

UDIDに代わるIDとして、iOS6.0から使えるようになったIDです。 UDIDとは異なり、ベンダー(開発者)が異なるアプリでは、異なるIDが返されます。 同じベンダーのアプリでは同じIDが返されますが、端末から同じベンダーのアプリがすべてアンインストールされると、次回インストール時には異なるIDが返されるようになります。

なお、identifierForVendorおよびAdvertisingIdentifier(後述)には、ワイヤレスで(=iTunesを使わないで)iOS6.0にアップデートし、iOS6.0.1以上にアップデートしていない端末で、固定値(00000000-0000-0000-0000-000000000000)を返すバグがあります。

AdvertisingIdentifier

こちらもUDIDに代わるIDとして、iOS6.0から使えるようになったIDです。 UDIDと同様、すべてのベンダーのアプリで同じIDが返されますが、ユーザーがiOSの設定画面からAdvertisingIdentifierを取得できないように設定することができます。 また、iOS6.1からは、ユーザーがAdvertisingIdentifierをリセットして新しいIDに更新できるようになりました。

その他の方法

UDIDの取得が非推奨になった後、複数のアプリ間で特定のユーザーを追跡するために様々な方法が考案されましたが(ブラウザCookieにIDを記録する方法、OpenUDID、SecureUDID等)、いずれも現在は利用が推奨されません。

Android

デバイスID(IMEI/MEID/ESN)

携帯電話端末の個体識別番号です。 GSM端末ではIMEI、CDMA端末ではMEIDまたはESNを取得できます。 複数のアプリ間で同じ番号を取得可能で、ユーザーが自由に番号を変更することができないため、iOSのUDIDに近いイメージで利用できます。 しかしながら、デバイスIDを取得するにはアプリにREAD_PHONE_STATEのパーミッションが必要なこと、また、Wi-Fi専用端末のような携帯電話ではない端末ではデバイスIDを取得できないことに注意が必要です。 一部の端末では、デバイスIDを正常に取得できない場合があります。

また、iOSでUDIDの取得が非推奨になった趣旨を踏まえますと、デバイスIDをUDIDのように使うことが望ましいかどうかについては、議論が分かれるところです。

シリアル番号

Android 2.3以上の携帯電話ではない端末では、端末のシリアル番号を取得できます。 携帯電話端末ではシリアル番号を取得できませんので(※2)、デバイスIDを補完して端末を識別するIDとしての利用が想定されます。

※2 一部の携帯電話端末ではシリアル番号を取得可能です。

MACアドレス

Wi-FiやBluetooth等のネットワークアダプタの物理アドレスです。 端末に該当のアダプタが搭載されていない場合、また、該当のアダプタが有効になっていない場合は、MACアドレスを取得できません。

ANDROID_ID

端末の初期化時にランダムに生成される文字列です。 複数のアプリ間で同じ値を取得できますが、異なる端末で異なる値が返ることが保証されているわけではありません。 Android 2.2未満では、正常に取得できない場合があります。 また、GALAXYSやDROID2(日本未発売)では、ANDROID_IDが固定値で返されるバグがありました。

Advertising ID

Google Play 開発者サービス 4.0(※3)以上がインストールされている端末で利用できるIDです。 iOSのAdvertisingIdentifierと同様、複数のアプリ間で同じIDが返されますが、ユーザーがGoogle Play 開発者サービスの設定画面からAdvertising IDを取得できないように設定したり、Advertising IDをリセットして新しいIDに更新したりできます。

※3 GooglePlay 開発者サービスは、一見、開発者向けの機能のように見えますが、英語名はGoogle Play Servicesで、Android OSの拡張機能をアプリ形式で提供するものです。Android OSの機能により、各端末で自動的にインストール/アップデートされます。Google Play 開発者サービス 4.0は、Android 2.3以上の端末をサポートしています。

ID取扱い時の注意点

これらのIDが(法律上の)個人情報に該当するかどうかは議論が分かれるところですが、特にユーザーが自由に変更できないIDに関しては、個人情報と同等の取扱いが必要と言えます。 これらのIDと個人情報とがひも付いたデータベースがあれば、これらのIDから容易に個人情報を追跡することが可能だからです。

また、MACアドレスを直接サーバーに送信する代わりに、MACアドレスのハッシュ値をサーバーに送信するということもよく行われますが、これについても注意が必要です。 MACアドレスは12桁の16進数の文字列(AA:BB:CC:DD:EE:FF)ですが、そのうちの6桁(AA:BB:CCの部分)はベンダーごとに固有の文字列です。 そのため、特定のベンダーに限って考えますと、MACアドレスは16の6乗で約1677万個しかありません。 これらのMACアドレスすべてについてあらかじめハッシュ値を計算しておくことで、ハッシュ値からMACアドレスを追跡することが可能になります。 このように、個数が少ない(=桁数が少ない)IDについては、ハッシュ化しても個人情報と結び付けることができてしまいますので、例えハッシュ値であっても個人情報と同等の取扱いが必要になります。

まとめ

iOS、Androidとも、異なるベンダーのアプリ間でユーザーを追跡したいケース(主に広告を想定)では、ユーザーが任意にオプトアウトできる(=IDを無効にしたり、更新したりできる)IDを利用させる方針ということが分かります。

一方、特定のアプリの中だけで端末を識別できればよい場合、iOSではidentifierForVendorを利用できそうですが、Androidでは単独で信頼して利用できるIDがありません。 そのため、複数のIDを組み合わせて利用したり、アプリ(サービス)側で独自にIDを発行したりする必要がありそうです。


本記事はアイリッジブログで公開していたものをエンジニアリングブログとして再構成したものとなります。記事の内容は、記事執筆当時のものと異なる可能性があります。