콘텐츠로 건너뛰기

자주 방문한 페이지

최근 방문한 페이지

navigation

앱 권한 모범 사례

권한 요청은 기기에 있는 중요한 정보를 보호하며, 여러분의 앱 작동에 꼭 필요한 정보에 액세스할 때만 권한을 사용해야 합니다. 이 문서에서는 이러한 정보에 액세스하지 않고도 동일한 또는 더 나은 기능을 실현할 수 있는 팁을 제공합니다. 이 팁은 Android 운영 체제에서 권한이 작동하는 방식에 대한 포괄적인 논의가 아닙니다.

Android 권한에 대한 보다 일반적인 내용은 권한 및 사용자 데이터를 참조하세요. 여러분의 코드에서 권한 사용 방법에 대한 자세한 내용은 시스템 권한 사용을 참조하세요. 고유 식별자를 사용하기 위한 모범 사례는 고유 식별자 모범 사례를 참조하세요.

Android 식별자 사용 시의 원칙

Android 권한을 사용할 경우 다음과 같은 원칙을 따르는 것이 좋습니다.

#1: 앱이 작동하는 데 필요한 권한만을 사용합니다. 여러분이 권한을 사용하는 방식에 따라서는, 중요한 정보에 액세스하지 않고도 여러분이 원하는 작업(시스템 인텐트, 식별자, 전화 통화의 백그라운딩)을 수행할 수 있는 또 다른 방법이 있을 수 있습니다.

#2: 라이브러리에 필요한 권한에 주의를 기울입니다. 라이브러리를 포함할 경우 해당 권한 요구사항도 상속합니다. 어떤 것을 포함할지, 필요한 권한은 무엇인지 그리고 이러한 권한이 어디에 사용되는지를 고려해야 합니다.

#3: 투명성. 권한 요청을 수행하는 경우, 액세스 대상과 이유를 투명하게 알려야 합니다. 그래야만 사용자가 정확한 결정을 내릴 수 있습니다. 설치, 런타임 또는 업데이트 권한 대화상자를 비롯한 권한 요청과 함께 이 정보를 제공하세요.

#4: 시스템 액세스를 명시적으로 수행합니다. 여러분이 중요한 기능(예: 카메라 또는 마이크)에 액세스할 때 사용자에게 지속적인 알림을 제공하면, 데이터가 수집되는 시기를 사용자에게 명확히 알릴 수 있고, 여러분이 사용자 몰래 데이터를 수집한다는 생각을 피할 수 있습니다.

이 가이드의 나머지 부분에서는 Android 애플리케이션 개발의 측면에서 이러한 규칙을 상세히 설명합니다.

Android 6.0+에서의 권한

Android 6.0 Marshmallow에서는 앱이 런타임(설치 이전이 아니라)에 사용자로부터 권한을 요청할 수 있는 새로운 권한 모델을 도입했습니다. 이 새로운 모델을 지원하는 앱은 실제로 이 앱에 서비스(또는 이 서비스에 의해 보호되는 데이터)가 필요할 때 해당 권한을 요청합니다. 이 경우 전체적인 앱 동작은 변함이 없으며, 중요한 사용자 데이터가 처리되는 방식에 관련된 몇 가지 변경 사항만 생깁니다.

향상된 상황별 컨텍스트: 여러분의 앱 컨텍스트에서, 해당 기능(해당 권한 그룹에 포함된 기능)에 액세스하기 위한 권한이 런타임에 사용자에게 요청됩니다. 사용자는 권한이 요청되는 컨텍스트에 더욱 민감하며, 여러분이 요청하는 내용과 실제의 앱 용도가 서로 다를 경우에는 여러분이 이 권한을 요청하는 이유를 사용자에게 상세히 설명하는 것이 더욱 중요합니다. 가능한 경우 여러분은 요청 시에 이 요청을 설명해야 하며 또한 사용자가 요청을 거부한 경우 후속 대화상자에서 이 요청을 설명해야 합니다.

