Storage Access Framework: 개념, 작동 방식 및 Android에서의 파일 접근

저자: IT Sectr 게시일: 2026-07-10 읽는 시간: 6 분

Storage Access Framework는 시스템 선택 대화상자를 통해 파일과 문서에 안전하게 접근할 수 있는 Android 프레임워크입니다. 저장소 읽기에 대한 광범위한 권한을 요청하는 대신, 앱은 사용자가 선택한 파일의 URI 링크를 받습니다. Android Developers(2026)에 따르면 SAF는 DocumentProvider를 통해 로컬 저장소, 클라우드 서비스 Google Drive 및 Dropbox를 지원합니다. 이 프레임워크는 Android 4.4에서 도입되었으며 Android 10부터 문서 작업의 표준이 되었습니다.

핵심 요점

  • SAF는 광범위한 권한 없이 시스템 대화상자를 통해 파일을 선택하기 위한 Android 프레임워크입니다.
  • URI 링크는 직접 파일 경로를 대체합니다: 앱은 content URI를 통해 파일과 작동합니다.
  • Persistent permissions을 사용하면 앱 재시작 후에도 파일에 대한 접근을 유지할 수 있습니다.
  • DocumentProvider는 클라우드 및 사용자 정의 저장소에 대한 접근을 위해 SAF를 확장합니다.
  • Android 10은 앱 샌드박스 외부의 파일에 접근하기 위해 SAF를 필수로 만들었습니다.

Storage Access Framework란?

Storage Access Framework는 시스템 대화상자를 통해 문서를 선택하고 생성하기 위한 통합 인터페이스를 제공하는 Android SDK의 일부입니다. SAF는 파일의 물리적 위치를 추상화합니다: 앱은 파일이 로컬 디스크, Google Drive 또는 Dropbox 중 어디에서 읽히는지 알지 못합니다.

SAF 아키텍처는 세 가지 구성 요소로 이루어집니다: 요청을 시작하는 클라이언트 앱, 표준 파일 선택 대화상자인 시스템 선택기, 특정 저장소의 파일에 대한 접근을 구현하는 콘텐츠 제공자인 DocumentProvider입니다. 사용자는 데이터 소스에 관계없이 통합된 인터페이스를 봅니다.

SAF는 Android 4.4(API 19)부터 사용 가능합니다. 처음에는 문서만 지원했지만 Android 5.0에서 ACTION_OPEN_DOCUMENT_TREE를 통한 디렉토리 지원이 추가되었습니다. Android 10부터 SAF는 앱별 저장소 외부의 파일에 접근하는 권장 방법이 되었습니다.

SAF 작동 방식: 시스템 선택기와 URI

SAF는 ACTION_OPEN_DOCUMENT 작업으로 Intent를 통해 시스템 파일 선택 대화상자를 시작합니다. 사용자는 내부 저장소, Google Drive, Dropbox 및 기타 등록된 제공자의 목록을 봅니다. 파일을 선택한 후, 시스템은 임시 접근 권한이 있는 content URI를 반환합니다.

content URI 형식은 content://com.android.externalstorage.documents/document/primary/Download/file.pdf입니다. file:// URI와 달리 content URI는 실제 파일 경로를 노출하지 않으며 DocumentProvider를 통해 작동합니다. 앱은 얻은 URI를 사용하여 ContentResolver.openInputStream을 통해 파일을 읽습니다.

시스템 선택기는 MIME 유형별로 파일의 검색, 정렬 및 필터링을 자동으로 지원합니다. 개발자는 Intent.putExtra(Intent.EXTRA_MIME_TYPES, arrayOf("application/pdf", "image/*"))를 통해 필요한 유형을 지정하고, 선택기는 관련 파일만 표시합니다.

URI 접근 수명 주기

기본적으로 URI는 앱 재시작 또는 장치 재부팅까지 유효합니다. 장기 접근을 위해 앱은 takePersistableUriPermission을 요청합니다. 이렇게 하면 대화상자를 통해 다시 선택하지 않고도 이후 실행에서 파일을 읽을 수 있습니다.

