개발일지

[Android] Scoped Storage 본문

Android

[Android] Scoped Storage

강강강 2021. 6. 29. 19:11
  • 안드로이드 Q 이전 (Legacy Storage)
    • 외부저장소가 하나의 거대한 공용 저장소로 동작 
    • 외부저장소를 읽고 쓸 수 있는 권한이 있으면 누가 생성한 파일인지, 어떤 경로에 지정된 파일인지 관계없이 모든 파일에 접근 가능함 (별다른 제한 없이 모든 종류의 파일을 생성할 수 있음 )
    • 개별 앱을 위한 별도의 공간이 마련되어 있음(private files)
  • 안드로이드 Q 이전
  • Public Files 공간은 READ_EXTERNAL_STORAGE /  WRITE_EXTERNAL_STORAGE 권한만 있다면 자유롭게 읽고 쓸 수 있음
  • 최상위 경로로 가지고 오도록 해던 Environment.getExternalStorageDirectory() 사용 못함
  • 안드로이드 Q 이후 (Scoped Storage)
  • → 기존 외부 저장소의 Public Files 공간이 완전히 사라지고 안드로이드Q 부터는  '사진 및 동영상' / '음악' / '다운로드' / 샌드박스 구조의 '개별 앱 공간'으로 나누어 관리하게 됨.

샌드박스 모델: 외부로 부터 받은 파일을 바로 실행하지 않고 보호된 영역에서 실행시켜 봄으로써 외부로부터 들어오는 파일과 프로그램이 내부 시스템에 악영향을 주는 것을 미연에 방지하는 기술→ 외부로부터 유입되는 악성코드로부터 시스템 내 파일이나 프로세스를 보호→ 어떤 코드가 작동 가능한 범위를 제한하고 악용될 수 있는 승인을 제외한 채 필요 최소한의 승인만 부여함→ 악성코드가 활동해 감염되고 침투되더라도 샌드박스 밖으로는 전파되지 못함

 

  1. 개별 앱마다 루트 디렉터리가 모두 달라짐 → 더 이상 파일 절대 경로를 사용할 수 없음 

      2. 개별 앱 공간은 샌드박스 형식으로 isolated 된다. 앱은 다른 앱의 저장 공간에 접근할 수 없다. 

      3. 자신이 소유한 파일을 읽고 쓰기 위해서는 별도의 권한을 요청할 필요 없다. (기존의 불필요한 사용자 권한 요청을 줄일 수 있음)
          → 공용 공간에 저장된 미디어 파일 중 다른 앱이 생성한 미디어 파일에 접근하는 경우에만 권한이 필요함 → 이를 위해 안드로이드Q 에서는 새롭게 READ_MEDIA_IMAGES, READ_MEDIA_VIDEO, READ_MEDIA_AUDIO 권한 추가됨


      주의: WRITE_  형태의 권한이 존재하지 않음 / 다운로드 공간 접근을 위한 권한은 존재하지 않음 (쓰기 권한이 존재하지 않기 때문에 자신이 생성한 파일 외에 다른 앱이 생성한 파일을 수정할 수 없음)

 

안드로이드 Q 버전의 저장소 구분

[ 안드로이드 Q 이후 저장소 접근 방식 ]

콘텐츠 유형액세스 방법권한다른 앱 액세스 가능 여부앱 제거 시 파일이 삭제 여부

앱 전용으로
사용되는 파일
내부저장소: getFileDir() / getCacheDir()
외부저장소: getExternalFilesDir() / getExternalCacheDir()
내부저장소: X
외부저장소: X
Android 4.4 (API 19) 이상에서는 앱이 외부 저장소 내 앱별 디렉터리에 액세스 하기 위해 저장소 관련 권한을 요청할 필요 없음
파일이 내부 저장소 내
디렉터리에 있다면 → X
파일이 외부 저장소 내
디렉터리에 있다면 → O

O
공유 가능한 미디어 파일
(이미지, 오디오, 파일, 동영상)
MediaStore API
-MediaStore.Images: 사진 파일 
-MediaStore.Video: 비디오 파일 
-MediaStore.Audio: 음악 파일 

→ 공용 폴더 아래의 모든 파일들을 탐색해서 찾는 것이 아니라 MediaStore에 쿼리를 하여 Uri 객체를 얻어 사용해야 함 
Android 10 (API 29) 이상에서 다른 앱의 파일에 액세스 할 때에는(파일 생성할 때에는 권한 필요 없음)
READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE
Android 9 (API 28) 이하에서 모든 파일에 권한이 필요함
O
READ_EXTERNAL_STORAGE 권한 필요
X
다운로드한 파일 SAF(Storage Access Framework)
-Document Provider : 문서(파일)을 제공하는 주체 
-Client app :프로바이더가 제공하는 문서를 사용하는 앱 
-Selector :  일종의 시스템 UI 로 클라이언트 앱에서 필요한 파일을 사용자가 선택할 때 사용됨 
X O ( System File Picker) X

→ 앱은 직접 파일에 접근할 수 없고 MediaStore 와 SAF 를 통해 파일에 대한 Uri 를 얻어 접근해야 함

→ 사용자가 앱을 필요로 하는 파일에만 접근 권한을 부여할 수 있게 만들고 보안을 향상 시키려는 목적 

 

참고: https://developer.android.com/training/data-storage

 

데이터 및 파일 저장소 개요  |  Android 개발자  |  Android Developers

Android는 다른 플랫폼의 디스크 기반 파일 시스템과 유사한 파일 시스템을 사용합니다. 시스템은 앱 데이터를 저장하기 위한 다음과 같은 여러 옵션을 제공합니다. 앱별 저장소: 내부 저장소 볼

developer.android.com

======================================================================================

[ 파일 접근 변화 ]  : 이전에는 외부 저장소 전체를 볼 수 있어서 DCIM, Movies, Music 등 각각의 폴더를 직접적으로 볼 수 있고 관리할 수 있었다면 Scoped storage가 적용된 순간부터는 파일 관리자 앱 만의 공간을 볼 수 있게 됨 

[ 권한 요청의 변화 ]  : 기존에 권한을 요청할 때 외부 저장소 접근 권한만 요청하고 끝났다면, 앞으로는 사진, 동영상, 음악에 대해서 각각 접근 권한을 요청하게 될 거이고 사용자는 개별적으로 승인해줘야 함. (앱마다 접근할 수 있는 권한이 보다 세부적으로 나누어서 할당할 수 있게 됨)

 

권한요청

 


※ 앱이 Android 10 디바이스에서 Scoped storage 정책을 적용받지 않으려면 다음 중 1가지 방법을 따라야 함

  1. 안드로이드 API 28 이하를 Target SDK 로 설정 
  2. 안드로이드 API 29 이상을 Target SDK 로 설정하는 경우, requestLegacyExternalStorage 속성을 true 로 설정하며 Scoped storage 정책이 적용되지 않음
  3. Android 11(R)을 타겟팅하는 앱은 Scoped Storage 정책이 강제로 적용됩니다. requestLegacyExternalStorage 속성으로 이전 방식을 선택할 수 없습니다. 
  4. 하지만 Android 10을 타겟팅하는 앱은 requestLegacyExternalStorage 속성으로 선택이 가능합니다.