Privacy Changes in Android Q#2
Privacy Changes in Android Q#2 ๊ด๋ จ
Info
์๋ ํ์ธ์. ๊ฐ๋จ์ธ๋์์ Android ๊ฐ๋ฐ์ ๋งก๊ณ ์๋ David ์ ๋๋ค.
ํด๋น ๊ธ์ ์ ๊ฐ Google I/O 19 Extended in Korea Android ์์ ๋ฐํํ๋ ๋ถ๋ถ์ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
์ ๋ฒ ๊ธ์์๋ Android Q์์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ฑ์ ๋ํ ์๋ก์ด ์ ํ์ฌํญ ์ ๋ํ์ฌ ์์ ๋ณด์์ต๋๋ค.
์ด๋ฒ ๊ธ์์ ๋ค๋ค๋ณผ ๋ด์ฉ์ ์๋๋ก์ด๋ ๊ธฐ๊ธฐ ๊ณ ์ ์๋ณ์ ์ ํ ์ ๋๋ค.
์๋๋ก์ด๋ Q์์ ๋ฐ๋๊ฒ ๋ ๋ถ๋ถ์ MAC ์ฃผ์์ ๋๋คํ ์ ์ฌ์ค์ ํ ์ ์๋ ๊ธฐ๊ธฐ ์๋ณ์ ์ ๋๋ค.
์ฌ์ค์ ํ ์ ์๋ ๊ธฐ๊ธฐ ์๋ณ์์ ๋ํ์ฌ ์ดํด๋ณด๋ฉด
Android Q ๋ถํฐ IMEI์ serial number์ ๊ฐ์ ์๋ณ์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ฌ์ฉํ๊ฒ๋ ๊ฒฝ์ฐ์๋ null
๋๋ unknown
๊ฐ์ ๋ฐ๊ฒ ๋ฉ๋๋ค.
์ฌ์ฉ์๋ก๋ถํฐ READ_PRIVILEGED_PHONE_STATE
๊ถํ์ ๋ฐ์ผ๋ฉด ๊ธฐ๊ธฐ ์๋ณ์ ๊ฐ์ ๋ฐ์ ์ ์์ง๋ง
์ด๋ฌํ ๊ธฐ๋ฅ์ ํต์ ์ฌ์ ๊ด๋ จ๋ ์ฑ๋ง ๊ถํ์ ํ๋คํ ์ ์๊ณ ์ผ๋ฐ์ ์ธ ์ ์ ๋ ์ ๊ทผํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ฉด ๊ธฐ๊ธฐ ์๋ณ์๋ฅผ ์ป๊ณ ์ถ์ ๊ฒฝ์ฐ ์ด๋ป๊ฒ ํ๋ฉด ์ป์ ์ ์์๊น์?
Android Developer ๊ณต์ ์ฌ์ดํธ๋ฅผ ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ช ์ํ๊ณ ์์ต๋๋ค.
(https://developer.android.com/training/articles/user-data-ids?hl=ko)
- ํ๋์จ์ด ๊ธฐ๊ธฐ ์๋ณ์๋ฅผ ์ฌ์ฉํ์ง ์๊ธฐ๋ฅผ ์ถ์ฒํจ
- ๊ด๊ณ ์ฌ๋ก์๋ Adevertising ID ์ฌ์ฉํ๋๊ฒ์ ์ถ์ฒํจ
- ๊ธฐํ ์ฌ๋ก์๋ Instance ID ๋๋ GUID ๋ฅผ ํ์ฉํ๋๊ฒ์ ์ถ์ฒํจ
- ๊ฐ์ธ์ ๋ณด ์ํ์ด ์ ์ DRM API, SafetyNet API ๋ฅผ ์ฌ์ฉํ๋๊ฒ์ ์ถ์ฒํจ
Android Q ๋ถํฐ IMEI ์๋ณ์๋ ์ฌ์ฉํ ์ ์์ง๋ง SSAID๋ ๋ค๋ฐ์ด์ค๋ฅผ ์ด๊ธฐํ ํ์ง ์๋ ์ด์ ๊ฐ์ด ๋ณํ์ง ์์ผ๋ฏ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด๋ฌํ ๋์์ ์ฌ์ฉ์์๊ฒ ๋ถํธํจ์ ์ผ์ผํค๊ฒ ๋ฉ๋๋ค.
Advertising ID ๋ ๊ด๊ณ ์ฌ๋ก๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ์๋ณ์๋ก ์ฌ์ฉํ๋ฉด ์๋๋ฉฐ
์ฌ์ฉํ๋๋ผ๋ ์ฌ์ฉ์๊ฐ Advertising ID ์ ์ฌ์ค์ ํ๋ฉด ๊ฐ์ด ๋ณํ ์ ์์ต๋๋ค.
Instance ID ๋๋ GUID ๋ ์ฑ์ ์ญ์ ํ๊ฑฐ๋ ์ฌ์ค์น ๋๋ ์ฑ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ ๊ฒฝ์ฐ ๊ฐ์ด ๋ณํ ์ ์์ต๋๋ค.
SSAID
๋ฅผ ์ดํด๋ณด๋ฉด Secure์ getString
๋ฉ์๋๋ฅผ ํตํ์ฌ ์๋๋ก์ด๋์ ๊ณ ์ ๊ธฐ๊ธฐ ID๊ฐ์ ์ป์ ์ ์์ต๋๋ค.
๋จ์ ์ผ๋ก์๋ READ_PHONE_STATE
๊ถํ์ด ์์ด์ผ์ง๋ง SSAID
๊ฐ์ ์ป์ ์ ์์ต๋๋ค.
MediaDrm
์ ์ฌ์ฉ์๊ฐ ํ๋ฆฌ๋ฏธ์ ์ฝํ
์ธ ๋ฅผ ์์ ํ๊ฒ ์ฌ์ํ๊ธฐ ์ํด MediaCodec
์ ์ํธํ ํค๋ฅผ ์์ ํ๊ฒ ์ ๊ณตํ ์ ์๋๋ก ํ๋ Android ํ๋ ์์ํฌ API์
๋๋ค.
MediaDrm
๋ชจ๋์ค ํ๋์ธ Widevine
๋ชจ๋์ด ์์ต๋๋ค.
Widevine
๋ชจ๋์ Google ์์ ์ ๊ณตํ๋ ๋ชจ๋์ค ํ๋์ด๋ฉฐ ์๋๋ก์ด๋ ExoPlayer
์์ ์ฌ์ฉํ๋๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
ExoPlayer
์์ Widevine
DRM ์ ์๋๋ก์ด๋ 4.3 ์ด์๋ถํฐ ์ฌ์ฉํ ์ ์๋ค๊ณ ๋ช
์๋์ด์์ต๋๋ค.
val WIDEVINE_UUID = UUID(-0x1210745686296532L, -0x5c37d8232ae2de13L)
fun getDeviceId(): String {
var deviceId = ""
if (isWidevineDRMAvailable()) {
val id = MediaDrm(WIDEVINE_UUID)
.getPropertyByteArray(MediaDrm.PROPERTY_DEVICE_UNIQUE_ID)
deviceId = Base64.encodeToString(id, Base64.DEFAULT)
}
return deviceId
}
private fun isWidevineDRMAvailable(): Boolean {
return MediaDrm.isCryptoSchemeSupported(WIDEVINE_UUID)
}
๋ค์๊ณผ ๊ฐ์ด MediaDrm
์์ฑ์์ UUID ๊ฐ์ ์ง์ด๋ฃ๊ณ Base64
์ธ์ฝ๋ฉ ๊ณผ์ ์ ๊ฑฐ์น๋ฉด ๊ธฐ๊ธฐ ์๋ณ์๋ฅผ ์ป์ ์ ์์ต๋๋ค.
์๋๋ก์ด๋ ๋๋ฐ์ด์ค์ Widevine
๋ชจ๋์ด ์์ ๋ MediaDrm
์์ฑ์์ ๊ฐ์ ์ง์ด๋ฃ์ผ๋ฉด Exception์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ Widevine
๋ชจ๋์ด ์๋์ง ์ฒดํฌํ๋ ๋ก์ง์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
๋จ์ ์ผ๋ก์๋ SSAID
๋ณด๋ค ๊ฐ์ ๊ฐ์ ธ์ค๋๋ฐ์ ์์ด ์๋๊ฐ ๋๋ฆฌ๋ฉฐ ์๋๋ก์ด๋ 4.3 ์ด์๋ถํฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
SafetyNet Attestatoin API ๋ ์ํํธ์จ์ด์ ํ๋์จ์ด ์ ๋ณด๋ฅผ ๋ถ์ํ ํ ๋ฌด๊ฒฐ์ฑ์ ํ์ธํ๋ API ์ ๋๋ค.
๊ทธ๋ฆผ์์ ๋ณด๋ค์ํผ ์ฒ์ ์ฑ์์ Google Play Services ์๊ฒ API ๋ฅผ ์์ฒญํ๊ณ ํด๋น API ๋ ๊ตฌ๊ธ ์๋ฒ๋ก๋ถํฐ signed response ๊ฐ์ ์์ฒญํ๊ฒ ๋ฉ๋๋ค.
signed response ๋ฅผ ์ฑ์์ ๋ฐ์ ํ ๊ทธ ๊ฐ์ ์ ๋ขฐํ ์ ์๋ ์๋ฒ๋ก forward ํ ํ ์๋ฒ์์ ๊ฐ์ ์ฒดํฌ ํ ํ ์ฑ์๊ฒ ๊ฒฐ๊ณผ๋ฅผ ์๋ ค์ค๋๋ค.
๊ฐ์ฅ ์์ ํ API ์ง๋ง ๊ณผ์ ์ด ๋ณต์กํ๊ณ ํต์ ํด์ผ ํ๋ ๋ถ๋ถ์ด ๋ง๊ธฐ ๋๋ฌธ์ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ๋จ์ ์ด ์์ต๋๋ค.
์์ฝํ์๋ฉด Android Q ๋ถํฐ๋ ๊ธฐ๊ธฐ ์๋ณ์๋ฅผ ๋์ด์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ฐ ์ํฉ์ ๋ง๊ฒ SSAID, DRM API ๊ทธ๋ฆฌ๊ณ SafetyNet API ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.