ACTION_OPEN_DOCUMENT 및 ACTION_CREATE_DOCUMENT

SAF는 파일 작업을 위한 세 가지 주요 작업(열기, 생성, 폴더 트리 선택)을 제공합니다. ACTION_OPEN_DOCUMENT는 기존 파일을 선택하기 위해 시스템 선택기를 엽니다. ACTION_CREATE_DOCUMENT는 새 파일을 생성합니다. 사용자는 대화상자에 이름을 입력하고 앱은 쓰기용 URI를 받습니다.

ACTION_OPEN_DOCUMENT_TREE는 전체 디렉토리를 선택하고 그 안의 모든 파일에 대한 접근을 얻을 수 있습니다. 이는 파일 관리자, 백업 앱 및 동기화 도구에서 사용됩니다. 앱은 디렉토리 URI를 받고 DocumentFile을 통해 콘텐츠를 재귀적으로 열거할 수 있습니다.

작업목적플래그
ACTION_OPEN_DOCUMENT기존 파일 선택READ_FLAG
ACTION_CREATE_DOCUMENT새 파일 생성WRITE_FLAG
ACTION_OPEN_DOCUMENT_TREE디렉토리 선택READ + WRITE

각 작업에 대해 MIME 유형은 EXTRA_MIME_TYPES를 통해 지정됩니다. 여러 유형("application/pdf", "image/*", "text/plain")을 지정할 수 있습니다. 유형이 지정되지 않으면 선택기가 모든 파일을 표시합니다.

Persistent URI permissions

Persistent URI permissions은 현재 세션이 종료된 후에도 파일에 대한 접근을 유지할 수 있는 SAF 메커니즘입니다. 이 플래그가 없으면 URI는 앱 재시작까지만 유효합니다. 앱은 READ 및 WRITE 플래그와 함께 FLAG_GRANT_PERSISTABLE_URI_PERMISSION 플래그를 요청합니다.

권한을 저장하려면 ContentResolver.takePersistableUriPermission 메서드를 사용합니다. 시스템은 URI를 특별한 레지스트리에 저장하고 다음 앱 실행 시 접근을 복원합니다. 앱이 URI에 대한 영구 접근 권한이 있는지 확인하려면 ContentResolver.persistedUriPermissions을 사용합니다.

사용자는 설정 → 앱 → 권한을 통해 저장된 권한을 취소할 수 있습니다. 앱은 파일에 대한 접근이 예기치 않게 손실되는 시나리오를 처리해야 합니다. 작업을 시작하기 전에 ContentResolver.openInputStream을 통해 접근을 확인하고 SecurityException을 올바르게 처리하는 것이 좋습니다.

코드 예제: SAF를 통한 파일 선택

SAF는 표준 Intent를 통해 시작됩니다. 코드는 최소화되어 있습니다: ACTION_OPEN_DOCUMENT로 Intent를 생성하고, MIME 유형을 지정하고, ActivityResultContracts.StartActivityForResult를 통해 시작합니다. 파일 선택 후, callback은 data.data에서 URI를 받고 이를 읽기에 사용합니다.

kotlin
val pickFile = registerForActivityResult(
    ActivityResultContracts.StartActivityForResult()
) { result ->
    result.data?.data?.let { uri ->
        val inputStream = contentResolver?.openInputStream(uri)
        // read from inputStream
    }
}

val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
    addCategory(Intent.CATEGORY_OPENABLE)
    setType("application/pdf")
    putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
}
pickFile.launch(intent)

ACTION_CREATE_DOCUMENT를 통한 파일 생성

새 파일을 쓰려면 ACTION_CREATE_DOCUMENT를 사용하세요. Intent는 MIME 유형과 EXTRA_TITLE을 통한 파일 이름을 받습니다. 폴더를 선택하고 확인한 후, 사용자는 URI를 반환하고 앱은 ContentResolver.openOutputStream을 통해 데이터를 씁니다. 시스템은 선택한 위치에 자동으로 파일을 생성합니다.

SAF 대 READ_EXTERNAL_STORAGE