더욱 유연한 권한 부여: 사용자는 자신이 요청을 받을 때 설정에서 개별 권한에 대한 액세스를 거부할 수 있지만, 이 결과로 이 기능의 작동이 중단된다면 사용자가 놀랄 수도 있습니다. 해당 권한에 따라 피하려는 앱을 리팩터링하거나, 또는 앱의 적절한 작동에 있어 권한이 필요한 이유를 잘 설명하기 위해서는, 얼마나 많은 사용자가 권한을 거부하는지를 모니터링하는 것이 좋습니다(예: Google 애널리틱스 사용). 또한 사용자가 권한 요청을 거부하거나 설정에서 권한을 해제할 경우 발생하는 예외를 여러분의 앱이 처리하도록 해야 합니다.

트랜잭션의 부담 증가: 사용자는 권한 그룹에 대한 액세스를 (집합적이 아닌) 개별적으로 부여하도록 요청됩니다. 이 경우 여러분이 요청하는 권한의 수를 최소화하는 것이 매우 중요합니다. 왜냐하면 권한 부여를 위한 사용자의 부담이 증가하고 최소 하나 이상의 요청이 거부될 가능성이 증가하기 때문입니다.

불필요한 권한 요청을 회피

이 섹션에서는 일반적인 사용 사례를 대신하는 대안을 제공하며, 이 대안은 여러분이 요청하는 권한의 수를 제한하도록 도와줍니다. 요청되는 사용자 노출 권한의 개수와 유형은, 더 적은 권한을 요청하는 다른 유사한 앱에 비해, 다운로드에 영향을 미치므로 최선의 방법은 불필요한 기능에 대한 권한 요청을 피하는 것입니다.

실시간 사용자 요청으로 카메라/연락처에 액세스

이 경우, 여러분은 가끔 기기의 카메라나 연락처 정보에 액세스해야 하며, 액세스가 필요할 때마다 사용자에게 물어보는 것을 신경쓰지 마십시오.

사용자 데이터에 드물게 액세스하는 경우(즉, 데이터에 액세스할 때마다 사용자에게 런타임 대화상자를 표시하는 것이 그다지 지장이 되지 않는 경우), 인텐트 기반 요청을 사용할 수 있습니다. 인텐트 기반 요청이 발급될 때 앱과 공유할 것을 사용자가 선택하기 때문에, 권한 요청이 없이도 애플리케이션이 사용할 수 있는 몇 가지 시스템 인텐트를 Android에서 제공합니다.

예를 들어, MediaStore.ACTION_IMAGE_CAPTURE 또는 MediaStore.ACTION_VIDEO_CAPTURE의 인텐트 액션 유형을 사용하면, Camera 객체를 직접 사용하지 않고도(또는 권한을 요청하지 않고도) 이미지나 비디오를 캡처할 수 있습니다. 이 경우, 시스템 인텐트는 이미지가 캡처될 때마다 여러분을 대신하여 사용자의 권한을 요청합니다.

오디오 포커스를 잃은 후 백그라운드로 실행

이 경우, 사용자가 전화 통화를 받으면 여러분의 애플리케이션이 백그라운드로 이동해야 하며, 통화가 끝난 후에는 포커스가 다시 돌아옵니다.

이러한 경우(예: 미디어 플레이어 음소거 또는 전화 통화 중에 일시 중지) 일반적인 접근방법은 PhoneStateListener를 사용하여 통화 상태의 변경을 수신하거나 android.intent.action.PHONE_STATE 브로드캐스트를 수신하는 것입니다. 이 방법의 문제점은 READ_PHONE_STATE 권한이 필요하다는 것입니다. 이 권한은 사용자에게 중요한 데이터(예: 기기 및 SIM 하드웨어 ID, 수신 통화의 전화번호)에 대한 액세스 권한을 부여하도록 강요합니다.

여러분의 앱에 AudioFocus를 요청하면 이 문제를 피할 수 있습니다. 이 경우 중요한 정보에 액세스하지 않기 때문에 명시적 권한이 필요 없습니다. 오디오를 백그라운드로 실행하는 데 필요한 코드를 onAudioFocusChange() 이벤트 핸들러에 넣어두면, OS에서 오디오 포커스가 이동할 때 자동으로 이 코드가 실행됩니다. 이 방법에 대한 자세한 문서는 여기에서 찾을 수 있습니다.

