Android/StoreInfo

<정리> Permission

re트 2024. 9. 22. 22:31
728x90

Permission은 특정 시스템 리소스나 제한된 데이터와 작업에 대한 접근과 수정을 허용하는 것

 

Permission Workflow

출처 : Android Developers

 

Permission 유형

1. Install-time permissions(설치 시간 권한)

앱이 제한된 데이터에 제한적으로 접근하거나, 시스템 또는 다른 앱에 최소한의 영향을 미치는 제한된 작업을 수행할 수 있도록 허용

앱 스토어에서 사용자가 앱의 상세 페이지를 볼 때 설치 시간 권한 통지를 사용자에게 제시 → 사용자가 앱 설치할 때 시스템이 자동으로 권한 부여

1) Normal permissions(일반 권한)

앱이 제한된 데이터에 제한적으로 접근하거나, 시스템 또는 다른 앱에 최소한의 영향을 미치는 권한

시스템은 보호수준을 normal로 할당

<종류>

android.permission.INTERNET(인터넷 접근)

android.permission.VIBRATE(진동)

android.permission.ACCESS_NETWORK_STATE(접근 네트워크 상태)

...

2) Signature permisssions(서명 권한)

권한을 정의한 앱이나 OS와 동일한 인증서로 서명된 특정 앱 간에만 공유되어 사용할 수 있는 권한

시스템은 보호수준을 signature로 할당

<종류>

시스템 권한(안드로이드 OS의 핵심 기능이나 시스템 앱에 접근할 수 있는 권한)

android.permission.BIND_DEVICE_ADMIN(디바이스 관리자 앱에 필요한 권한)

android.permission.BIND_VPN_SERVICE(VPN 서비스를 구현하는 앱이 시스템과 결합할 수 있도록 하는 권한)

커스텀 권한(개발자가 자체 앱 간의 통신이나 특정 기능 접근을 위해 정의하는 권한)

패키지명.커스텀 권한명 : 매니페스트 파일에서 <permission> 안에 커스텀 권한 선언

서비스 결합 권한(특정 서비스에 접근하고 결합할 수 있는 권한)

android.permission.BIND_AUTOFILL_SERVICE(자동 완성 서비스를 구현하는 앱이 시스템과 결합할 수 있도록 하는 권한)

android.permission.BIND_NOTIFICATION_LISTENER_SERVICE(알림 리스너 서비스를 구현하는 앱이 시스템과 결합할 수 있도록 하는 권한)

내부 API 접근 권한(내부 API에 접근하기 위해 필요한 권한)

com.android.internal.permission.ACCESS_SYSTEM_API(내부 시스템 API에 접근할 수 있는 권한)

패키지명.INTERNAL_API_ACCESS(특정 앱 내부 API에 접근하기 위해 정의된 커스텀 권한)

 

2. Runtime permissions(런타임 권한)

런타임 권한 요청해야 앱에서는 제한된 비공개 사용자 데이터에 추가로 액세스하거나 시스템과 다른 앱에 더 큰 영향을 미치는 제한된 작업 실행 가능(비공개 사용자 데이터 : 위치, 연락처 등, 큰 영향을 미치는 제한된 작업 : 마이크, 카메라)

런타임 권한 요청 시 런타임 권한 메세지를 표시

시스템은 보호수준을 dangerous로 할당

<종류>

android.permission.ACCESS_FINE_LOCATION(위치 정보 접근)

android.permission.READ_CONTACTS(연락처 접근)

android.permission.CAMERA(카메라 사용)

android.permission.RECORD_AUDIO(마이크 사용)

android.permission.WRITE_EXTERNAL_STORAGE(외부 저장소 파일 접근)

 

3. Special permissions(특별 권한)

시스템 설정 앱을 통해 부여해야 하는 권한

설치 시간 권한이나 런타임 권한과 다르게 권한 요청을 진행

 

권한 그룹

파일에 대한 읽기, 쓰기 권한이 있을 때 하나의 그룹에 속하는데 이걸 권한 그룹이라고 함

권한 그룹 내에 한 가지 권한이 부여된 경우, 시스템은 다른 권한에 대한 요청을 바로 승인

(예시 : CAMERA, CALENDAR, CONTACTS, LOCATION, MICROPHONE

 

권한 요청

1. 매니페스트 파일에 권한 선언

1) 일반 권한 또는 서명 권한과 같은 설치 시간 권한인 경우에는 설치 시 자동으로 권한이 부여됨
2) 권한이 런타임 권한 또는 특별 권한이고 앱이 Android 6.0(API 수준 23) 이상을 실행하는 기기에 설치된 경우 런타임 권한 또는 특별 권한을 직접 요청 필요

 

권한에 맞는 하드웨어가 없을 때에도 앱 설치가 가능하게 하려면 <user-permission> 태그 안 android:required 속성을 false로 두면 됨

하드웨어가 있는지 없는지 확인할 때는 hasSystemFeatures() 메서드 사용

런타임 권한을 지원하는 기기인 Android 6.0(API 수준 23) 이상을 실행하는 기기에만 권한을 선언하려면 <uses-permission> 요소 대신 <uses-permission-sdk-23> 요소 사용

 

2. 런타임 권한 요청

런타임 권한을 요청하기 위한 기본 원칙

