[SwiftBeam #15] "안드로이드의 까다로운 권한" - Scoped Storage와 미디어 접근 완벽 대응

2026. 6. 27. 20:47AI Product Building/SwiftBeam

반응형
SwiftBeam Series #15

안드로이드 권한의 늪
완벽하게 탈출하기

Scoped Storage와 미디어 접근 대응기

🤖 📂 🛡️ 🔑

안드로이드 개발자들에게 '저장소 권한'은 가장 골치 아픈 주제 중 하나입니다. 버전이 올라갈 때마다 구글의 보안 정책은 더욱 깐깐해졌고, 특히 안드로이드 10부터 도입된 'Scoped Storage(범위 지정 저장소)'는 파일 전송 앱인 SwiftBeam에게 거대한 기술적 도전이었습니다. 사용자의 파일을 읽고 쓰는 아주 기본적인 동작조차 OS 버전에 따라 다르게 대응해야 했기 때문이죠. 오늘은 안드로이드라는 복잡한 생태계에서 어떻게 안정적으로 파일 권한을 확보했는지 공유합니다.

1. 내 집인데 마음대로 못 들어간다고?

과거의 안드로이드는 READ_EXTERNAL_STORAGE 권한 하나면 모든 파일에 접근할 수 있었습니다. 하지만 보안이 강화되면서, 이제 앱은 자신에게 허용된 공간이나 사용자가 명시적으로 선택한 파일에만 접근할 수 있게 되었습니다.

SwiftBeam 같은 앱에게는 치명적이었습니다. 사용자가 전송하고 싶은 파일은 사진첩에도 있고, 다운로드 폴더에도 있으며, 때로는 루트 디렉토리 근처에 있을 수도 있기 때문입니다. "왜 파일을 못 찾나요?"라는 유저의 불만을 해결하기 위해, 우리는 안드로이드의 파편화된 권한 체계를 하나하나 분석하며 '버전별 분기 처리'라는 정교한 지도를 그려야 했습니다.

2. "OS 버전이 몇이세요?" - 맞춤형 권한 요청

SwiftBeam은 앱 실행 시 사용자의 안드로이드 버전을 먼저 체크합니다. device_info_plus 패키지가 여기서 큰 역할을 하죠.

  • Android 9(API 28) 이하: 고전적인 방식대로 전체 저장소 접근 권한을 요청합니다. 가장 심플한 시절이었죠.
  • Android 10(API 29): Scoped Storage가 처음 도입되었습니다. requestLegacyExternalStorage="true" 옵션을 사용하여 과도기를 버텨냈습니다.
  • Android 11(API 30) 이상: 이제는 얄짤없습니다. 미디어 파일은 READ_MEDIA_IMAGES 같은 세분화된 권한을 사용하고, 문서 파일은 Storage Access Framework(SAF)나 특수한 경우 MANAGE_EXTERNAL_STORAGE 권한을 요청해야 합니다.

SwiftBeam은 permission_handler를 커스터마이징하여, 이 복잡한 분기 로직을 '권한 요청' 버튼 하나에 녹여냈습니다. 사용자는 복잡한 기술적 배경을 몰라도, 앱이 안내하는 대로 확인 버튼만 누르면 필요한 모든 준비가 끝나도록 설계했습니다.

3. 미디어는 빠르게, 파일은 정확하게

권한을 얻었다고 끝이 아닙니다. 실제 파일을 읽어오는 방식도 최적화가 필요했습니다.

사진이나 동영상 같은 미디어 파일은 안드로이드의 MediaStore API를 사용하여 빠르게 인덱싱합니다. 수천 장의 사진을 하나하나 폴더를 뒤져 찾는 대신, OS가 이미 정리해 둔 데이터베이스에서 '쿼리'를 던져 가져오는 방식입니다. 덕분에 SwiftBeam의 갤러리 탐색 속도는 네이티브 앱 못지않게 빠릅니다.

반면, 일반 문서나 아카이브 파일은 Storage Access Framework(SAF)를 적극 활용합니다. 사용자가 직접 폴더를 선택하게 함으로써 보안 가이드라인을 준수하는 동시에, 앱이 해당 폴더에 파일을 생성하거나 읽을 수 있는 영구적인 권한(Persistable URI Permission)을 획득하도록 구현했습니다.

4. "왜 권한이 필요한가요?" - 친절한 안내의 힘

아무리 기술적으로 완벽해도 사용자가 "거부"를 누르면 무용지물입니다. SwiftBeam은 시스템 팝업이 뜨기 전, 'Pre-permission Dialog'를 띄웁니다.

"파일을 전송받아 저장하기 위해서는 저장소 쓰기 권한이 필요합니다. SwiftBeam은 전송 목적 이외에 사용자의 개인 파일을 열람하지 않습니다."

이런 짧은 안내 문구 하나가 사용자의 신뢰도를 높이고 권한 승인율을 30% 이상 향상시킨다는 데이터가 있습니다. 우리는 기술뿐만 아니라 '사람의 마음'을 얻는 로직도 함께 코딩했습니다.

5. 안드로이드를 넘어, 다시 사과(Apple)의 세계로

안드로이드의 거친 파도를 넘었습니다. 하지만 우리에게는 또 하나의 거대한 산이 남아있습니다. 바로 안드로이드보다 훨씬 더 폐쇄적이고 철저한 보안을 자랑하는 'iOS'입니다.

다음 편에서는 iOS의 샌드박스 시스템 안에서 어떻게 파일을 꺼내오고, 또 에어드랍 못지않은 사용성을 확보했는지 'iOS 샌드박스와 파일 접근 기술'에 대해 이야기해 보겠습니다.

다음 편 예고: [SwiftBeam #16] "iOS의 폐쇄성 극복하기" - 샌드박스 안에서 파일 꺼내기

복잡한 안드로이드 권한 체계까지 완벽하게 컨트롤하는 Team M2Y의 기술력!
사용자를 먼저 생각하는 저희의 철학이 담긴 다른 앱들도 만나보세요.

Team M2Y 혁신 제품군 둘러보기 →
TAGS: 안드로이드개발, ScopedStorage, 권한관리, Android11, Flutter, 플러터, SwiftBeam, 미디어스토어, SAF, 앱개발, 기술블로그, 개발일지
반응형