안드로이드에 새롭게 적용되는 저장소에 대해서 공부해보자
안드로이드 Q 베타 2를 기준으로 사용자의 개인 정보 보호를 위해서 Scoped Storage 개념이 추가되며, 각 앱마다 격리된 샌드박스 저장소 추가 및 외부 저장소 접근 방식이 변경되게 됩니다. 아직 정식 버전이 출시되지 않아 다시 변경될 가능성이 다분히 있지만, 4월 25일 구글 개발자 블로그에 타깃 API 버전이 안드로이드 Q 이상부터 적용받는다고 언급된 것을 보아서는 향후 정식 OS에서 반영될 것으로 보입니다.
고로, 이번 글에서는 Scoped Storage가 어떤 개념이고, 어떠한 변화를 가져오는지 한 번 정리해보도록 하겠습니다.
어떻게 바뀌는지 정확하게 알기 위해서 안드로이드 Q 이전의 저장소부터 살펴보겠습니다. 안드로이드의 저장소는 내부와 외부로 나뉘며, 내부 저장소는 시스템과 개별 앱이 사용하는 공간으로, 각 앱마다 개별 저장 공간을 할당받고, 이 공간은 API를 통해서 접근 및 앱 동작에 필요로 한 파일을 저장할 수 있습니다.
그리고 외부 저장소는 하나의 공용(Public) 공간으로 "READ_EXTERNAL_STORAGE"과 "WRITE_EXTERNAL_STORAGE" 권한만 있다면, 언제나 자유롭게 읽고 쓸 수 있습니다. 그리고 각각의 개별 앱을 위해서 별도의 보안(Private) 공간도 있으며, 이 공간 안에서는 권한 요청할 필요가 없이 읽고 쓸 수 있고, 앱이 삭제되면 같이 삭제가 이루어집니다.
안드로이드 Q부터 반영되는 Scoped Storage 같은 경우, 공용 공간이 사라지고 영상 및 사진 · 음악 · 다운로드(기타 파일) · 앱 별 공간으로 나누어지게 됩니다. 각 앱 별 공간은 샌드박스 형태로 격리되어 있으며 다른 앱의 저장 공간에는 접근할 수 없고 오로지 앱에 할당된 공간에서만 읽고 쓸 수 있으며 별도의 권한을 필요로 하지 않습니다. 단, 앱이 삭제가 이루어진다면 해당 공간도 같이 삭제가 이루어집니다.
그리고 앱을 삭제하더라도 유지되는 파일을 생성한다면 공유 컬렉션 공간에 영상 및 사진 · 음악 · 다운로드로 분류되어서 저장됩니다. 이 공간을 접근하여 파일을 보기 위해서는 "READ_MEDIA_IMAGES", "READ_MEDIA_VIDEO", "READ_MEDIA_AUDIO" 권한이 필요로 하며, SAF와 MediaStore API를 사용해야지만 읽고 쓸 수 있게 됩니다.
간단하게 비유해보면, 기존에는 공구 박스 안에 도구들이 막 담겨있고, 열쇠만 있다면 누구나 가져가서 쓸 수 있는 상태지만.. 새롭게 바뀐 공구 박스는 각각 도구들이 종류별로 분류되어서 자물쇠가 채워져 있고, 각각 열쇠가 있어야만 가져가서 쓸 수 있게 됩니다.
저장소에 있는 파일 접근에 대해서 어떠한 차이가 있는지 조금 더 세부적으로 살펴보게 되면, 기존에는 저장소 접근 권한만 있다면 I/O (FS)를 통해서 앱에서 바로 파일을 읽고 쓸 수 있는 형태였습니다.
그러나, Scoped Storage부터는 앱에서 바로 외부 저장소에 있는 파일로 접근할 수 없습니다. 모든 앱은 파일을 읽고 쓰기 위해 MediaStore API를 통해 SAF(Storage Access Framework)에 파일 접근 요청을 보내야 되고, SAF는 요청을 바탕으로 해당 파일을 공용 공간에서 찾아서 URI를 반환해주며, 이를 통해서 파일을 읽고 쓸 수 있게 됩니다.
즉, 조금 더 이해하기 쉽게 비유하자면, 소셜 커머스 앱이 발달하기 전에는 야식을 시켜 먹으려면 미리 가게와 메뉴를 정해서 직접 연락하고 주문을 말로 전해야 했었다면, 지금은 족발 · 피자 · 치킨 · 분식 등 카테고리를 정하고 메뉴와 할인을 선택해서 주문할 수 있다는 것에 비유할 수 있습니다.
사용자가 직접적으로 저장소가 변경되는 것을 느낄 수 있는 부분은.. 첫째 파일 관리자 앱에서 볼 수 있는 공간의 변화입니다. 이전에는 외부 저장소 전체를 볼 수 있어서 DCIM · Movies · Music 등 각각의 폴더와 파일을 직접적으로 볼 수 있고 이를 관리할 수 있었다면, Scoped Storage가 적용된 순간부터는 파일 관리자 앱 만의 공간을 볼 수 있게 됩니다.
이에 따라, 파일 관리자 앱들은 MediaStore API를 적용해서 각각의 공간을 볼 수 있는 형태로 변경되어서 대응할 것으로 생각됩니다.
둘째, 기존에는 권한을 요청할 때 외부 저장소 접근 권한만 요청하고 끝났다면, 앞으로는 사진 · 동영상 · 음악에 대해서 각각 접근 권한을 요청하게 될 것이고, 사용자는 개별적으로 권한을 승인해주어야 될 것입니다. 그리고 이를 바탕으로 앱마다 접근할 수 있는 권한이 보다 세부적으로 나누어서 할당할 수 있게 됩니다.
Scoped Storage가 적용됨으로 얻을 수 있는 가장 큰 장점은 개인 정보 보안에 있어서 정말 큰 폭으로 강화된다는 점입니다.
기존 안드로이드 저장소는 권한만 있다면 어떠한 앱이든 파일을 자유롭게 생성할 수 있고, 어떤 앱에서 어떤 파일을 사용하고 있는지에 대해서 추적도 어려웠습니다. 더군다나 공용 공간을 같이 사용하고 있다 보니 간접적으로 다른 앱의 정보를 확인할 수 있는 위험성도 가지고 있었습니다.
하지만, Scoped Storage는 각가의 앱마다 개별적인 샌드박스 공간을 제공하고 다른 앱의 공간에는 접근할 수 없도록 나누어놓고 있으며, 영상 및 사진 · 음악 · 다운로드 같은 공용 공간은 MediaStore API와 SAF로 받은 파일 URI를 통해서만 접근이 가능하다 보니 개인 정보 보안이 큰 폭으로 향상됩니다.
그리고 각각의 앱마다 샌드박스 공간만 저장 공간으로 사용할 수 있다 보니, 어떤 앱에서 어떠한 파일을 사용하고 있는지에 대해서 보다 명확하게 관리할 수 있게 됩니다.
Scoped Storage의 가장 큰 문제점은 SAF가 기존의 파일 시스템보다 성능 저하가 매우 큰 폭으로 발생하고 있다는 점이고, 이에 대해서 레딧 및 몇몇 안드로이드 개발자분의 트위터에서 언급되면서 지적되었습니다.
얼마나 성능 저하가 이루어지고 있는지는 Github에 올라온 JustinTipton 님의 SAFTraversal 레포를 보면 바로 알 수 있습니다.
기존 파일 시스템과 SAF를 Huawei Y5 와 Samsung Galaxy S8+에서 비교를 진행해보았는데.. 파일을 읽어들이는데 걸리는 시간이 최소 38배 이상 차이 나고 있는 상황입니다.
즉, 사용자는 파일 하나를 열어보기 위해서 기존보다 약 38배 이상의 시간을 소요해야 된다는 것이고, 이는 분명히 개선이 필요로 한 부분입니다. 만약 이 상태 그대로 정식 버전에 반영되어서 업데이트가 이루어진다면, 사용자 레벨에서는 분명히 기존보다 느려진 속도로 비난이 있을 수밖에 없을 것 같습니다.
그리고, 본인의 기기에서도 어느 정도 성능 저하가 발생되는지 한 번 알아보고 싶으시다면, tliebeck 님의 레포에 올라온 SAFTest 앱을 통해서 한 번 측정해보시길 바랍니다.
Scoped Storage가 어떠한 것인지 한 번 공부해보고 정리를 진행해보았습니다. 각 앱마다 저장 공간이 샌드박스 형식으로 제공되고 사용하는 파일은 해당 공간에서 다룰 수 있게 됨으로써, 앱 별 사용하고 있는 파일 관리부터 시작해서 보안적인 측면까지 매우 좋은 변화가 아닌가 생각됩니다.
하지만, 현재 안드로이드를 쓰고 있는 이유 중 하나가 PC 환경과 큰 차이 없는 파일 관리할 수 있다는 점인데.. 아무래도 구조적 변경이 불가피해 보이기 때문에 썩 달갑지만은 않은 것 같습니다. 더군다나 성능 저하가 있다는 지적사항이 있어서.. 아무래도 지금 그대로 정식 버전까지 반영된다면 여러모로 꽤 아쉬울 것 같습니다.
고로, 아직까지 정식 버전 출시 및 전반적으로 반영되는 데는 시간이 남아있으니.. 해당 기간 동안 성능 확보를 진행해서 보안이 상승되는 만큼 성능도 유지되는 두 마리 토끼를 한 번에 다 잡기를 바랍니다.
Google I/O 2019 에서 Android Q와 Scoped Storage 관련 세션도 있으니, 라이브로 보는 것도 좋을 것 같습니다.
https://developer.android.com/guide/topics/data
https://developer.android.com/guide/topics/data/data-storage
https://developer.android.com/preview/privacy/scoped-storage
https://developer.android.com/guide/topics/providers/document-provider
https://android-developers.googleblog.com/2019/04/android-q-scoped-storage-best-practices.html
https://developer.android.com/reference/android/provider/MediaStore
https://github.com/JustinTipton/SAFTraversal
https://github.com/tliebeck/saftest
arter97
Realignist
감사합니다 :)