Mobile/Kotlin

[Kotlin] 권한의 이해

클리엘 2021. 2. 24. 15:36
728x90

1. 권한 명세

 

설정 파일을 통해 앱의 접근권한을 지정하는 것을 말합니다. 설정은 app -> manifests -> AndroidManifest.xml 에서 다음과 같이 user-permission 할 수 있으며

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapplication">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
</manifest>

상기 예제는 android.permission.INTERNET을 통해 인터넷 접근권한을 지정하고 있습니다. 권한을 명시하면 앱에서 해당 권한을 필요로 할 때 사용자에게 권한의 허용 여부를 묻게 됩니다.

 

android.permission.INTERNET처럼 보편적인 권한은 일반 권한(Normal Permission)으로 분류되며 일반 권한에 해당하는 권한은 다음과 같은 것들이 있습니다.

 

ACCESS_NETWORK_STATE 네트워크 상태 확인
ACCESS_WIFI_STATE 와이파이 상태 확인
BLUETOOTH 블루투스 상태 확인
INTERNET 인터넷(네트워크) 사용
NFC NFC 사용
SET_ALARM 알람 설정
VIBRATE 진동 설정

 

반면 위치나 전화번호부 같은 개인정보영역이나 기타 다른 앱의 실행에 영향을 줄 수 있는 권한의 경우 '위험 권한'으로 분류되며 다음과 같은 권한을 위험 권한으로 분류하고 있습니다.

 

CALENDAR READ_CALENDAR 캘린더 읽기
WRITE_CALENDAR 캘린더 쓰기
CAMERA CAMERA 카메라
CONTACTS READ_CONTACTS 주소록 읽기
WRITE_CONTACTS 주소록 쓰기
GET_ACCOUNTS 게정 정보 얻기
LOCATION ACCESS_FINE_LOCATION 위치 확인
ACCESS_COARSE_LOCATION
MICROPHONE RECORD_AUDIO 녹음기능
PHONE READ_PHONE_STATE 폰 상태
READ_PHONE_NUMBERS 전화번호
CALL_PHONE 전화 발신
ANSWER_PHONE_CALLS 전화 응답
READ_CALL_LOG 전화 로그 읽기
WRITE_CALL_LOG 전화 로그 쓰기
ADD_VOICEMAIL 음성메일 추가
USE_SIP SIP 사용
PROCESS_OUTGOING_CALLS Broadcast 수신
SENSORS BODY_SENSORS 센서
SMS SEND_SMS 문자 발신
  RECEIVE_SMS 문자 수신
  READ_SMS 문자 읽기
  READ_WAP_PUSH WAP 읽기
  RECEIVE_MMS MMS 받기
STORAGE READ_EXTERNAL_STORAGE 외부 스토리지 읽기
WRITE_EXTERNAL_STORAGE 외부 스토리지 쓰기

 

https://developer.android.com/guide/topics/security/permissions?hl=ko

 

시스템 권한  |  Android 개발자  |  Android Developers

Permissions Google I/O 2015—Android M Permissions: Best Practices for Developers Android is a privilege-separated operating system, in which each application runs with a distinct system identity (Linux user ID and group ID). Parts of the system are…

developer.android.com

위 표를 보면 READ_CONTACTS와 WRITE_CONTACTS가 CONTACTS라는 그룹으로 묶여 있는 걸 확인할 수 있는데 이는 일단 어떤 권한이 부여되면 해당 권한에 속하는 그룹의 다른 권한에도 다시 권한 요청을 하지 않고 동일한 권한이 그대로 부여된다는 것을 의미합니다. 예를 들어

<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>

처럼 권한이 명시된 경우 처음에는 권한의 허용 요청이 발생하게 되고 이를 승인했다면 이후 같은 그룹에 해당하는  android.permission.WRITE_CONTACTS에도 따로 권한 요청이 나오지 않고 그대로 권한이 부여되는 것입니다.

 

이러한 위험 권한은 Gradle Scrips -> build.gradle (Modules app)에 targetSdkVersion이 23 이상으로 설정되어야만 사용이 가능하며

 

소스코드 안에서 권한 요청과 이에 관련된 부가적인 처리가 추가되어야 합니다.


2. 기능 명세

 

권한과는 직접 관련이 없지만 AndroidManifest.xml에 앱에서 필요한 기능을 지정하는 것으로 user-feature태그로 명시됩니다. 아래 예제에서는 카메라 기능을 사용하기 위해 명시되는 이를 보여주고 있는데 앱에서 사용되는 기능에 따라 아래 태그와 같이 기능 명세가 자동으로 추가되는 경우가 있으며

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapplication">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <uses-feature android:name="andoird.hardware.camera" android:required="true"></uses-feature>
</manifest>

이렇게 명시되는 기능에 따라 앱스토어에서 앱이 검색되는 범위가 달라지게 됩니다. 예를 들어 위에서 처럼 카메라 기능이 명시되면 카메라가 없는 기기에서는 앱이 검색되지 않습니다. 다만 android:required를 false로 설정하면 해당 기능을 사용할 수 없는 기기에서도 앱을 검색하고 내려받아 설치할 수 있도록 조치할 수 있습니다.

728x90