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 버전 및 정의된 권한에 따라 다릅니다.
표 1. 기기를 Android 10으로 업그레이드한 후 위치 정보 액세스 권한 상태 변경
| 타겟 플랫폼 버전 | 대략적인 위치 정보 액세스 권한 또는 정확한 위치 정보 액세스 권한이 부여되었나요? |
백그라운드 권한이 매니페스트에 정의되어 있나요? |
업데이트된 기본 권한 상태 |
|---|---|---|---|
| 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 권한이 있어야 합니다.
영향 받는 메서드는 다음과 같습니다.
BuildTelephonyManager
앱에 권한이 없는데도 재설정 불가능한 식별자에 관한 정보를 요청하려고 하면 플랫폼의 응답은 타겟 SDK 버전에 따라 달라집니다.
- 앱이 Android 10 이상을 타겟팅하는 경우
SecurityException이 발생합니다. - 앱이 Android 9 (API 수준 28) 이하를 타겟팅하는 경우 앱에
READ_PHONE_STATE권한이 있으면 메서드가null또는 자리표시자 데이터를 반환합니다. 그렇지 않으면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 권한이 있어야 합니다. 다음 섹션에는 영향을 받는 클래스와 메서드가 나와 있습니다.
전화 통신
TelephonyManagergetCellLocation()getAllCellInfo()requestNetworkScan()requestCellInfoUpdate()getAvailableNetworks()getServiceState()
TelephonyScanManagerrequestNetworkScan()
TelephonyScanManager.NetworkScanCallbackonResults()
PhoneStateListeneronCellLocationChanged()onCellInfoChanged()onServiceStateChanged()
Wi-Fi
WifiManagerstartScan()getScanResults()getConnectionInfo()getConfiguredNetworks()
WifiAwareManagerWifiP2pManagerWifiRttManager
블루투스
BluetoothAdapterstartDiscovery()startLeScan()
BluetoothAdapter.LeScanCallbackBluetoothLeScannerstartScan()
권한
이 섹션에서는 Android 권한 모델의 업데이트에 관해 설명합니다.
화면 콘텐츠의 액세스 제한
사용자의 화면 콘텐츠를 보호하기 위해 Android 10은 READ_FRAME_BUFFER, CAPTURE_VIDEO_OUTPUT, CAPTURE_SECURE_VIDEO_OUTPUT 권한의 범위를 변경하여 기기의 화면 콘텐츠에 대한 자동 액세스를 방지합니다. Android 10부터 이러한 권한은 서명 액세스 전용입니다.
기기의 화면 콘텐츠에 액세스해야 하는 앱은 MediaProjection API를 사용해야 합니다. 이 API는 사용자에게 동의를 요청하는 메시지를 표시합니다.
레거시 앱에서 사용자에게 표시하는 권한 확인 메시지
앱이 Android 5.1 (API 수준 22) 이하를 타겟팅하는 경우 사용자가 Android 10 이상을 실행하는 기기에서 앱을 처음 사용할 때 그림 1과 같이 권한 화면이 표시됩니다. 이 화면을 통해 사용자는 설치 시 시스템에서 앱에 부여한 권한에 대한 액세스를 취소할 수 있습니다.
실제 활동 감지
Android 10에서는 사용자의 걸음 수를 감지하거나 사용자의 신체 활동(예: 걷기, 자전거 타기, 차량으로 이동)을 분류해야 하는 앱을 위한 android.permission.ACTIVITY_RECOGNITION 런타임 권한을 도입합니다. 이 권한은 설정에서 기기 센서 데이터가 사용되는 방식을 사용자에게 보여 주도록 설계되었습니다.
Activity Recognition API 및 Google 피트니스 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에서 권한이 그룹화되는 방식을 조회할 수 없습니다.