- 사용자가 권한이 필요한 기능과 상호작용하기 시작할 때 컨텍스트에 따라 권한을 요청하는 
- 권한 취소하는 옵션을 항상 제공하는 것
- 사용자가 기능에 필요한 권한을 거부하거나 취소하면 권한이 필요한 기능을 사용 중지하는 등의 방법으로 앱의 성능을 단계적으로 저하시켜 사용자가 앱을 계속 사용할 수 있도록 하는 것
- 시스템 동작을 가정하지 않는 것

 

런타임 권한 요청 워크플로

출처 : Android developer

 

권한 부여 확인 방법
ContextCompat.checkSelfPermission() 메서드에 해당 권한을 전달하면 앱에 권한이 있는지에 따라 PERMISSION_GRANTED 또는 PERMISSION_DENIED를 반환

 

권한이 필요한 이유 설명 방법

shouldShowRequestPermissionRationale() 메서드를 사용하여 이전에 권한 요청을 거부했었는지 Boolean 값으로 받음

그 값이 true라면 설명 UI를 띄워주고 권한 요청 진행하고 false라면 그냥 권한 요청 진행

 

권한 요청 방법

(A10 이하 - 개발자가 직접 권한 요청 코드를 관리하는 방법)

1) 특정 기능 실행 시 위의 권한이 이미 있는지 확인하는 것과 설명UI가 필요한지 체크한 후 다 통과하면 권한 요청 시작 

2) ActivityCompat.requestPermissions(Context, String[], REQUEST_CODE) 안에 권한들을 배열상태로 만들어 집어넣어 전달

3) 사용자가 시스템 권한 대화상자에 응답하면 시스템은 onRequestPermissionsResult()를 호출

4-1) onRequestPermissionsResult() 안에서 REQUEST_CODE에 맞는 조건문에서 grantResults가 0보다 크고 첫번째 요소가 PackageManager.PERMISSION_GRANTED라면 권한이 부여된 걸로 확인하고 이후 과정을 진행

4-2) 조건문이 false라면 권한이 없어 해당 기능을 사용할 수 없음을 설명

(A11 이상 - 시스템이 권한 요청 코드를 관리하는 방법)

1) 특정 기능 실행 시 위의 권한이 이미 있는지 확인하는 것을 통과하면 권한 요청 시작

2) 시스템 권한 대화상자를 표시하려면 ActivityResultContracts.RequestPermission() (권한이 여러라면 ActivityResultContracts.RequestMultiplePermissions()을 사용)을 가지고 있는 ActivityResultLauncher 인스턴스에서 launch() 메서드를 호출

3-1) 권한이 허용된 경우 이후 과정을 진행

3-2) 권한이 거절된 경우 설명UI가 필요한지 체크한 후 다이얼로그로 띄우고 다시  시스템 권한 대화상자 표시

3-3) 권한이 재차 거절된 경우 이제 다시는 시스템 권한 대화상자를 표시할 수 없기 때문에 이에 맞는 과정 진행

(참고 : https://velog.io/@alsgus92/Android-Runtime-%EA%B6%8C%ED%95%9CPermission-%EC%9A%94%EC%B2%AD-Flow-%EB%B0%8F-Tutorial

https://velog.io/@maratangsoft/%EB%9F%B0%ED%83%80%EC%9E%84-%EA%B6%8C%ED%95%9C-%EC%9A%94%EC%B2%AD-%EC%A0%95%EB%A6%AC)

 

권한 거부 확인 방법

Android 11(API 수준 30)부터 사용자가 앱이 기기에 설치된 전체 기간 동안 특정 권한에 관해 거부를 두 번 이상 탭하면 앱에서 그 권한을 다시 요청하는 경우 사용자에게 시스템 권한 대화상자가 표시되지 않음

이러한 사용자의 작업은 '다시 묻지 않음'을 의미(= 영구 거부)

adb shell dumpsys package 패키지명 명령어 사용하면 결과 내 runtime permissions 아래에 사용자가 한 번 거부한 권한은 USER_SET으로, 거부를 두 번 선택하여 영구적으로 거부된 권한은 USER_FIXED로 플래그가 지정되어있음

 

3. 특별 권한 요청

특별 권한은 런타임 권한과 달리 시스템 설정의 특수 앱 액세스 페이지에서 특별 권한을 부여

코드 상에서 인텐트를 이용하여 해당 페이지로 이동 가능

특별 권한 부여 후 앱으로 돌아왔을 때 onResume에서 확인 가능

 

특별 권한 예시

정확한 알람 예약 / 다른 앱 위에 표시하거나 그리기 / 모든 저장소 데이터에 액세스

 

특별 권한 요청 워크플로우

출처 : Android developer

 

권한 요청 방법

1) 특정 기능 실행 시 필요한 특별 권한이 부여되었는지 확인

2) 부여되어있지 않다면 인텐트를 이용하여 시스템 설정의 특수 앱 액세스 페이지로 이동

3) 사용자가 직접 권한을 부여하고 앱으로 돌아오면 onResume()에서 권한 확인 후 이후 과정 처리

 

 

일회성 권한

Android 11(API 수준 30)부터 앱이 위치, 마이크 또는 카메라와 관련된 권한을 요청할 때마다 사용자에게 표시되는 권한 대화상자에 번만 허용이라는 옵션이 포함

앱의 활동이 표시되는 동안 앱에서 데이터에 액세스할 수 있고 사용자가 앱을 백그라운드로 보내면 앱에서 짧은 시간 동안 데이터에 계속 액세스할 수 있음
활동이 표시되는 동안 포그라운드 서비스가 실행되고 사용자가 앱을 백그라운드로 이동하면 포그라운드 서비스가 중지될 때까지 앱에서 데이터에 계속 액세스 가능

반응형