Normal Permission은 Android에서 시스템이 사용자에게 묻지 않고 자동으로 부여하는 권한 범주입니다. Android Developer Documentation, 2024에 따르면, 일반 권한은 ProtectionLevel normal을 가지며 위험 권한과 달리 런타임 대화상자가 필요하지 않습니다. 인터넷, 네트워크 상태 및 진동에 대한 액세스를 포함하며 사용자의 민감한 데이터에 위험을 초래하지 않습니다.
핵심 사항
Normal Permission은 Android에서 ProtectionLevel normal을 가진 시스템 권한 유형으로, 설치 시 애플리케이션에 자동으로 부여됩니다. 개발자는 이를 요청하기 위한 코드를 작성할 필요가 없습니다 — AndroidManifest.xml에서 권한을 선언하기만 하면 됩니다. 사용자는 대화상자를 보지 않으며 일반 권한을 개별적으로 철회할 수 없고, 전체 애플리케이션을 제거해야만 합니다.
Android 시스템은 일반 권한을 저위험으로 분류합니다 — 개인 데이터, 카메라 또는 마이크에 대한 액세스를 제공하지 않습니다. 일반적인 예: 인터넷 액세스, 진동 제어, Wi-Fi 상태 읽기. Android Security Model (2024)에 따르면, 모든 시스템 권한의 약 40%가 일반 범주에 속합니다.
중요한 특성 — 일반 권한은 설정을 통해 런타임에 철회할 수 없습니다. 사용자가 액세스를 거부하려면 유일한 방법은 애플리케이션을 제거하는 것입니다. 개발자는 아키텍처에서 이를 고려해야 하지만, 사용자에게는 이 접근 방식이 상호 작용을 단순화합니다: 첫 실행 시 대화상자가 없습니다.
일반 및 위험 권한으로의 분류는 Android 6.0 Marshmallow(API 23)에서 도입되었습니다. 이 버전 이전에는 모든 권한이 설치 시 요청되었습니다 — 사용자는 단일 목록을 보고 전체를 수락하거나 거절했습니다. Normal Permission은 저위험 작업에 대해 이 모델을 유지한 반면, Dangerous는 런타임 요청으로 전환했습니다. 이 변경은 사용자 경험을 개선하고 동시에 보안을 강화했습니다.
많은 Android 시스템 API는 액세스가 자동이더라도 일반 권한의 명시적 선언을 필요로 합니다. 예를 들어, ConnectivityManager 클래스는 ACCESS_NETWORK_STATE를, VibratorService는 VIBRATE를, WifiManager는 ACCESS_WIFI_STATE를 필요로 합니다. 해당 uses-permission을 선언하지 않고 이러한 API를 호출하면 SecurityException이 발생합니다.
ProtectionLevel normal은 Android 권한 시스템에서 최소 보호 수준입니다. 이 수준의 권한은 매니페스트에서 선언되며, 시스템은 설치 시 선언을 확인하고 사용자 개입 없이 액세스를 부여합니다. UI 요소가 표시되지 않고 콜백이 호출되지 않습니다.
확인 메커니즘은 PackageManager 수준에서 작동합니다. APK 설치 중에 시스템은 모든 uses-permission 태그를 스캔하고, permissions.xml 파일의 시스템 정의와 대조하여 각 권한의 보호 수준을 결정하며, normal 수준의 경우 단순히 액세스를 등록합니다. 프로세스는 밀리초가 소요되며 사용자 인터페이스와의 상호 작용이 필요하지 않습니다.
부여 알고리즘은 다음과 같이 작동합니다:
사용자는 인터페이스를 통해 일반 권한을 철회할 수 없습니다. 애플리케이션 설정의 권한 섹션에는 위험 권한만 표시됩니다. 이는 기능의 민감도 수준과 관계없이 모든 권한에 대해 별도의 확인이 필요한 iOS와 대조적입니다.
Normal 및 Dangerous Permission은 Android에서 보호의 두 가지 반대 범주입니다. 주요 차이점은 부여 방식에 있습니다: 일반 권한은 설치 시 자동으로 부여되고, 위험 권한은 런타임 대화상을 통해 명시적 동의가 필요합니다. 이 구분은 Android 6.0 Marshmallow부터 Android 보안 아키텍처에 내장되어 있습니다.
주요 특성 비교:
| 특성 | Normal Permission | Dangerous Permission |
|---|---|---|
| ProtectionLevel | normal | dangerous |
| 사용자 요청 | 필요 없음 | 런타임 대화상자 필수 |
| 철회 가능성 | 없음, 앱 제거만 가능 | 가능, 언제든지 설정에서 |
| 코드 확인 | 항상 PERMISSION_GRANTED | checkSelfPermission 필수 |
| 예시 | INTERNET, VIBRATE, ACCESS_NETWORK_STATE | CAMERA, RECORD_AUDIO, ACCESS_FINE_LOCATION |
사용자는 Normal Permission을 요청할 때 대화상자를 전혀 보지 않습니다. 앱이 INTERNET을 필요로 하는 경우 — 자동으로 획득합니다. Dangerous Permission의 경우 시스템은 요청된 액세스에 대한 설명과 함께 모달 대화상자를 표시합니다. 사용자는 허용 또는 거부를 누르고 나중에 언제든지 설정을 통해 권한을 철회할 수 있습니다. 이는 인터페이스 개발 전략을 결정하는 핵심 UX 차이입니다.
Normal은 액세스가 민감한 데이터와 관련되지 않은 모든 경우에 사용해야 합니다. 연결 확인을 위한 ACCESS_NETWORK_STATE, 촉각 피드백을 위한 VIBRATE, HTTP 요청을 위한 INTERNET — 이들은 모두 일반 권한입니다. normal로 충분한 곳에 dangerous 수준을 사용하는 것은 나쁜 관행이며, 불필요한 대화상을 만들고 애플리케이션에 대한 사용자 신뢰를 떨어뜨립니다.
Android는 수십 개의 일반 권한을 정의하며, 각각 특정 시스템 기능에 해당합니다. 모두 Manifest.permission 클래스의 상수를 통해 사용할 수 있습니다. 아래는 애플리케이션 개발에서 가장 자주 사용되는 것들의 목록입니다.
| 상수 | 액세스 | 설명 |
|---|---|---|
| INTERNET | 네트워크 | HTTP 요청을 위한 네트워크 소켓 열기 |
| ACCESS_NETWORK_STATE | 네트워크 | 네트워크 상태 정보 가져오기 |
| ACCESS_WIFI_STATE | Wi-Fi | Wi-Fi 연결 정보 읽기 |
| VIBRATE | 진동 | 장치 진동기 제어 |
| BLUETOOTH | Bluetooth | Bluetooth 장치에 연결 |
| WAKE_LOCK | 전원 | 프로세서 절전 모드 전환 방지 |
| SET_ALARM | 알람 | AlarmManager를 통해 알람 설정 |
| CHANGE_NETWORK_STATE | 네트워크 | 네트워크 연결 상태 변경 |
일반 권한은 UI 표시 목적으로 Permission Group으로 그룹화되지 않습니다. Android의 그룹은 설정 화면용으로, 위험 권한만 표시됩니다. 그러나 일반 권한은 논리적으로 네트워크(INTERNET, ACCESS_NETWORK_STATE), 하드웨어(VIBRATE, WAKE_LOCK), 시스템(SET_ALARM) 및 Bluetooth 권한으로 분류할 수 있습니다.
Manifest.permission의 일부 상수는 Android 버전에 따라 보호 수준이 변경될 수 있습니다. 예를 들어, BLUETOOTH_CONNECT은 Android 12 이상에서 런타임 요청이 필요한 위험 권한이 되었지만, 이전 버전에서는 일반이었습니다. 개발자는 문서를 통해 대상 API의 현재 protectionLevel을 확인하는 것이 좋습니다.
개발자는 PackageManager를 통해 프로그래밍 방식으로 권한이 일반인지 확인할 수 있습니다. getPermissionInfo 메서드는 protectionLevel 필드에 PermissionInfo.PROTECTION_NORMAL 플래그가 포함된 PermissionInfo를 반환합니다. 이는 동적 처리 및 디버깅에 유용합니다.
fun isNormalPermission(permission: String): Boolean {
val pm = packageManager
val info = pm.getPermissionInfo(
permission,
PackageManager.GET_META_DATA
)
return info.protectionLevel ==
PermissionInfo.PROTECTION_NORMAL
}
Normal Permission 선언은 AndroidManifest.xml에서 가장 간단한 작업으로, 하나의 uses-permission 태그만 필요합니다. 보호 수준은 시스템 정의에 의해 결정되므로 추가 protectionLevel 구성이 필요하지 않습니다. 개발자는 상수의 전체 이름만 지정하면 됩니다.
<!-- AndroidManifest.xml -->
<uses-permission
android:name="android.permission.INTERNET" />
<uses-permission
android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission
android:name="android.permission.VIBRATE" />
시스템은 설치 시 모든 선언을 처리합니다. 선언된 권한 중 하나라도 normal과 다른 protectionLevel을 가지면 런타임 요청이 필요합니다. INTERNET은 가장 인기 있는 일반 권한으로, 특히 HTTP 요청을 하거나 네트워크에서 콘텐츠를 로드하는 대부분의 Android 애플리케이션에 존재합니다.
일반 및 위험 권한이 포함된 AndroidManifest.xml의 전체 예제는 차이를 보여줍니다: 구문적으로 uses-permission 태그는 동일하지만, 런타임에 INTERNET과 VIBRATE는 자동으로 부여되는 반면 CAMERA는 대화상자가 필요합니다.
<manifest
xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Normal permissions -->
<uses-permission
android:name="android.permission.INTERNET" />
<uses-permission
android:name="android.permission.VIBRATE" />
<!-- Dangerous permission -->
<uses-permission
android:name="android.permission.CAMERA" />
</manifest>
라이브러리(Google Play Services, Firebase, Glide)를 사용할 때, 라이브러리는 Manifest Merger를 통해 자체 uses-permission을 최종 매니페스트에 추가할 수 있습니다. 일부는 일반(Firebase의 INTERNET)이고, 다른 것들은 위험(Google Maps의 ACCESS_FINE_LOCATION)입니다. 개발자는 게시 전에 build/outputs/logs/manifest-merger-report.txt에서 최종 병합된 매니페스트를 확인해야 합니다.
Normal Permission에는 두 가지 근본적인 제한이 있습니다: 사용자가 철회할 수 없고 관리 UI가 없다는 것입니다. 사용자가 애플리케이션을 신뢰하지 않지만 일반 권한이 이미 자동으로 부여된 경우 — 유일한 해결책은 애플리케이션을 제거하는 것입니다. 이는 일반 권한이 Android의 표준 수단으로 차단될 수 없기 때문에 특정 위험을 만듭니다.
추가 제한은 여러 프로필(Work Profile, Multiple Users)이 있는 장치에서 나타납니다. Normal Permission은 모든 프로필에 한 번에 부여됩니다 — 애플리케이션이 권한을 하나로만 제한할 수 없습니다. 엔터프라이즈 시나리오에서는 Managed Configurations를 통해 해결됩니다.
애플리케이션이 특정 시점에 Normal Permission을 사용하고 있는지 확인하는 것은 불가능합니다. 시스템 메서드 checkSelfPermission은 위험 권한에 대해서만 작동합니다. 일반 권한의 경우 항상 PERMISSION_GRANTED를 반환하여 실제 활동을 반영하지 않습니다. 이는 보안 감사 및 애플리케이션 동작 분석 시 고려해야 합니다.
또한 일부 장치 제조업체(Xiaomi, Huawei, Samsung)가 권한의 표준 동작을 수정한다는 점을 기억해야 합니다. 해당 펌웨어에서는 Normal Permission에 MIUI 또는 EMUI 셸에서 추가 권한이 필요할 수 있습니다. 개발자는 여러 제조업체의 실제 장치에서 테스트하는 것이 좋습니다.
자주 묻는 질문
Normal Permission은 설치 시 대화상자 없이 자동으로 부여됩니다. Dangerous는 사용자의 명시적 동의를 받는 런타임 요청이 필요하며 설정을 통해 철회할 수 있습니다. Normal은 ProtectionLevel normal을, Dangerous는 protectionLevel dangerous를 사용합니다.
아니요, 일반 권한의 경우 AndroidManifest.xml에서 uses-permission을 선언하는 것으로 충분합니다. 요청 코드가 필요하지 않습니다 — 시스템이 자동으로 액세스를 부여합니다. 이는 ActivityCompat.requestPermissions이 필요한 위험 권한과 구별됩니다.
가장 많이 사용되는 것: INTERNET(네트워크 요청), ACCESS_NETWORK_STATE(연결 확인), VIBRATE(촉각 피드백), WAKE_LOCK(프로세서 유지). 거의 모든 Android 애플리케이션이 최소한 INTERNET을 사용합니다.
아니요, Normal Permission은 애플리케이션 설정을 통해 철회할 수 없습니다. 액세스를 중단하는 유일한 방법은 애플리케이션을 제거하는 것입니다. 이는 사용자가 언제든지 비활성화할 수 있는 위험 권한과의 주요 차이점입니다.
PackageManager.getPermissionInfo를 사용하고 권한의 문자열 이름을 전달합니다. 메서드는 protectionLevel 필드가 있는 PermissionInfo를 반환합니다. 카테고리를 결정하려면 PermissionInfo.PROTECTION_NORMAL 또는 PROTECTION_DANGEROUS 상수와 비교하세요.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.