권한 요청은 기기에서 얻을 수 있는 민감한 정보를 보호하는 용도이므로 앱 작동을 위해 정보에 액세스해야 하는 경우에만 사용해야 합니다. 이 문서에서는 이러한 정보에 대한 액세스를 요청하지 않고도 동일한(또는 더 나은) 기능을 구현할 수 있는 방법에 관해 도움말을 제공합니다. 그러나 Android 운영체제에서 권한이 사용되는 방식을 모두 다루지는 않습니다.
Android 권한과 관련된 일반적인 내용은 권한 개요를 참고하세요. 코드에서 권한을 사용하는 방법에 관한 자세한 내용은 앱 권한 요청을 참고하세요.
Android 6.0 이상에서의 권한
Android 6.0(API 수준 23) 이상에서 앱은 설치 전이 아닌 런타임에 사용자에게 권한을 요청할 수 있습니다. 이렇게 하면 서비스 또는 서비스로 보호되는 데이터가 실제로 필요할 때 앱이 권한을 요청할 수 있습니다. 이렇게 한다고 해서 전반적인 앱 동작이 (반드시) 달라지는 것은 아니지만, 민감한 사용자 데이터의 처리 방식과 관련하여 몇 가지 변화를 일으킵니다.
향상된 상황별 컨텍스트
앱 컨텍스트에서, 기능(해당 권한 그룹에 포함된 기능)에 액세스하기 위한 권한이 런타임에 사용자에게 요청됩니다. 사용자는 권한이 요청되는 컨텍스트에 더 민감하므로 요청하는 권한과 앱의 목적이 일치하지 않는 경우 사용자에게 권한을 요청하는 이유를 자세히 설명하는 것이 더욱 중요합니다. 가능하다면 요청할 때는 물론 사용자가 요청을 거부한 경우 나타나는 후속 대화상자에도 요청에 관한 설명을 제공해야 합니다.
권한 요청이 수락될 가능성을 높이려면 특정 기능이 필요할 때만 메시지를 표시하세요. 예를 들어 사용자가 마이크 버튼을 클릭할 때만 마이크 액세스 권한을 요청하는 메시지를 표시하시기 바랍니다. 사용자는 자신이 원하는 기능일 때 권한을 허용할 가능성이 큽니다.
더 유연해진 권한 부여
사용자는 권한 요청을 받았을 때뿐만 아니라 설정에서도 개별 권한에 대한 액세스를 거부할 수 있지만, 권한 요청을 거부하여 기능이 제대로 작동하지 않으면 당황할 수 있습니다. 따라서 Google 애널리틱스를 사용하는 등의 방법으로 권한을 거부하는 사용자 수를 모니터링하여 해당 권한에 의존하지 않도록 앱을 리팩터링하거나 앱이 제대로 작동하기 위해 권한이 필요한 이유를 더 효과적으로 설명하는 것이 좋습니다. 또한 사용자가 권한 요청을 거부하거나 설정에서 권한을 사용 중지하는 경우 나타나는 예외를 앱에서 처리할 수 있도록 해야 합니다.
트랜잭션 부담 증가
사용자는 권한 그룹에 대한 액세스를 그룹 단위가 아니라 개별적으로 부여하도록 요청받습니다. 따라서 요청하는 권한의 수를 최소화하는 것이 매우 중요합니다. 이렇게 하면 권한을 부여하는 사용자의 부담이 증가하므로 요청이 하나 이상 거부될 가능성도 커집니다.
기본 핸들러가 되기 위한 권한
일부 앱은 통화 기록 및 SMS 메시지와 관련된 민감한 사용자 정보에 액세스해야 합니다. 통화 기록 및 SMS 메시지와 관련된 권한을 요청하고 Play 스토어에 앱을 게시하려면, 런타임 권한을 요청하기 전에 사용자에게 허용 여부 메시지를 표시하여 앱을 핵심 시스템 기능의 기본 핸들러로 설정하도록 해야 합니다.
기본 핸들러 및 기본 핸들러 허용 여부 메시지를 사용자에게 표시하는 방법에 관한 자세한 내용은 기본 핸들러에서만 사용되는 권한에 관한 가이드를 참고하세요.
작업 중인 라이브러리 이해하기
앱에서 사용하는 라이브러리에 권한이 필요한 경우가 있습니다. 예를 들어 광고 및 분석 라이브러리에서 필수 기능을 구현하기 위해 LOCATION
권한 그룹에 액세스해야 할 수 있습니다. 그러나 사용자의 관점에서 보면 라이브러리가 아니라 앱에서 권한이 요청됩니다.
사용자 입장에서 동일한 기능을 제공하는 앱이라면 권한을 적게 필요로 하는 앱을 선택하는 것처럼, 개발자도 라이브러리를 검토하고 불필요한 권한을 사용하지 않는 타사 SDK를 선택해야 합니다. 예를 들어 위치 기능을 제공하는 라이브러리를 사용하는 경우 위치 기반 타겟팅 기능을 사용하지 않는 한 FINE_LOCATION
권한을 요청하지 마세요.
위치에 대한 백그라운드 액세스 제한
앱이 백그라운드에서 실행 중일 때 앱의 핵심 기능을 위해 위치에 대한 액세스가 반드시 필요하고 사용자에게 분명한 이점이 있어야 합니다.
두 가지 권한 모델 테스트
Android 6.0(API 수준 23) 이상에서는 앱을 설치할 때가 아닌 런타임에 사용자가 앱 권한을 부여하고 취소합니다. 따라서 더 광범위한 조건에서 앱을 테스트해야 합니다. Android 6.0 이전에는 앱이 실행되면 앱 매니페스트에 선언된 모든 권한이 있다고 합리적으로 추측할 수 있었습니다. 이제 사용자는 API 수준에 관계없이 모든 앱에서 권한을 사용 설정 또는 중지할 수 있습니다. 그러므로 개발자는 다양한 권한 시나리오에서 앱이 제대로 작동하는지 테스트해야 합니다.
다음은 API 수준 23 이상을 실행하는 기기에서 권한 관련 코드 문제를 찾기 위한 도움말입니다.
- 앱의 현재 권한 및 관련 코드 경로를 식별합니다.
- 권한 보호된 서비스 및 데이터 전반에 걸친 사용자 흐름을 테스트합니다.
- 부여되거나 취소된 권한의 다양한 조합을 테스트합니다. 예를 들어 카메라 앱 매니페스트에
CAMERA
,READ_CONTACTS
및ACCESS_FINE_LOCATION
이 나열되어 있을 수 있습니다. 이러한 권한을 하나씩 사용 설정하거나 중지한 상태로 앱을 테스트하여 앱이 모든 권한 구성을 정상적으로 처리할 수 있는지 확인해야 합니다. - adb 도구를 사용하여 명령줄에서 권한을 관리합니다.
- 권한과 상태를 그룹별로 나열합니다.
$ adb shell pm list permissions -d -g
- 하나 이상의 권한을 부여하거나 취소합니다.
$ adb shell pm [grant|revoke] <permission-name> ...
- 권한과 상태를 그룹별로 나열합니다.
- 권한을 사용하는 서비스의 앱을 분석해봅니다.
추가 리소스
- Android 권한용 Material Design 가이드라인
- Android Marshmallow 6.0: 권한 요청: 이 동영상에서는 Android 런타임 권한 모델과 사용자에게 권한을 요청하는 올바른 방법을 설명합니다.
- 앱에 권한이 필요한 이유 설명
- 고유 식별자 권장사항