160 likes | 164 Views
안드로이드 권한. 허준영 (jyheo@hansung.ac.kr). 권한. 앱 샌드박스 앱 자신의 파일만 접근 , 제한된 서비스 접근 시스템이나 다른 앱과 상호작용을 위해 권한 필요 권한 특정 연산을 수행할 수 있음을 나타내는 표시 매우 다양한 종류의 권한 SD 카드 , 카메라 , 마이크와 같은 하드웨어 접근 연락처와 같은 데이터 접근 다른 앱의 컴포넌트 실행 커스텀 권한. 권한. $ adb shell $ pm list permissions.
E N D
안드로이드 권한 허준영(jyheo@hansung.ac.kr)
권한 • 앱 샌드박스 • 앱 자신의 파일만 접근, 제한된 서비스 접근 • 시스템이나 다른 앱과 상호작용을 위해 권한 필요 • 권한 • 특정 연산을 수행할 수 있음을 나타내는 표시 • 매우 다양한 종류의 권한 • SD카드, 카메라, 마이크와 같은 하드웨어 접근 • 연락처와 같은 데이터 접근 • 다른 앱의 컴포넌트 실행 • 커스텀 권한
권한 • $ adb shell • $ pm list permissions pm: package manager command generic_x86:/ $ pm list permissions … … permission:android.permission.READ_OEM_UNLOCK_STATE permission:com.android.vending.billing.ADD_CREDIT_CARD permission:android.permission.SET_HARMFUL_APP_WARNINGS permission:com.google.android.apps.docs.permission.C2D_MESSAGE permission:android.permission.SET_SCREEN_COMPATIBILITY permission:com.android.vending.billing.IN_APP_NOTIFY.permission.C2D_MESSAGE permission:com.google.android.gtalkservice.permission.GTALK_SERVICE permission:android.permission.MEDIA_CONTENT_CONTROL permission:android.permission.DELETE_PACKAGES permission:android.permission.MANAGE_WIFI_WHEN_PERMISSION_REVIEW_REQUIRED permission:com.google.android.gms.magictether.permission.DISABLE_SOFT_AP permission:com.google.android.calendar.permission.READ_OOBE permission:com.google.android.gms.chromesync.permission.METADATA_UPDATED generic_x86:/ $ permission:android.permission 기본 안드로이드 내장 권한 permission:패키지이름.permission 특정 앱의 컴포넌트 접근을 위한 권한
권한 보호 수준 • Protection Level • Normal • 개인정보 노출의 위험이 없는 권한 • 사용자에게 권한 확인 받지 않고 허가함 • Signature • 동일한 키로 서명된 앱의 경우만 자동으로 권한 부여함 • Dangerous • 개인정보 노출 위험성이 있는 권한 • 사용자에게 권한 부여를 확인하고 허가할 경우만 부여함
Normal 권한 • ACCESS_LOCATION_EXTRA_COMMANDS • ACCESS_NETWORK_STATE • ACCESS_NOTIFICATION_POLICY • ACCESS_WIFI_STATE • BLUETOOTH • BLUETOOTH_ADMIN • BROADCAST_STICKY • CHANGE_NETWORK_STATE • CHANGE_WIFI_MULTICAST_STATE • DISABLE_KEYGUARD • EXPAND_STATUS_BAR • FOREGROUND_SERVICE • GET_PACKAGE_SIZE • INSTALL_SHORTCUT • INTERNET • KILL_BACKGROUND_PROCESSES • MANAGE_OWN_CALLS • MODIFY_AUDIO_SETTINGS • NFC • READ_SYNC_SETTINGS • READ_SYNC_STATS • RECEIVE_BOOT_COMPLETED • REORDER_TASKS • REQUEST_COMPANION_RUN_IN_BACKGROUND • CHANGE_WIFI_STATE • REQUEST_COMPANION_USE_DATA_IN_BACKGROUND • REQUEST_DELETE_PACKAGES • REQUEST_IGNORE_BATTERY_OPTIMIZATIONS • SET_ALARM • SET_WALLPAPER • SET_WALLPAPER_HINTS • TRANSMIT_IR • USE_FINGERPRINT • VIBRATE • WAKE_LOCK • WRITE_SYNC_SETTINGS
권한 할당 • 리눅스 시스템에 의한 권한 할당 • 네이티브 데몬과 같이 패키지 매니저와 무관한 프로세스들 • 프로세스에 할당된 UID/GID에 따라 권한 확인 • 디바이스 파일, 유닉스 도메인 소켓등의 시스템 자원 접근시 • 패키지 매니저에 의한 권한 할당 • 프레임워크 수준에서 앱이나 시스템 서비스 등이 요청하는 안드로이드 권한
권한 할당(패키지 매니저) • 각 앱(패키지)은 고유의 UID를 가짐 • 패키지 매니저 서비스는 특정 UID가 어떤 권한을 가지고 있는지 확인 해줌 • Context.checkPermission(permission, pid, uid) • 전달된 uid가 해당 permission을 가지고 있으면 PERMISSION_GRANTED를 리턴, 없으면 PERMISSION_DENIED 리턴
권한 할당 • 액티비티와 서비스 권한 적용 • startActivity()나 startService()를 부를 때, 호출되는 액티비티나 서비스에 필요한 권한을 지정하고호출한 앱이 지정한 권한을 가지고 있는지 확인할 수 있음 • 지정한 권한이 없을 경우 SecurityException이 발생 • 컨텐트 제공자 권한 적용 • 컴포넌트 전체, 혹은 특정 URI를 보호 • 읽기와 쓰기를 분리하여 권한 적용 가능 • ContentResolver.query(), insert(), update(), delete()가 호출되면, 권한을 확인하고 권한이 확인된 경우만 처리됨
권한 할당 • 브로드캐스트 권한 적용 • Context.sendBroadcast(Intent, String receiverPermssion) • 인텐트를 브로대캐스트할 때, receiverPermission을 가지고 있는 대상만 인텐트를 수신할 수 있음 • 수신자도 발신자가 특정권한이 있는 경우만 자신한테 메시지를 보낼 수 있도록 지정할 수 있음 • 특정 시스템 브로드캐스트(BOOT_COMPLETED, PACKAGE_INSTALLED 등)는 시스템 UID나 루트UID인 경우만 보낼 수 있음
공개/비공개 컴포넌트 • 비공개 컴포넌트 • 외부에서 접근이 불가능 • 공개 컴포넌트 • 외부에서 접근이 가능 • 커스텀 권한을 만들어서 보호해야 함 • 커스텀 권한 • Manifest 파일에 명시 • 동적으로 추가할 수도 있음 • 당연한 얘기지만, • 권한이 먼저 추가된 후에 권한 부여가 가능함
Pending Intent • 앱이 자신의 권한을 다른 앱에 허용할 수 있음 • Intent와 작업(액티비티 실행이나 브로드캐스트 송신 등)을 캡슐화하여 만듬 • Pending Intent를 받은 앱은 해당 액션을 수행 할 수 있음 • Alarm이나 Notification에서 주로 사용됨 • 어떤 앱이 Alarm이나 Notification이 발생했을 때 수행할 작업을 지정하고 종료한 후에도, • 시스템이 해당 액션을 종료된 앱 대신 수행할 수 있음
앱 권한 사용 지침 • 1. 꼭 필요한 권한만 사용 • 다른 방법이 있으면 그 방법을 사용. 예를 들어 인텐트를 이용하여 다른 앱을 호출 • 2. 사용하는 라이브러리가 요청하는 권한 파악 • 3. 투명하게 • 요청하는 권한의 용도와 이유를 사용자에게 명확히 설명할 것 • 4. 명시적으로 알리기 • 민감한 정보(카메라, 마이크 등)에 접근할 때 사용자에게 지속적으로 알림
실습 - EasyPermissions • 안드로이드 6.0이후로 권한 요청 처리가 귀찮음 • 좀 더 쉽게 만들어주는 library • https://github.com/googlesamples/easypermissions
실습 – 커스텀 권한 • com.example.jyheo.myapplication이 CustomActivity를 export하고 com.example.jyheo.myapplication.permission.CUSTOM_PERMISSION Activity 실행을 위해 권한을 요구함 <application <activity android:name=".CustomActivity" … android:exported="true" android:permission="com.example.jyheo.myapplication.permission.CUSTOM_PERMISSION"></activity> … </application> <permission android:name="com.example.jyheo.myapplication.permission.CUSTOM_PERMISSION" android:protectionLevel="dangerous" /> 커스텀 권한 정의
실습 – 커스텀 권한 • 다른 앱(myapplication2) 에서 com.example.jyheo.myapplication의 CustomActivity를 시작 • SecurityException발생 • 해결은? • Myapplication2에서 startActivity하기 전에 com.example.jyheo.myapplication.permission.CUSTOM_PERMISSION권한 부여 Intent intent = new Intent(); intent.setComponent(new ComponentName("com.example.jyheo.myapplication", "com.example.jyheo.myapplication.CustomActivity")); startActivity(intent);