Android (안드로이드)

[Android] 안드로이드 기기 고유 값 얻기 / 기기 식별자 / SSAID

Oscar:) 2024. 9. 1. 16:28

 

 

 

사내 프로젝트 진행 중 FCM 서비스를 사용하게 되었다.

 

FCM 토큰은 보통, 한 번 발급받으면 변경되지 않는다.

하지만 앱을 삭제 후 재설치하게 되면 토큰 값이 변경된다.

 

서버팀에서는 더 이상 사용되지 않는 FCM 토큰 정보를 수시로 폐기하는 등

동일한 기기를 사용하는 사용자 관리를 목적으로 기기의 고유한 식별자를 필요로했다.

 

 

그리하여 FCM 토큰을 서버로 전송할 때, 해당 기기의 고유 값을 식별자로서 함께 전송하여

2가지 값을 관리하는 방식이 채택되었다.

 

 

이번 포스팅에서는 안드로이드 기기의 고유 값을 얻어오는 방법을 간단히 정리한다.

 

 

 

 


 

기기 고유 식별자 종류와 선택

 

 

안드로이드에서는 정말 다양한 종류의 기기 고유 식별자가 존재한다.

하지만 정작 사용할 만한 건 몇 개 없다..

 

종류에 대해 간단히 알아보며, 사용할 만한 것이 없다는 이유에 대해서도 살펴보자.

 

 

 

● Serial Number

 

기기 고유의 시리얼 번호를 알 수 있다.

 

 

하지만 현재 Deprecated 되었고, 위와 같이 unknown을 반환한다.

 

 

 

● Telephony Manager

 

아래와 같은 방법으로 기기 고유 값을 얻어올 수 있었지만,

(getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager).deviceId

 

현재 Deprecated 되었고, READ_PRIVILEGED_PHONE_STATE 권한이 없다면 사용할 수조차 없다.

 

해당 권한에 대해서는 조금 아래에서 설명하겠다.

 

 

 

● UUID, GUID

 

128비트의 16진수 숫자로 표현되는 랜덤 값을 받아볼 수 있다.

 

하지만 단순한 기기 고유 식별자라고 하기엔,

값을 생성 후 별도로 저장해야 하는 등 개발자가 직접 관리해야 하는 불편함이 있다.

 

앱 단에서 관리해야 하는 값이기에 역시 앱을 삭제 후 재설치하면 값이 변경된다.

 

그리고 '고유' 값이라고 하기에도 좀 그렇다.

확률상 동일한 값이 나오기가 힘들 정도로 많은 숫자의 조합일 뿐이고,

절대적인 고유 값은 아니다.

 

 

 

● FirebaseInstance ID

 

Firebase와 연동했을 때 사용 가능한 인스턴스 ID이다.

 

구글에서도 그나마 추천하고, 유도하고 있는 방법이지만

Firebase를 사용하지 않을 때는 실용성이 없는 방법이다.

 

그리고 무엇보다도, 앱을 삭제 후 재설치하면 ID가 변경된다.

 

 

 


 

위 방법들은 개발자 입장에서 사용성이 떨어지거나,

더 이상 사용할 수 없는 방법들이다.

 

그럼에도 설명한 이유는 구글에서 변경한 정책을 간단히라도 알아보기 위해서다.

 

 

안드로이드 버전 10부터 기기 식별자를 위 권한으로 관리한다는데,

READ_PRIVILEGED_PHONE_STATE 권한은 통신사 관련 앱에서만 획득 가능하다.

 

결론적으로 일반 앱을 개발하는 대부분의 경우에는 사용할 수 없다는 이야기다.

 

구글은, 앱에서 하드웨어 단위의 식별자를 사용하는 것 자체를 꺼려하는 것이다.

 

 

안드로이드 버전이 올라가면 갈수록, 사용자 편의성은 점점 높아지지만

개발자는 더 많은 제한 사항에 부딪히는 것 같다..

 

 

 

그럼에도 불구하고, 사용할 수 있는 하드웨어 단위의 고유 식별자가 하나 남았는데

그게 바로 SSAID 이다.

 

 

 


 

SSAID 구하기

 

 

SSAID를 얻어올 수 있는 방법은 간단하게도 아래 코드 1줄이면 얻어올 수 있다.

Settings.Secure.getString(this.contentResolver, Settings.Secure.ANDROID_ID)

 

이미 눈채친 사람도 있겠지만, Setting Secure Android ID 의 약자다.

 

 

결과)

 

 

앱을 여러번 실행한 결과가 동일한 것을 확인할 수 있다.

 

앱을 삭제 후 재설치해도 동일한 값을 출력한다.

 

 

하지만 기기를 공장 초기화하면 값이 변경된다.

(이 부분은 어쩔 수 없는? 상황이라고 생각한다.

공장 초기화는 사실 사용자가 핸드폰을 변경하는 경우와 다름이 없기 때문이다.)

 

 

결국 SSAID를 채택하여 사용하기로 했다.

 

 

 


 

 

 

기기 고유 식별자를 여러 종류 알아보고 SSAID를 선택했지만,

이 또한 결국 '일단' 사용하는 느낌을 받고 있다.

 

구글이 앱에서 하드웨어 단위의 식별자를 사용하는 것을 꺼려하기 때문에,

SSAID 또한 언제 Deprecated 될 지 모르는 시한부라고 생각된다.

 

가장 좋은 방법은 역시 구글에서 추천하는 FirebaseInstance ID를 다루고,

앱이 재설치되어도 문제없도록 서버쪽에서 기기 식별을 최적화하는 것이라고 생각한다.