Android 10 (API 수준 29)에는 사용자의 개인 정보 보호를 강화하기 위해 여러 기능과 동작 변경사항이 도입되었습니다. 이러한 변경사항은 사용자가 앱에 제공하는 데이터 및 기능에 관한 투명성과 제어권을 확장합니다. 이러한 기능은 앱이 종속된 특정 동작이나 데이터가 이전 버전의 플랫폼과 다르게 동작할 수 있음을 의미합니다. 앱이 사용자 데이터 처리에 관한 최신 권장사항을 따르는 경우 앱에 미치는 영향이 최소화됩니다.
이 페이지에는 각 변경사항이 요약되어 있습니다.
주요 변경사항
이 섹션에는 개인 정보 보호와 관련된 Android 10의 주요 변경사항이 포함되어 있습니다.
앱 파일 및 미디어로 범위가 지정된 외부 저장소 액세스
기본적으로 Android 10 이상을 타겟팅하는 앱에는 외부 저장소로 범위가 지정된 액세스, 즉 범위 지정 저장소가 제공됩니다. 이러한 앱은 저장소 관련 사용자 권한을 요청하지 않고도 외부 저장소 기기 내에서 다음 유형의 파일을 볼 수 있습니다.
getExternalFilesDir()
를 사용하여 액세스하는 앱별 디렉터리의 파일- 앱이 미디어 스토어에서 만든 사진, 동영상 및 오디오 클립
외부 저장소 기기에 저장된 파일을 공유, 액세스, 수정하는 방법뿐 아니라 범위 지정 저장소에 관한 자세한 내용은 외부 저장소의 파일 관리 및 미디어 파일 액세스 및 수정 방법에 관한 가이드를 참고하세요.
백그라운드에서 기기 위치에 액세스하려면 권한이 필요
사용자가 앱의 위치 정보 액세스를 더 세밀하게 관리할 수 있도록 지원하기 위해 Android 10에 ACCESS_BACKGROUND_LOCATION
권한이 도입되었습니다.
ACCESS_FINE_LOCATION
및 ACCESS_COARSE_LOCATION
권한과 달리 ACCESS_BACKGROUND_LOCATION
권한은 앱이 백그라운드에서 실행될 때 앱의 위치 액세스에만 영향을 미칩니다. 다음 조건 중 하나가 충족되지 않으면 앱은 백그라운드에서 위치에 액세스하는 것으로 간주됩니다.
- 앱에 속한 활동이 표시됩니다.
앱이
location
의 포그라운드 서비스 유형을 선언한 포그라운드 서비스를 실행 중입니다.앱에서 서비스의 포그라운드 서비스 유형을 선언하려면 앱의
targetSdkVersion
또는compileSdkVersion
을29
이상으로 설정합니다. 포그라운드 서비스가 위치에 액세스해야 하는 사용자 시작 작업을 계속할 수 있는 방법을 자세히 알아보세요.
앱이 지오펜싱을 만들고 모니터링하고 Android 10 (API 수준 29) 이상을 타겟팅한다면 ACCESS_BACKGROUND_LOCATION
권한을 선언해야 합니다.
Android 9 이하를 타겟팅할 때 자동으로 부여되는 액세스
앱이 Android 10 이상에서 실행되지만 Android 9(API 수준 28) 이하를 타겟팅하는 경우 플랫폼은 다음 동작을 적용합니다.
- 앱에서
ACCESS_FINE_LOCATION
또는ACCESS_COARSE_LOCATION
에<uses-permission>
요소를 선언하면 시스템은 설치 중에ACCESS_BACKGROUND_LOCATION
를 위한<uses-permission>
요소를 자동으로 추가합니다. - 앱에서
ACCESS_FINE_LOCATION
또는ACCESS_COARSE_LOCATION
을 요청하면 시스템은 자동으로 요청에ACCESS_BACKGROUND_LOCATION
을 추가합니다.
기기가 Android 10으로 업그레이드될 경우의 액세스
사용자가 앱에 기기 위치 액세스 권한(ACCESS_COARSE_LOCATION
또는 ACCESS_FINE_LOCATION
)을 부여한 후 기기를 Android 9에서 Android 10으로 업그레이드하면 시스템은 앱에 부여된 위치 기반 권한 집합을 자동으로 업데이트합니다. 다음 표와 같이 업그레이드 후 앱이 수신하는 권한 집합은 타겟 SDK 버전과 정의된 권한에 따라 다릅니다.
타겟 플랫폼 버전 | 대략적이거나 세부적인 권한 부여 여부 |
백그라운드 권한 이 매니페스트에 정의되어 있나요? |
업데이트된 기본 권한 상태 |
---|---|---|---|
Android 10 | 예 | 예 | 포그라운드 및 백그라운드 액세스 |
Android 10 | 예 | 아니요 | 포그라운드 액세스만 |
Android 10 | 아니요 | (시스템에 의해 무시됨) | 액세스 권한 없음 |
Android 9 이하 | 예 | 기기 업그레이드 시 시스템에 의해 자동 추가됨 | 포그라운드 및 백그라운드 액세스 |
Android 9 이하 | 아니요 | (시스템에 의해 무시됨) | 액세스 권한 없음 |
시스템에서 기기 위치에 대한 앱의 액세스 권한을 자동으로 업데이트한 후에도 사용자가 이 액세스 수준을 변경할 수 있습니다. 예를 들어 사용자는 앱의 포그라운드 액세스 권한을 줄이거나 액세스 권한을 완전히 취소할 수 있습니다. 특히 포그라운드 서비스 내에서 기기 위치에 액세스하기 전에 앱은 사용자가 여전히 앱에서 이 위치 정보를 수신하도록 허용하는지 확인해야 합니다.
Android 10 기기에서 대상 API 수준을 업데이트할 때 액세스가 취소됨
Android 10을 실행하는 기기에 앱이 이미 설치되어 있는 경우를 생각해 보겠습니다. 이러한 상황에서 Android 10을 타겟팅하도록 앱을 업데이트하면 기기에서 ACCESS_BACKGROUND_LOCATION
권한을 취소합니다.
앱이 백그라운드에 있는 동안 기기의 위치를 검색하는 방법에 관한 자세한 내용은 주기적 위치 업데이트 수신에 관한 가이드를 참고하세요.
백그라운드에서 활동 시작에 관한 제한사항
Android 10부터 백그라운드에서 활동을 시작하는 데 제한이 적용됩니다. 이 동작 변경을 통해 사용자의 방해를 최소화하고 사용자가 화면에 표시되는 내용을 더 잘 제어할 수 있습니다. 사용자 상호작용의 직접적인 결과로 활동을 시작하는 앱은 이러한 제한사항의 영향을 받지 않을 가능성이 높습니다.
백그라운드에서 활동을 시작하는 것의 대안으로 권장되는 방법에 관한 자세한 내용은 앱에서 시간에 민감한 이벤트를 사용자에게 알림하는 방법에 관한 가이드를 참고하세요.
식별자 및 데이터
이 섹션에는 기기 식별자 및 데이터 작업과 관련된 변경사항이 나열되어 있습니다.
관심 연락처 삭제
Android 10부터는 플랫폼에서 관심 연락처 정보를 추적하지 않습니다. 따라서 앱에서 사용자의 연락처를 검색할 때 결과가 상호작용 빈도별로 정렬되지 않습니다.
ContactsProvider
에 관한 가이드에는 Android 10부터 모든 기기에서 더 이상 사용되지 않는 특정 필드 및 메서드를 설명하는 알림이 포함되어 있습니다.
무작위 MAC 주소
Android 10 이상을 실행하는 기기에서 시스템은 기본적으로 무작위 MAC 주소를 전송합니다.
앱이 엔터프라이즈 사용 사례를 처리하면 플랫폼은 MAC 주소와 관련된 여러 작업의 API를 제공합니다.
- 무작위 MAC 주소 확인: 기기 소유자 앱과 프로필 소유자 앱에서는
getRandomizedMacAddress()
를 호출하여 특정 네트워크에 할당된 무작위 MAC 주소를 검색할 수 있습니다. - 실제 공장 출고 시 MAC 주소 확인: 기기 소유자 앱은
getWifiMacAddress()
를 호출하여 기기의 실제 하드웨어 MAC 주소를 가져올 수 있습니다. 이 메서드는 기기 집합을 추적하는 데 유용합니다.
/proc/net 파일 시스템 액세스 제한
Android 10 이상을 실행하는 기기에서 앱은 기기의 네트워크 상태 정보가 포함된 /proc/net
에 액세스할 수 없습니다. VPN과 같이 이 정보에 액세스해야 하는 앱은 NetworkStatsManager
또는 ConnectivityManager
클래스를 사용해야 합니다.
재설정할 수 없는 기기 식별자 제한
Android 10부터는 IMEI 및 일련번호를 포함하여 기기의 재설정할 수 없는 식별자에 액세스하려면 앱에 READ_PRIVILEGED_PHONE_STATE
독점 권한이 있어야 합니다.
영향 받는 메서드는 다음과 같습니다.
Build
TelephonyManager
앱에 권한이 없는데 재설정할 수 없는 식별자에 관한 정보를 요청하려고 한다면 플랫폼의 응답은 타겟 SDK 버전에 따라 달라집니다.
- 앱에서 Android 10 이상을 타겟팅하면
SecurityException
이 발생합니다. - 앱이 Android 9 (API 수준 28) 이하를 타겟팅하면 메서드는
null
를 반환하거나 앱에READ_PHONE_STATE
권한이 있으면 자리표시자 데이터를 반환합니다. 그러지 않으면SecurityException
이 발생합니다.
재설정할 수 없는 기기 식별자가 필요하지 않은 사용 사례도 많습니다. 예를 들어 앱에서 광고 추적이나 사용자 분석을 목적으로 재설정할 수 없는 기기 식별자를 사용하는 경우에는 특정 사용 사례에 맞는 Android 광고 ID를 사용하세요. 자세한 내용은 고유 식별자 권장사항을 참조하세요.
클립보드 데이터 액세스 제한
앱이 기본 입력 방식 편집기(IME)이거나 현재 포커스가 있는 앱이 아닌 경우 앱은 Android 10 이상의 클립보드 데이터에 액세스할 수 없습니다.
USB 기기 일련번호 보호
Android 10 이상을 타겟팅하는 앱은 사용자가 USB 기기 또는 액세서리에 액세스할 수 있는 권한을 앱에 부여할 때까지 일련번호를 읽을 수 없습니다.
USB 기기로 작업하는 방법에 관해 자세히 알아보려면 USB 호스트 구성 방법 관련 가이드를 참고하세요.
카메라 및 연결
이 섹션에는 카메라 메타데이터 및 연결 API와 관련된 변경사항이 나열되어 있습니다.
카메라 세부정보 및 메타데이터 액세스 제한
Android 10에서는 getCameraCharacteristics()
메서드가 기본적으로 반환하는 정보의 범위가 변경됩니다. 특히 이 메서드의 반환 값에 포함된 기기별 메타데이터에 액세스할 수 있으려면 앱에 CAMERA
권한이 있어야 합니다.
이러한 변경사항에 관한 자세한 내용은 권한이 필요한 카메라 필드 섹션을 참고하세요.
Wi-Fi 사용 및 중지 관련 제한사항
Android 10 이상을 타겟팅하는 앱은 Wi-Fi를 사용 설정하거나 사용 중지할 수 없습니다. WifiManager.setWifiEnabled()
메서드는 항상 false
를 반환합니다.
사용자에게 Wi-Fi를 사용 설정하거나 사용 중지하라는 메시지를 표시해야 한다면 설정 패널을 사용하세요.
구성된 Wi-Fi 네트워크 직접 액세스 제한
사용자 개인 정보 보호를 위해 Wi-Fi 네트워크 목록의 수동 구성이 시스템 앱과 기기 정책 컨트롤러 (DPC)로 제한됩니다. 지정된 DPC는 기기 소유자 또는 프로필 소유자일 수 있습니다.
앱이 Android 10 이상을 타겟팅하고 시스템 앱이나 DPC가 아니라면 다음 메서드는 유용한 데이터를 반환하지 않습니다.
getConfiguredNetworks()
메서드는 항상 빈 목록을 반환합니다.정수 값을 반환하는 네트워크 작업 메서드인
addNetwork()
및updateNetwork()
는 각각 항상 -1을 반환합니다.불리언 값을 반환하는 네트워크 작업인
removeNetwork()
,reassociate()
,enableNetwork()
,disableNetwork()
,reconnect()
,disconnect()
은 항상false
을 반환합니다.
앱을 Wi-Fi 네트워크에 연결해야 한다면 다음 대체 메서드를 사용합니다.
- Wi-Fi 네트워크에 대한 즉각적인 로컬 연결을 트리거하려면 표준
NetworkRequest
객체에서WifiNetworkSpecifier
를 사용합니다. - 사용자에게 인터넷 액세스를 제공하기 위해 고려할 Wi-Fi 네트워크를 추가하려면
WifiNetworkSuggestion
객체를 사용합니다.addNetworkSuggestions()
및removeNetworkSuggestions()
를 각각 호출하여 자동 연결 네트워크 선택 대화상자에 표시되는 네트워크를 추가하고 삭제할 수 있습니다. 이러한 메서드에는 위치 정보 액세스 권한이 필요하지 않습니다.
일부 전화 통신, 블루투스, Wi-Fi API에 FINE 위치 정보 액세스 권한 필요
앱이 Android 10 이상을 타겟팅하는 경우 Wi-Fi, Wi-Fi Aware 또는 블루투스 API 내에서 여러 메서드를 사용하려면 ACCESS_FINE_LOCATION
권한이 있어야 합니다. 다음 섹션에는 영향을 받는 클래스와 메서드가 나열되어 있습니다.
전화 통신
TelephonyManager
getCellLocation()
getAllCellInfo()
requestNetworkScan()
requestCellInfoUpdate()
getAvailableNetworks()
getServiceState()
TelephonyScanManager
requestNetworkScan()
TelephonyScanManager.NetworkScanCallback
onResults()
PhoneStateListener
onCellLocationChanged()
onCellInfoChanged()
onServiceStateChanged()
Wi-Fi
WifiManager
startScan()
getScanResults()
getConnectionInfo()
getConfiguredNetworks()
WifiAwareManager
WifiP2pManager
WifiRttManager
블루투스
BluetoothAdapter
startDiscovery()
startLeScan()
BluetoothAdapter.LeScanCallback
BluetoothLeScanner
startScan()
권한
이 섹션에서는 Android 권한 모델의 업데이트에 관해 설명합니다.
화면 콘텐츠의 액세스 제한
사용자의 화면 콘텐츠를 보호하기 위해 Android 10에서는 READ_FRAME_BUFFER
, CAPTURE_VIDEO_OUTPUT
, CAPTURE_SECURE_VIDEO_OUTPUT
권한의 범위를 변경하여 기기의 화면 콘텐츠에 자동으로 액세스하는 것을 차단합니다. Android 10부터는 이러한 권한이 서명 액세스 전용입니다.
기기의 화면 콘텐츠에 액세스해야 하는 앱은 사용자에게 동의를 요청하는 메시지를 표시하는 MediaProjection
API를 사용해야 합니다.
레거시 앱에서 사용자에게 표시하는 권한 확인 메시지
앱이 Android 5.1(API 수준 22) 이하를 타겟팅하는 경우 Android 10 이상을 실행하는 기기에서 앱을 처음 사용할 때 사용자에게 권한 화면이 표시됩니다(그림 1 참고). 이 화면에서 사용자는 이전에 설치 시 시스템이 앱에 부여한 권한의 액세스 권한을 취소할 수 있습니다.
실제 활동 감지
Android 10에는 사용자의 걸음 수를 인식하거나 걷기, 자전거 타기, 자동차로 이동하기와 같은 사용자의 신체적 활동을 분류해야 하는 앱을 위한 android.permission.ACTIVITY_RECOGNITION
런타임 권한이 도입되었습니다. 이 권한은 설정에서 기기 센서 데이터가 사용되는 방식을 사용자에게 보여 주도록 설계되었습니다.
Activity Recognition API 및 Google Fit API와 같은 Google Play 서비스 내 일부 라이브러리는 사용자가 앱에 이 권한을 부여하지 않으면 결과를 제공하지 않습니다.
이 권한을 선언해야 하는 기기의 유일한 내장 센서는 보행 계수기 및 보행 감지기 센서입니다.
앱이 Android 9 (API 수준 28) 이하를 타겟팅한다면 앱이 다음 각 조건을 충족하면 시스템은 필요에 따라 android.permission.ACTIVITY_RECOGNITION
권한을 앱에 자동으로 부여합니다.
- 매니페스트 파일에
com.google.android.gms.permission.ACTIVITY_RECOGNITION
권한이 포함되어 있습니다. - 매니페스트 파일에
android.permission.ACTIVITY_RECOGNITION
권한이 포함되어 있지 않습니다.
시스템이 android.permission.ACTIVITY_RECOGNITION
권한을 자동으로 부여하면 Android 10을 타겟팅하도록 앱을 업데이트한 후에도 앱이 권한을 유지합니다. 그러나 사용자는 시스템 설정에서 언제든지 이 권한을 취소할 수 있습니다.
UI에서 삭제된 권한 그룹
Android 10부터 앱은 UI에서 권한을 그룹화하는 방법을 찾을 수 없습니다.