Android Basic

permission 개요 및 권한 선언 평가하기

hik14 2021. 3. 18. 12:10

permission 개요

permission을 사용하는 이유

- 사용자 개인정보 보호

- 제한된 데이터 (예: 시스템 상태 및 사용자의 연락처 정보)

- 제한된 작업 (예: 페어링된 기기에 연결 및 오디오 녹음)

 

권한 선언 워크 플로우

앱에서 제한된 데이터나 제한된 작업에 액세스해야 할 수 있는 기능을 제공해야 한다면,

권한을 선언하지 않고도 정보를 가져오거나 작업을 실행할 수 있는지 확인을 먼저한다.

(개발자는 권한을 선언하지 않고도 사진 찍기, 미디어 재생 일시중지, 관련 광고 표시 등 앱에서 여러 사용 사례를 처리할 수 있다)

 

제한된 데이터에 액세스하거나 제한된 작업을 실행해야 한다고 생각한다면 적절한 권한을 선언 선언한다.

 

설치 타임 권한  요청 - 앱을 설치 할때 자동으로 부여한다. (사용자에게 권한을 요청 및 공지 한다.)

런타입 권한 요청 - 앱에서 추가적인 단계를 거쳐 앱 실행중 요청한다.

 

 

1.  기능적으로 권한을 요구하지 않고 구현 가능한가?   --->  권한없이 구현 가능하면 그렇게 하는게 좋다.

 

2. 권한이 반드시 필요하다면 manifest 파일에서 선언한다.

 

3. manifest 파일에 선언한 권한이 앱이 실행중에 요청해야되는가?

 

4. 실행중 요청한다.

 

Permission의 종류

1. 설치시 요청 권한

 

 설치 시간 권한을 통해 앱에서는 제한된 데이터에 제한적으로 액세스하고 시스템이나 다른 앱에 최소한의 영향을 미치는 제한된 작업을 실행할 수 있습니다. 

 

앱을 설치(앱을 install 할때지, 앱을 처음 실행하는 때가 아니다)할 때 자동으로 앱에 권한을 부여합니다.

 

- 일반 권한

 

권한을 통해 앱의 샌드박스 이상으로 확장된 데이터와 작업에 액세스할 수 있습니다.

그러나 이러한 데이터와 작업은 사용자의 개인정보 보호와 다른 앱의 작업에 거의 영향을 미치지 않습니다.

시스템에서는 권한 API 참조 페이지에 나와 있는 것처럼 '일반' 보호 수준을 일반 권한에 할당합니다.

 

- 서명 권한

앱에서 다른 앱이 정의한 서명 권한을 선언하고 두 앱이 동일한 인증서로 서명되었다면 시스템에서는 설치 시간에 첫 번째 앱에 권한을 부여합니다. 그 외의 경우에는 첫 번째 앱에 권한을 부여할 수 없습니다.

 

2. 런타임시 요청 권한

 

런타임 권한(위험한 권한이라고도 함)으로 앱에서는 제한된 데이터에 추가로 액세스하고 시스템과 다른 앱에 좀 더 큰 영향을 미치는 제한된 작업을 실행합니다. 앱에서 런타임 권한을 요청해야 제한된 데이터에 액세스하거나 제한된 작업을 실행할 수 있습니다.

 

많은 런타임 권한이 잠재적으로 민감한 정보가 포함된 특별 유형의 제한된 데이터인 비공개 사용자 데이터에 액세스합니다.

비공개 사용자 데이터의 예로는 위치와 연락처 정보가 있습니다.

시스템에서는 권한 API 참조 페이지에 나와 있는 것처럼 '위험' 보호 수준을 런타임 권한에 할당합니다.

 

3. 특별 권한

 

특별 권한은 특정 앱 작업에 상응합니다. 플랫폼과 OEM만이 특별 권한을 정의할 수 있습니다.

