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 추천..

반응형