[Android] Internal vs External Storage feat.API 11 (1)

양현진·2022년 3월 30일
0

Oh My Android

목록 보기
3/22
post-thumbnail
post-custom-banner

회사에서 Url링크로 펌웨어를 다운받고 블루투스 디바이스에게 펌웨어를 넘겨주는 프로젝트를 담당했었다. 초기 계획으론 링크 다운로드이니 당연히 외부 저장소의 Downloads폴더에 펌웨어가 위치할거라 생각하기도하고, Retrofit으로 String이나 Int값만 해봤지 .zip파일까지 응답으로 올 거라곤 생각을 못해서 Android의 DownloadManager를 사용하여 저장하려 했었다. 하지만 해당 펌웨어는 회사의 자산이기에 접근성이 있는 외부 저장소에 위치시키기엔 다소 민감한 문제였고, 그리하여 내부 저장소로 계획을 변경하였는데 여기서 문제가 발생했는데

DownloadManager에서 꾸역꾸역 디렉터리를 내부 저장소 경로로 바꿨지만 에러가 발생, 해당 문제를 하루종일 찾다보니 결국 외부 저장소만 지원한다는 사실을 알게 되었다..

평소 Stack Overflow는 외국인만 득실대서 손이 안가는 사이트였지만 사수님께서 하나의 링크를 찾아 보내주셨고, 그 내용은 Retrofit으로 zip파일을 받는 법이었다. 이는 현재 포스팅과 연관이 없으니 여기에서 따로 포스팅하겠다.

본론으로 와서, 안드로이드의 내부 외부 저장소가 어떤 차이가 있어 이런 제한이 생기고, 어떠한 경우에 써야하는지 알아보려한다.
우선 간략하게 둘을 비교하자면

내부 저장소

: OS에서 앱에게 주어진 저장 공간, 자연스럽게 앱이 삭제가 되면 할당된 공간도 사라지기에 폴더 및 파일이 삭제된다.

외부 저장소

: 외부SD카드에 있는 저장 공간, 추후 말할 외부 앱 개별 공간은 앱이 삭제되어도 사라지지 않지만, 그 외 경로들은 남아있는다.
느끼듯이, 내부 저장용량보단 외부 저장용량이 더 커 크기가 큰 파일들은 외부에 저장할 일이 발생할 수 있다.

로그에 나와있는대로 저장되는 경로부터가 다르다!

현재 API 레벨별로 방식이 달라져서 이 정도만 말하고 바로 변화된 요소를 살펴보자.

API 10까지

내부 저장소

  • 앱 고유의 공간으로 다른 앱에서의 접근, 심지어 핸드폰 주인도 보거나 수정할 수 없어 보안이 상당하다. 실제로 컴퓨터에 연결해보면 외부 개별 앱 공간은 나오지만 내부 저장소의 폴더들은 안보인다.
  • 그러기에 따로 Manifest의 권한이나 런타임 권한이 필요없이 앱 본인은 접근이 가능하다.

외부 저장소

  • 공용공간은 EXTERNAL_STORAGE권한이 있으면 다른 앱이 읽거나 쓰는 행동을 할 수 있었다. 어찌보면 편한 작업이 예상되지만, 보안적인 면에서는 굉장히 취약하다는 것을 글로만 봐도 알 수가 있다. 외부 저장소에도 개별 앱 공간이 있는데, 도대체 왜 개별 공간이 두개 였던지 궁금해서 여러 검색해봤는데 이에 대한 설명글이 없어서 아직도 궁금하다. 추측으로는, 숨겨야 할 파일이 있는데 용량이 큰 경우 외부의 개별 공간에 저장했을라나? 정도로 짐작중이다. 뭐 어짜피 끝난놈인데. 아 뒤에 들었는데 얘도 권한이 있으면 접근이 가능하다고 한다ㄷㄷ. 그래서 그런지 외부 개별 앱 공간은 잘 안쓰였다고 한다.

API 11 이상

내부 저장소

는 이하 동문

외부 저장소

외부 저장소에 많은 변화가 생겼다. 이름이 Scope Storage로 변신했는데 해석하면 범위 저장소인데, 접근 유뮤가 확실해져서 단어를 적용한듯 하다.

  • 개별 앱 공간은 샌드박스 형식으로 보안이 강화되었고, 이제 더 이상 다른 앱에서의 접근이 불가해진다. 물론 자신의 앱 공간엔 접근이 가능하다.
  • 새롭게 생긴 공용공간엔 각 확장자에 맞는 파일이 들어가게 된다. ex) 사진 폴더 - .png, .jpg
  • 그 외 확장자들은 모두 다운로드 폴더에 저장되어진다.
  • 공용공간에도 앱마다 경로가 지정되어 있고, 자신의 앱 경로엔 권한 없이 접근이 가능하다.
  • 유일하게 권한이 필요한 경우가 있는데 이는 외부 앱이 특정 앱의 공용공간(다운로드 제외)에 접근하려하면 READ_EXTERNAL_STORAGE권한이 필요하다.
  • 다운로드 폴더의 경우 SAF(System Access Framework)를 이용하여 사용자가 직접 파일을 누르고 난 뒤 권환을 요청하는 방식으로 변경되었다.

변화된 정책을 보고 느낀건, 당연히 이게 맞는게 아닌가 싶었다. 전 방식이었다면 악의가 있는 앱이 사용자 핸드폰에 있는 외부 저장소에 있는 파일들을 권한만 있으면 읽거나 수정하거나 삭제하거나 빼올 수 있었기 때문이다. 나는 젊어서 모르겠는데 이에 대한 이슈가 상당히 심각했다고 들었다. 이제는 WRITE권한이 사라져 다른 앱의 파일엔 수정이 불가하도록 변했다.

다른 앱이 만든 파일 내용을 수정하려면 해당 기능을 위한 기본 앱이 되어야한다. 이미지에 접근하고 싶다면 기존 갤러리앱을 해당 앱으로 바꾸면 가능하다고 한다.

profile
Android Developer
post-custom-banner

0개의 댓글