또한 플랫폼과 OEM은 일반적으로 다른 앱 위에 그리기와 같이 특히 강력한 작업에 대한 액세스를 보호하려고 할 때 특별 권한을 정의(유튜브나, 트위치등 동영상이 바탕화면에서 실행되는것 같음)합니다.

시스템 설정의 특별 앱 액세스 페이지에는 사용자가 전환할 수 있는 작업 세트가 포함되어 있습니다. 이러한 작업의 대부분은 특별 권한으로 구현됩니다. 각 특별 권한에는 자체 구현 세부정보가 있습니다. 각 특별 권한 사용에 관한 안내는 권한 API 참조 페이지에 나와 있습니다. 시스템은 'appop' 보호 수준을 특별 권한에 할당합니다.

권장사항

앱 권한은 시스템 보안 기능에 기반하며 앱 권한을 통해 Android에서는 사용자 개인정보 보호와 관련된 다음 목표를 지원할 수 있습니다.

  • 제어: 사용자가 앱과 공유하는 데이터를 제어합니다.
  • 투명성: 사용자가 앱이 사용하는 데이터와 앱이 이 데이터에 액세스하는 이유를 파악합니다.
  • 데이터 수집 최소화: 앱에서는 사용자가 호출하는 특정 작업에 필요한 데이터에만 액세스하여 이를 사용합니다.

최소 개수의 권한 요청

 

- 사용자가 앱에서 특정 작업을 요청할 때 앱은 작업을 완료하는 데 필요한 권한만 요청해야 합니다. 권한을 사용하는 방법에 따라 민감한 정보에 액세스하지 않고도 앱의 사용 사례를 처리하는 다른 방법이 있을 수 있습니다.

 

런타임 권한을 특정 작업과 연결(앱 설치후, 최초 실행시 런타임 권한을 받기보다는 앱을 사용하다 필요할때 받는다)

 

- 최대한 앱의 사용 사례 흐름에서 늦게 권한을 요청하세요. 예를 들어 앱에서 사용자가 다른 사용자에게 음성 메시지를 보내도록 허용하는 경우 사용자가 메시지 화면으로 이동하여 음성 메시지 보내기 버튼을 누를 때까지 기다립니다. 사용자가 버튼을 누르고 나면 앱에서 마이크 액세스 권한을 요청합니다.

 

앱의 종속 항목 고려

- 라이브러리를 포함하면 권한 요구사항도 상속됩니다. 각 종속 항목에 필요한 권한과 이러한 권한의 사용 목적을 알고 있어야 합니다.

 

투명성 확보

- 권한을 요청할 때는 액세스하는 정보와 이유를 명확하게 밝혀 사용자가 제대로 이해한 상태로 결정할 수 있도록 해야 합니다.

 

시스템 액세스 명확하게 알리기

- 카메라나 마이크와 같은 민감한 데이터 또는 하드웨어에 액세스할 때 앱에 지속적으로 알림을 표시하세요. 알림을 통해 사용자는 앱이 제한된 데이터에 액세스하거나 제한된 작업을 실행할 때를 정확히 파악할 수 있습니다

 

앱에서 권한을 선언해야 하는지 평가하기

 

앱에서 권한을 선언하기 전에 필요성을 고려하자!

 

사용자가 런타임 권한이 필요한 앱 기능을 사용하려고 할 때마다 앱에서 권한 요청을 위해 사용자의 작업을 중단해야 합니다.

사용자가 앱에서 특정 권한을 요청하는 이유를 이해하지 못한다면 권한을 거부하거나 앱을 제거할 수도 있습니다.

 

설치된 다른 앱이 내 앱을 대신하여 기능을 실행할 수 있는지도 고려!

 

이러한 경우에는 인텐트를 사용하여 다른 앱에 작업을 위임해야 합니다.

다른 앱에서 권한을 대신 선언하므로 내 앱에서는 필요한 권한을 선언할 필요가 없습니다.

 

권한 선언의 대안 예시

 

주변 장소 표시

앱에서 사용자의 대략적인 위치를 알아야 할 수 있습니다. 이는 근처 음식점과 같은 위치 인식 정보를 표시하는 데 유용합니다.