인스턴스가 실행 중인 기기 판별

이 경우, 앱 인스턴스가 실행 중인 기기를 결정하는 고유 식별자가 필요합니다.

애플리케이션에는 기기별 기본 설정이나 메시징이 있을 수 있습니다(예: 사용자가 자신의 승용차나 집에서 다른 재생 목록을 사용할 수 있도록, 자신의 기기별 재생 목록을 클라우드에 저장). 일반적인 해결책은 Device IMEI와 같은 기기 식별자를 활용하는 것이지만, 이 경우 Device ID and call information 권한 그룹이 필요합니다(M+에서 PHONE). 또한 리셋할 수 없고 모든 앱상에서 공유되는 식별자가 사용됩니다.

이러한 유형의 식별자를 사용하기 위한 두 가지 대안이 있습니다.

  1. com.google.android.gms.iid InstanceID API를 사용합니다. getInstance(Context context).getID() 는 애플리케이션 인스턴스에 대해 고유한 기기 식별자를 반환합니다. 이 결과, 앱에 대한 정보를 저장할 때 앱 인스턴스 범위의 식별자가 키로 사용될 수 있고, 또한 사용자가 앱을 다시 설치할 때 이 식별자가 리셋됩니다.
  2. randomUUID()와 같은 기본 시스템 함수를 사용하여, 여러분의 앱 저장소로 범위가 지정된 자신만의 식별자를 생성합니다.

광고 및 사용자 분석을 위해 고유 식별자 생성

이 경우, 여러분은 앱에 로그인하지 않은 사용자의 프로필을 작성하기 위한 고유 식별자가 필요합니다(예: 광고 타겟팅 또는 전환 측정).

광고 및 사용자 분석을 위해 프로필을 작성하는 경우, 때로는 다른 애플리케이션 간에 공유되는 식별자가 필요합니다. 이를 위한 일반적인 솔루션은 Device IMEI와 같은 기기 식별자를 활용하는 것입니다. 이 식별자는 Device ID and call information 권한 그룹을 필요로 하며(API 레벨 23+에서 PHONE) 사용자에 의해 리셋될 수 없습니다. 이러한 모든 경우에, 여러분은 리셋할 수 없는 식별자를 사용하고 사용자에게 비정상적으로 보일 수 있는 권한을 요청하는 것과 함께 Play 개발자 프로그램 정책을 위반하는 것이기도 합니다.

불행히도, com.google.android.gms.iid InstanceID API 또는 시스템 함수를 사용하여 앱 범위의 ID를 만드는 것은 적절한 솔루션이 아닙니다. 왜냐하면 이 ID는 앱 간에 공유될 수가 있기 때문입니다. 대안 해결책은 getId() 메서드를 통해 AdvertisingIdClient.Info 클래스에서 제공되는 Advertising Identifier를 사용하는 것입니다. getAdvertisingIdInfo(Context) 메서드를 사용하여 AdvertisingIdClient.Info 객체를 만들고 getId() 메서드를 호출하여 식별자를 사용할 수 있습니다. 참고로, 이 메서드는 차단되어 있으므로, 메인 스레드에서 이 메서드를 호출해서는 안 됩니다. 이 메서드에 대한 자세한 설명은 여기에서 찾을 수 있습니다.

사용 중인 라이브러리 알기

때로는 여러분이 앱에서 사용하는 라이브러리에서 권한을 요구합니다. 예를 들어, 필요한 기능을 구현하기 위해 광고 및 분석 라이브러리에서 Location 또는 Identity 권한 그룹에 대한 액세스를 요구할 수도 있습니다. 그러나 사용자의 관점에서 보면 이 권한 요청은 라이브러리에서 오는 것이 아니라 앱에서 오는 것입니다.

