ABOUT ME

-

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

    반응형

    댓글

Designed by Me.