-
Android) 안드로이드 고유 식별자 뭘로할까?Android 2021. 6. 7. 23:51
앱 설치 시 사용자 디바이스의 행동을 추적하기 위한 Device Unique Key를 생성하는 여러 방법들을 알아보려고 합니다.
1. Secure Android ID
val androidId = Settings.Secure.getString(context.contentResolver, Settings.Secure.ANDROID_ID)
- 디바이스가 최초 부팅 시에 생성됨
- 초기화 전까지는 삭제 되지 않고 저장되어 있어 디바이스 식별에 유용
- 기기를 초기화하면 값이 바뀜
- READ_PHONE_STATE 권한 필요
2. Serial Number
- android.os.Build.SERIAL로부터 값을 받아 올 수 있음
- 안드로이드 2.3부터 사용 가능
- 전화 기능이 없는 디바이스의 경우 유일한 값을 반환하지만, 전화 기능이 있는 디바이스의 경우 모든 디바이스가 해당되지는 않음
3. Mac Address
- 디바이스를 구분할 수 있는 값이지만, 모든 디바이스가 Mac Address를 가지고 있지 않음
- 디바이스가 꺼져 있는 경우 값을 얻어오지 못함
- 와이파이를 끄고 재부팅하면 안 나옴
4. Telephony Manager
- Secure Android ID는 최신폰에서는 잘 동작하는데 버전이 낮거나 오래된 버전에서 문제가 생길 수 있음
- Non-Phone : 번호를 갖고 있지 않은 태블릿 또는 와이파이만을 제공하는 디바이스는 device id를 획득하지 못할 수도 있음
- Persistence : 한번 생성된 번호에 대한 지속 여부를 보장할 수 없음(공장 초기화)
if (Build.VERSION.SDK_INT >= 29 || checkTableDevice()) { return Settings.Secure.getString(this.contentResolver, Settings.Secure.ANDROID_ID) }else{ return (getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager).deviceId } // 기존에 TelephonyManager를 사용하면서 최신버전은 Secure Android ID로 식별자 사용하는 방법
5. UUID
- Universally Unique Identifier(범용 고유 식별자)
- 완벽한 고유성을 지니진 못하지만 16바이트로 이루어졌기 때문에 동일한 UUID가 나오게 될 확률은 로또에 당첨될 확률보다 낮음
- 키를 저장해 두고 활용하면, 캐시 삭제/어플 삭제 이전에는 동일한 식별번호로 유지
val uuid = UUID.randomUUID().toString() fun initUUID() = prefs.edit { putString("UUID", uuid) } fun getUUID() = prefs.getString("UUID", null)
안드로이드 Q(10) 버전부터는 더 이상 '사용자가 재설정할 수 없는' 디바이스 식별자를 제공하지 않습니다.
- 안드로이드 Q에서 바뀌게 될 부분은 MAC 주소의 랜덤화, 재설정할 수 없는 기기 식별자입니다.
- 타깃 SDK 버전과 관계없이 Device ID, IMEI, MEID, Build.Serial 등의 값을 사용할 수 없습니다.
- 사용자로부터 READ_PRIVILEGED_PHONE_STATE 권한을 받으면 식별자 값을 받을 수 있지만, 이 기능은 통신사와 관련된 앱만 권한 획득 가능하기 때문에, 일반 사용자는 접근 불가합니다.
- 고유 식별자는 '범위'와 '수명'으로 기준을 나눌 수 있습니다.
고유 식별자의 범위
- 단일 앱 - 한 앱에서 확인한 식별자는 해당 앱에서만 동일하게 유지.
- 앱 그룹 - 한 앱에서 확인한 식별자는 미리 정의된 몇몇 앱 사이에서 동일하게 유지. (앱 서명키 기준)
- 디바이스 - 한 앱에서 확인한 식별자는 동일 디바이스에 있는 모든 앱에서 동일하게 유지
고유 식별자의 수명
- 세션 - 사용자가 앱을 실행 후 종료할 때까지 고유 식별자 값이 유지. (앱 종료 후 다시 시작하면 달라짐)
- 앱 설치 - 앱을 삭제 후 재설치하거나, 앱 데이터 삭제하기 전가지 유지
- 디바이스 초기화 - 디바이스를 초기화 하기 전까지 유지
- 디바이스 초기화 후에도 유지 - 디바이스 공장 초기화 후에도 유지 (사용자가 재설정할 수 없는 식별자)
안드로이드 11에서는 앱에서 전화번호를 읽을 때 사용하는 전화 관련 권한이 변경됩니다.
- 전화번호 API에 액세스해야 한다면 READ_PHONE_STATE 대신 READ_PHONE_NUMBERS 권한을 요청해야 합니다.
<uses-permission android:name="android.permission.READ_PHONE_STATE" android:maxSdkVersion="29" /> <uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />
안드로이드 공식 문서에서 추천하는 방법들
- 하드웨어 기기 식별자를 사용하지 않기를 추천 (SSAID는 디바이스를 초기화하지 않는 이상 값이 변하지 않아 사용자에게 불편함을 줄 수 있음)
- 광고 사례에는 Advertising ID 추천 (광고 사례가 아닌 경우 식별자로 사용하면 안되며, 사용자가 재설정하면 값이 변할 수 있음)
- 기타 사례에는 Instance ID(FirebaseInstance ID) 또는 GUID 추천 (앱을 삭제하거나 재설치 또는 앱 데이터를 삭제할 경우 값이 변할 수 있음)
- 개인 정보 위험이 적은 DRM API, SafetyNet API 추천 (MediaDRM - 프리미엄 컨텐츠를 안전하게 재생하기 위해 MediaCodec에 암호화 키를 안전하게 제공할 수 있도록 하는 안드로이드 프레임워크 API, SafetyNet API - 소프트웨어와 하드웨어 정보를 분석한 후 무결성을 확인하는 API, 가장 안전하지만 과정이 복잡하고 시간이 오래 걸림)
- MediaDrm 모듈 중 하나인 Widevine 모듈 (구글에서 제공하는 모듈, 4.3 버전 이상의 ExoPlayer에서 사용)
결론
SSAID 추천..
반응형'Android' 카테고리의 다른 글
Android) ImageURL -> Bitmap 으로 변경하기 feat) HttpURLConnection, Coroutines (1) 2021.06.24 Android) Navigation Component IllegalStateException, IllegalArgumentException 예외 (0) 2021.06.10 Android) 앱 서명 키 안전하게 보안하는 방법 (0) 2021.05.30 Android) logcat의 ResourceType Warning 지우는 방법 (0) 2021.05.26 Android) Firebase Analytics 알아보기 (0) 2021.05.24