사용자는 동일한 기능에 더 적은 권한을 사용하는 앱을 선택하기 마련이므로, 개발자는 라이브러리를 검토하여 불필요한 권한을 사용하지 않는 타사 SDK를 선택해야 합니다. 예를 들어, 해당 권한이 앱에 필요한 명백한 이유가 없다면 Identity 권한 그룹을 요구하는 라이브러리는 피하도록 하세요. 특히, 위치 기능을 제공하는 라이브러리의 경우 여러분이 위치 기반 타겟팅 기능을 사용하는 것이 아니라면, FINE_LOCATION 권한을 요청하지 않도록 하세요.

투명성

액세스 대상과 이유를 사용자에게 알려야 합니다. 연구에 따르면, 권한 요청이 앱에 필요한 이유를 알고 있다면 사용자가 훨씬 더 편안함을 느낀다고 합니다. 사용자 연구에 따르면 다음과 같습니다.

...어떤 권한을 어떤 모바일 앱에 부여하려는 사용자의 자발적 의사는 이 권한과 연관된 목적이 무엇인지가 큰 영향을 미칩니다. 예를 들어, 자신의 위치 정보를 제공하려는 사용자의 자발적 의사는 상황에 따라 달라집니다. 즉, 앱의 핵심 기능을 지원하기 위해 요청이 필요한지 아니면 광고 네트워크 또는 분석 회사와의 정보 공유를 위해 요청이 필요한지에 따라 달라집니다.1

CMU의 Jason Hong 교수는 자신의 연구를 바탕으로 다음과 같은 일반적인 결론을 내렸습니다.

...가령 타겟팅 광고를 위해, 내 위치와 같은 중요한 정보가 앱에 사용 중인 이유를 사람들이 알게 된다면, 내 위치가 앱에 사용 중임을 단순히 통보받는 것보다 더 편안함을 느낄 것입니다.1

결과적으로, 권한 그룹에 속하는 API 호출의 일부만을 사용 중인 경우, 사용 중인 이러한 권한의 목록과 그 이유를 명시적으로 나타내는 것이 도움이 됩니다. 예를 들면 다음과 같습니다.

특정한 상황에서는, 중요한 데이터에 실시간으로 액세스한다는 것을 사용자에게 알리는 것도 좋습니다. 예를 들어, 여러분이 카메라나 마이크에 액세스하는 경우, 여러분의 앱이나 알림 트레이(애플리케이션이 백그라운드에서 실행되는 경우)에 알림 아이콘을 넣어서 사용자에게 알리는 것도 좋은 방법입니다. 그러면 여러분이 사용자 몰래 데이터를 수집하는 것처럼 보이지 않을 것입니다.

궁극적으로, 여러분은 자신의 앱을 작동시키기 위해 권한을 요청해야 하는데 그 이유가 사용자에게 분명치 않은 경우, 가장 민감한 권한이 여러분에게 필요한 이유를 사용자에게 알릴 수 있는 방법을 찾아보세요.

참조

[1] Modeling Users’ Mobile App Privacy Preferences: Restoring Usability in a Sea of Permission Settings, by J. Lin B. Liu, N. Sadeh and J. Hong. In Proceedings of SOUPS 2014.

이 사이트는 쿠키를 사용하여 사이트별 언어 및 표시 옵션에 대한 환경설정을 저장합니다.

Google Play에서 성공을 거두는 데 도움이 되는 최신 Android 개발자 뉴스 및 도움말을 받아 보세요.

* 필수 입력란

완료되었습니다.

WeChat에서 Google Developers 팔로우하기

이 사이트를 (으)로 탐색할까요?

페이지를 요청했지만 이 사이트의 언어 환경설정은 입니다.

언어 환경설정을 변경하고 이 사이트를 (으)로 탐색할까요? 언어 환경설정을 나중에 변경하려면 각 페이지 하단의 언어 메뉴를 사용하세요.

이 클래스를 사용하려면 API 수준 이상이 필요합니다.

문서에 대해 선택한 API 수준이 이므로 이 문서가 표시되지 않습니다. 왼쪽 탐색 메뉴의 선택기로 문서 API 수준을 변경할 수 있습니다.

앱에 필요한 API 수준 지정에 관한 자세한 내용은 다양한 플랫폼 버전 지원을 참조하세요.

Take a short survey?
Help us improve the Android developer experience. (April 2018 — Developer Survey)