사용 사례에 따라 기기 위치의 대략적인 추정치가 약 2km 이내여야 할 때가 있습니다. 이러한 상황에서는 ACCESS_COARSE_LOCATION 권한을 선언할 수 있지만, 권한을 선언하는 대신 사용자에게 주소나 우편번호를 입력하도록 요청하세요.

 

다른 사용 사례에서는 기기 위치의 더 정확한 추정치가 필요하기도 합니다. 이러한 상황에서만 ACCESS_FINE_LOCATION 권한을 선언하시기 바랍니다.

 

사진 찍기

사용자는 사전 설치된 시스템 카메라 앱을 사용하여 앱에서 사진을 찍을 수 있습니다.

이러한 상황에서는 CAMERA 권한을 선언하지 마세요. 대신 ACTION_IMAGE_CAPTURE 인텐트 작업을 호출하세요.

 

동영상 녹화

사용자는 사전 설치된 시스템 카메라 앱을 사용하여 앱에서 동영상을 녹화할 수 있습니다.

이러한 상황에서는 CAMERA 권한을 선언하지 마세요. 대신 ACTION_VIDEO_CAPTURE 인텐트 작업을 호출하세요.

 

다른 앱의 미디어 또는 문서 열기

앱에서 사진, 동영상, 텍스트 파일 등 다른 앱에서 만든 콘텐츠를 표시할 수 있습니다.

이러한 상황에서는 READ_EXTERNAL_STORAGE 권한을 선언하지 마세요.

 

Android 10(API 수준 29)부터 지원 중단된 getExternalStorageDirectory()와 같은 메서드를 사용하여 공유 또는 외부 저장소 기기에 직접 액세스하지 않아야 합니다.  대신 기기의 MediaStore를 사용하여 미디어 파일을 열고 저장소 액세스 프레임워크를 사용하여 문서 및 기타 파일을 여세요.

 

앱의 인스턴스를 실행 중인 기기 식별

앱의 특정 인스턴스에서 실행 중인 기기를 파악해야 할 수 있습니다. 이는 TV 기기 및 웨어러블 기기의 재생목록이 다른 경우와 같이 기기별 환경설정이나 메시지 기능이 있는 앱에 유용합니다.

이러한 상황에서는 기기의 IMEI에 직접 액세스하지 마세요. 실제로 Android 10(API 수준 29)부터는 직접 액세스할 수 없습니다. 대신 다음 중 하나를 따르세요.

  • 인스턴스 ID 라이브러리를 사용하여 앱 인스턴스의 고유한 기기 식별자를 가져옵니다.
  • 범위가 앱 저장소로 지정되는 자체 식별자를 만듭니다. randomUUID()와 같은 기본 시스템 함수를 사용하세요.

 

블루투스를 통해 기기와 페어링

앱에서 블루투스를 통해 다른 기기로 데이터를 전송하여 향상된 환경을 제공할 수 있습니다.

이 기능을 지원하려면 ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATIION 또는 BLUETOOTH_ADMIN 권한을 선언하는 대신 호환 기기 페어링을 사용하세요.

 

앱이 중단될 때 미디어 일시중지

사용자가 전화를 받거나 사용자가 설정한 알람이 실행되는 경우 앱에서 오디오 포커스를 다시 획득할 때까지 앱의 미디어 재생을 일시중지해야 합니다.

이 기능을 지원하려면 READ_PHONE_STATE 권한을 선언하는 대신 시스템에서 오디오 포커스를 이동할 때 자동으로 실행되는 onAudioFocusChange() 이벤트 핸들러를 구현하세요. 오디오 포커스를 구현하는 방법을 자세히 알아보세요.

 

전화 필터링

사용자 환경이 불필요하게 중단되는 상황을 최소화하기 위해 앱에서 스팸 전화를 필터링할 수 있습니다.

이 기능을 지원하려면 READ_PHONE_STATE 권한을 선언하는 대신 CallScreeningService API를 사용하세요.