SAF는 기존의 READ_EXTERNAL_STORAGE와 보안에 대한 근본적으로 다른 접근 방식에서 차이가 있습니다. 한 번에 전체 저장소에 대한 접근을 요청하는 대신 SAF는 특정 파일에만 접근을 요청합니다. 이는 공격 표면을 최소화하고 사용자 신뢰를 높입니다.

READ_EXTERNAL_STORAGE는 다른 앱의 사진과 문서를 포함하여 장치의 모든 파일에 대한 접근을 허용합니다. Android 10+에서는 이 접근 방식이 제한됩니다. 반면 SAF는 사용자가 선택한 파일에만 접근을 제공하며 각 파일에 대해 명시적 확인이 필요합니다. 배치 미디어 작업에는 MediaStore를, 개별 문서에는 SAF를 사용하세요.

SAF의 주요 단점은 각 파일을 개별적으로 선택해야 한다는 것입니다. 대량 작업(백업, 폴더 동기화)의 경우 ACTION_OPEN_DOCUMENT_TREE를 사용하여 선택한 디렉토리의 모든 파일에 대한 접근을 얻을 수 있습니다. 솔루션은 시나리오에 따라 다릅니다: SAF는 사용자 선택에 최적이고, MediaStore는 프로그래밍 방식 미디어 접근에 최적입니다.

자주 묻는 질문

Android에서 Storage Access Framework란?

Storage Access Framework는 시스템 선택 대화상자를 통해 안전한 파일 접근을 제공하는 Android 프레임워크입니다. 앱은 저장소 읽기에 대한 광범위한 권한을 요청하지 않고 선택된 파일의 content URI를 받습니다.

SAF를 통해 파일을 여는 방법은?

ACTION_OPEN_DOCUMENT로 Intent를 생성하고 setType을 통해 MIME 유형을 지정한 후 ActivityResultContracts를 통해 시작합니다. 콜백에서 data.data에서 URI를 얻고 ContentResolver.openInputStream을 통해 읽습니다.

Persistent URI permissions이란?

Persistent URI permissions은 앱 재시작 후에도 URI에 대한 접근을 유지하는 메커니즘입니다. FLAG_GRANT_PERSISTABLE_URI_PERMISSION 플래그와 takePersistableUriPermission 메서드를 통해 요청됩니다.

SAF는 어떤 MIME 유형을 지원하나요?

SAF는 모든 MIME 유형(application/pdf, image/*, text/plain, application/zip 등)을 지원합니다. 유형은 EXTRA_MIME_TYPES 배열과 함께 Intent.putExtra를 통해 지정됩니다.

SAF와 MediaStore의 차이점은?

SAF는 사용자가 시스템 대화상자를 통해 개별 파일을 선택하도록 설계되었습니다. MediaStore는 사용자 개입 없이 미디어 데이터베이스를 통해 장치의 모든 미디어 파일에 대한 프로그래밍 방식 접근을 제공합니다.

요약

  • Storage Access Framework는 광범위한 권한 없이 시스템 선택기를 통해 안전한 파일 접근을 제공하는 Android 프레임워크입니다.
  • Content URI는 파일 경로를 대체합니다: 앱은 직접 file:// 링크가 아닌 DocumentProvider를 통해 파일과 작동합니다.
  • ACTION_OPEN_DOCUMENT는 기존 파일을 열고, ACTION_CREATE_DOCUMENT는 새 파일을 생성하며, ACTION_OPEN_DOCUMENT_TREE는 폴더를 선택합니다.
  • Persistent permissions은 takePersistableUriPermission을 통해 앱 재시작 후 URI에 대한 접근을 유지합니다.
  • Android 10은 앱별 저장소 외부의 파일 접근에 SAF를 필수로 만들고 READ_EXTERNAL_STORAGE를 제한했습니다.
  • DocumentProvider는 클라우드 및 사용자 정의 저장소와의 통합을 위해 SAF를 확장합니다.
  • 선택은 시나리오에 따라 다릅니다: SAF는 사용자 선택용, MediaStore는 프로그래밍 방식 미디어 접근용입니다.

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기