일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- GCP
- MediaPlayer
- Koin
- MotionLayout
- 동영상
- mvvm
- mysql
- Kotlin
- 테스트 자동화
- 인앱결제
- Reactive
- list
- Animation
- google play
- Observable
- Android
- databinding
- SwiftUI Tutorial
- junit
- RxKotlin
- MediaSession
- android13
- SWIFTUI
- PagingLib
- liveData
- node.js
- Android 13
- rx
- paging
- node
- Today
- Total
봄날은 갔다. 이제 그 정신으로 공부하자
Android 13 - 7편 (새로운 기능: 개인 정보 보호 및 보안) 본문
이번 글에서는 Android 13의 새로운 기능 중 개인 정보 보호 및 보안에 관련된 내용에 대해 알아보도록 하겠습니다.
Context-registered receiver의 안전한 내보내기 지원
Runtime receiver를 더 안전하게 만들기 위해, Android 13에서는 앱의 특정 broadcast receiver가 내보내져야 하며 기기의 다른 앱이 볼 수 있어야 하는지 여부를 지정할 수 있습니다. Android 13 이상을 타겟팅하는 앱에서 사용할 수 있는 이와 같은 내보내기 구성은 앱 취약성의 주요 원인 중 하나를 방지하도록 도와줍니다.
이전 버전의 Android에서는 receiver가 signature permission에 의해 보호되지 않은 한 기기의 모든 앱이 동적으로 등록된 수신기로 보호되지 않은 브로드캐스트를 보낼 수 있었습니다.
안전을 강화해 주는 기능을 지원하려면 아래와 같은 작업이 필요합니다.
- DYNAMIC_RECEIVER_EXPLCIT_EXPORT_REQUIRED 호환성 프레임워크 변경사항을 사용 설정합니다.
- 아래 코드에서 처럼 앱의 각 broadcast receiver에서 다른 앱이 이 앱으로 브로드캐스트를 보낼 수 있는지 여부를 명시적으로 지정합니다.
// This broadcast receiver should be able to receive broadcasts from other apps.
// This option causes the same behavior as setting the broadcast receiver's
// "exported" attribute to true in your app's manifest.
context.registerReceiver(sharedBroadcastReceiver, intentFilter, RECEIVER_EXPORTED)
// For app safety reasons, this private broadcast receiver should **NOT**
// be able to receive broadcasts from other apps.
context.registerReceiver(privateBroadcastReceiver, intentFilter, RECEIVER_NOT_EXPORTED)
* 주의: DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED 호환성 프레임워크 변경사항을 사용 설정한 경우 각 broadcast receiver별로 RECEIVER_EXPORTED 또는 RECEIVER_NOT_EXPORTED를 반드시 지정해야 합니다. 그러지 않으면 broadcast receiver를 등록하려고 시도할 때 시스템에서 SecurityException이 발생됩니다.
이러한 상황을 감지할 수 있도록 Android 스튜디오에 lint 규칙이 적용되며, 향후 버전의 ContextCompat은 올바르지 않은 수신기 구성을 확인합니다.
Photo Picker
Android 13(API 수준 33)에서는 새로운 사진 선택 도구를 지원합니다. 이 도구는 사용자가 전체 미디어 라이브러리 액세스 권한을 앱에 부여하지 않고도 안전하게 미디어 파일을 선택하는 방법을 기본으로 제공합니다.
미디어 선택
사진 선택 도구는 탐색 가능하고 검색 가능한 인터페이스를 제공하여 사용자에게 날짜별로 정렬된(최신 항목부터 오래된 항목 순서로) 미디어 라이브러리를 표시합니다. 사용자에게 사진만 또는 동영상만 표시되도록 지정할 수 있으며 기본적으로 허용된 최대 미디어 선택 수는 1로 설정됩니다.
Photo Picker 사용 방법
앱은 android.provider.extra.PICK_IMAGES_MAX 값을 선언할 수 있습니다. 이 값은 사용자에게 표시될 때 Photo Picker에 표시되는 미디어 파일의 최대 개수를 나타냅니다. 예를 들어 사용자에게 계정에 필요한 프로필 사진을 선택하라는 메시지가 표시되면 사진 한 장을 최대 공유 요구사항으로 설정합니다.
* 참고: 최대 1개를 선택하면 Photo Picker가 절반 화면 모드로 열립니다.
단일 선택 모드에서 Photo Picker를 실행하는 방법은 아래와 같습니다.
// Launches photo picker in single-select mode.
// This means that the user can select one photo or video.
val intent = Intent(MediaStore.ACTION_PICK_IMAGES)
startActivityForResult(intent, PHOTO_PICKER_REQUEST_CODE)
사진이나 동영상을 여러 개 선택해야 한다면 아래 코드와 같이 EXTRA_PICK_IMAGES_MAX 추가 항목을 사용하여 Photo Picker에 표시되어야 하는 최대 이미지 수를 지정하면 됩니다.
// Launches photo picker in multi-select mode.
// This means that user can select multiple photos/videos, up to the limit
// specified by the app in the extra (10 in this example).
val maxNumPhotosAndVideos = 10
val intent = Intent(MediaStore.ACTION_PICK_IMAGES)
intent.putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, maxNumPhotosAndVideos)
startActivityForResult(intent, PHOTO_PICKER_MULTI_SELECT_REQUEST_CODE)
단, 최대 파일 수로 지정할 수 있는 최대 수에 관한 플랫폼 제한이 있습니다.
이 제한에 액세스하려면 MediaStore#getPickImagesMaxLimit()를 호출해야 합니다.
Photo Picker가 실행되면 새 ACTION_PICK_IMAGES 인텐트를 사용하여 결과를 처리합니다. Photo Picker는 URI 집합을 반환합니다.
// onActivityResult() handles callbacks from the photo picker.
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode != Activity.RESULT_OK) {
// Handle error
return
}
when (requestCode) {
REQUEST_PHOTO_PICKER_SINGLE_SELECT -> {
// Get photo picker response for single select.
val currentUri: Uri = data.data
// Do stuff with the photo/video URI.
return
}
REQUEST_PHOTO_PICKER_MULTI_SELECT -> {
// Get photo picker response for multi select.
var i = 0
while (i < data.clipData!!.itemCount) {
...
기본적으로 Photo Picker에서는 사진과 동영상을 모두 표시합니다.
setType() 메서드에서 MIME 유형을 설정하여 사진으로만 또는 동영상으로만 필터링할 수도 있습니다.
예를 들어 Photo Picker에 동영상만 표시하려면 video/*를 setType()에 전달합니다.
// Launches photo picker for videos only in single select mode.
val intent = Intent(MediaStore.ACTION_PICK_IMAGES)
intent.type = "video/*"
startActivityForResult(intent, PHOTO_PICKER_VIDEO_SINGLE_SELECT_REQUEST_CODE)
// Apps can also change the mimeType to allow users to select
// images only - intent.type = "images/*"
근처 Wi-Fi 기기의 새 런타임 권한
Android 13(API 수준 33)에서는 Wi-Fi를 통해 근처 액세스 포인트에 대한 기기의 연결을 관리하는 앱을 위해 NEARBY_DEVICES 권한 그룹의 새로운 런타임 권한을 도입했습니다. 이러한 앱은 여러 다양한 Wi-Fi API를 호출할 때 새로운 권한 NEARBY_WIFI_DEVICES를 선언해야 합니다. 만약 앱이 Wi-Fi API에서 물리적 위치를 얻지 않는다면 Android 13 이상을 타겟팅할 때 ACCESS_FINE_LOCATION권한을 선언하지 않아도 됩니다.
정확한 시간에 알람을 할 수 있는 새로운 권한
앱이 Android 13을 타겟팅하는 경우 앱에 자동으로 부여되는 USE_EXACT_ALARM 권한을 사용할 수 있습니다.
그러나 앱이 이 권한을 사용하려면 다음 기준 중 하나 이상을 충족해야 합니다.
- 알람 시계 앱 or 타이머 앱
- 예정된 일정에 관한 알림을 표시하는 캘린더 앱
앱이 정확한 알람을 설정하지만 이전 목록에 표시된 두 사례 중 어떠한 것도 충족하지 않으면 대신 SCHEDULE_EXACT_ALARM 권한을 계속 선언하고 사용자가 앱 액세스를 거부하는 상황에 대비해야 합니다.
권한 다운그레이드
Android 13부터, 앱에서 이전에 시스템 또는 사용자에 의해 부여된 런타임 권한 액세스를 취소할 수 있습니다. 이 API를 사용하면 앱에서 다음과 같은 개인 정보 보호 강화 작업을 실행할 수 있습니다.
- 사용하지 않는 권한을 삭제
- 권한 권장사항을 준수하여 사용자 신뢰를 높일 수 있습니다. 사용자에게 개발자가 사전에 취소한 권한을 표시하는 대화상자를 표시하는 것이 좋습니다.
특정 런타임 권한을 취소하려면 취소하려는 권한의 이름을 revokeSelfPermisssionOnKill()에 전달해야 합니다.
여러 런타임 권한을 동시에 취소하려면 권한 이름 모음을 revokeSelfPermisssionsOnKill()에 전달하세요.
취소는 비동기적으로 이루어지며, 앱의 UID에 연결된 모든 프로세스를 종료합니다.
시스템이 권한을 취소하려면 앱과 연결된 모든 프로세스를 종료해야 합니다. 이 API를 호출하면 시스템은 이러한 프로세스를 종료할 안전한 시기를 결정합니다. 일반적으로 시스템은 앱이 포그라운드가 아닌 백그라운드에서 장시간 실행될 때까지 기다립니다.
권한을 즉시 취소하려면 앱은 관련된 모든 프로세스를 수동으로 종료해야 합니다. 이 작업은 바람직하지 않은 사용자 환경을 만들므로 권장되지 않습니다.
사용자에게 앱의 권한이 취소되었음을 알리려면 사용자가 다음에 앱을 실행할 때 대화상자를 표시합니다. 이 대화상자에는 취소된 권한 목록이 포함될 수 있습니다.
APK Signature Scheme v3.1
Android 13에서는 기존 APK Signature Scheme v3보다 개선된 v3.1이 추가 되었습니다.
APK Signature Scheme v3.1에서는 기존 v3에서 알려진 문제가 해결되었으며 SDK 버전 타겟팅을 지원하기 때문에 이후 버전의 플랫폼을 타겟팅할 수 있습니다.
v3.1 서명 체계는 12L 이하에서는 인식되지 않는 새로운 블록 ID를 사용합니다. 따라서 플랫폼은 다음과 같은 서명자 동작을 적용합니다.
- Android 13을 실행하는 기기는 v3.1 블록의 순환된 서명자를 사용합니다.
- 이전 버전의 Android를 실행하는 기기는 순환된 서명자를 무시하고 v3.0 블록의 원래 서명자를 사용합니다.
아직 서명 키를 순환하지 않은 앱에는 추가 작업이 필요하지 않습니다. 이러한 앱이 순환할 때마다 시스템은 기본적으로 새로운 v3.1 서명 체계를 적용합니다.
이미 순환되었고 계속해서 v3.0 서명 블록의 순환된 서명 키를 사용하려는 앱은 다음과 같이 apksigner 호출을 업데이트해야 합니다.
$ apksigner sign --ks keystore.jks |
--key key.pk8 --cert cert.x509.pem
--rotation-min-sdk-version API_LEVEL
[signer_options] app-name.apk
키 저장소 및 KeyMint의 오류 보고 개선
키를 생성하는 앱의 경우 이제 키 저장소와 KeyMint에서 더 자세하고 정확한 오류 표시기를 제공합니다. java.security.ProviderException 아래에 예외 클래스 계층 구조를 추가했습니다. 여기에는 키 저장소/KeyMint 오류 코드와 오류의 재시도 가능 여부가 포함된 Android 관련 예외가 포함되어 있습니다. 또한 키 생성 및 사용(서명, 암호화) 메서드를 수정하여 새 예외를 발생시킬 수 있습니다. 개선된 오류 보고는 키 생성으로 제한되지 않으며 이제 키 생성을 다시 시도하는 데 필요한 사항을 제공합니다.
'학습' 카테고리의 다른 글
Android 13 - 번외 (테마 앱 아이콘 만들기) (0) | 2022.08.01 |
---|---|
Android 13 - 8편 (새로운 기능: 기타) (0) | 2022.07.29 |
Android 13 - 6편 (새로운 기능: 개발자 생산성) (0) | 2022.07.25 |
Android 13 - 5편 (Notification permission) (0) | 2022.07.22 |
Android 13 - 4편 (Battery Resource Utilization) (0) | 2022.07.20 |