Sandbox — 정의, 격리 원리와 파일 시스템

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

Sandbox는 파일 시스템, 네트워크, 하드웨어 리소스 및 다른 앱의 데이터에 대한 접근을 제한하는 iOS 앱용 격리된 실행 환경입니다. 각 앱은 설치 시 자체 Sandbox 환경을 받으며, 모든 파일 작업은 자동으로 이 격리 영역으로 리디렉션됩니다. Apple App Sandbox Design Guide (2026)에 따르면 샌드박스 아키텍처는 세 가지 보호 수준을 기반으로 합니다. 파일 시스템 격리, 프로세스 간 통신 제어, 그리고 entitlements를 통한 명시적 권한 요청과 함께하는 하드웨어 리소스 분리입니다.

핵심 요점

  • Sandbox — 각 iOS 앱에 고유한 격리된 파일 시스템과 실행 환경.
  • 각 앱에는 Documents, Library, tmp, Bundle 하위 폴더가 있는 자체 Sandbox 디렉터리가 있습니다.
  • 다른 앱에 대한 접근은 금지됩니다. Sandbox 외부에서의 읽기, 쓰기, 코드 실행은 시스템에 의해 차단됩니다.
  • Entitlements 및 Capabilities는 Sandbox를 확장합니다. App Groups, iCloud, Security-Scoped Bookmarks에는 명시적 허가가 필요합니다.
  • UIDocumentPicker와 Share Extension — 격리된 앱 간에 파일을 교환하는 유일한 방법.

Sandbox란 무엇인가

Sandbox는 iOS 커널 수준(XNU — Sandbox.kext 커널 확장)에서 구현된 강제 접근 제어(Mandatory Access Control) 시스템입니다. 각 앱은 실행 시 고유한 UUID Sandbox 프로필을 받으며, 이 프로필이 앱이 접근할 수 있는 리소스를 결정합니다.

Sandbox 아키텍처에는 세 가지 핵심 구성 요소가 있습니다. File System Isolation(각 앱은 자신의 컨테이너만 볼 수 있음), Network Access Control(로컬 네트워크 요청이 제한될 수 있음), Inter-Process Communication(다른 앱과의 직접 IPC 금지)입니다. Apple은 iOS 2.0에서 Sandbox를 도입했으며 그 이후 모든 주요 버전에서 제한을 크게 강화했습니다.

Sandbox는 선택 사항이 아닙니다 — App Store의 모든 앱은 샌드박스에서 실행됩니다. 개발자는 Sandbox를 비활성화하거나 제한을 우회할 수 없습니다. 금지된 리소스에 접근하려는 시도는 EPERM(Operation not permitted) 오류 코드와 시스템 로그 기록으로 끝납니다.

swift
import Foundation

// 다른 앱의 파일에 접근 시도 — nil 반환
let otherAppPath = "/var/mobile/Containers/Data/Application/OTHER-UUID/Documents/file.txt"
let data = try? Data(contentsOf: URL(fileURLWithPath: otherAppPath))
// data == nil — Sandbox가 접근을 차단

// 올바른 접근 — 자신의 Sandbox 내
let fileManager = FileManager.default
guard let documentsURL = fileManager.urls(
    for: .documentDirectory,
    in: .userDomainMask
).first else { return }

let myFileURL = documentsURL.appendingPathComponent("notes.txt")
try "Hello, Sandbox!".write(to: myFileURL, atomically: true, encoding: .utf8)

앱 샌드박스의 구조

iOS의 각 앱 Sandbox에는 Foundation API를 통해 접근할 수 있는 여러 사전 정의된 디렉터리가 있습니다. 물리적 매체의 위치는 /var/mobile/Containers/Data/Application/{UUID}/이며, 개발자는 이 경로를 직접 사용해서는 안 됩니다. iOS 버전에 따라 기기를 재시작할 때마다 변경되기 때문입니다.

Sandbox의 주요 디렉터리: Bundle(.app — 읽기 전용, 실행 코드와 리소스 포함), Documents(사용자 데이터, iCloud에 백업됨), Library(Caches, Preferences, Application Support — 백업 규칙이 다름), tmp(임시 파일, 공간이 부족하면 시스템이 삭제). 각 디렉터리에는 고유한 수명 주기와 저장 정책이 있습니다.

Sandbox의 물리적 경로는 NSHomeDirectory() 또는 FileManager.url(for: .documentDirectory)를 통해 얻을 수 있습니다. Apple은 URL 기반 API 사용을 권장합니다. 파일 시스템의 내부 구조를 추상화하고 데스크톱의 macOS Sandbox 변경 시에도 안정적으로 유지되기 때문입니다.

Sandbox 디렉터리FileManager를 통한 접근권한
Documents.documentDirectory읽기 및 쓰기
BundleBundle.main.bundlePath읽기 전용
Library.libraryDirectory읽기 및 쓰기
tmpNSTemporaryDirectory()읽기 및 쓰기
App Group.containerURL(forSecurityApplicationGroupIdentifier:)읽기 및 쓰기

샌드박스 외부 파일에 대한 접근

iOS에서 다른 앱의 파일 시스템에 대한 직접 접근은 완전히 차단되어 있습니다. 개발자가 다른 앱의 컨테이너 UUID를 알고 있더라도 커널 수준의 Sandbox는 읽기나 쓰기 시도 시 오류를 반환합니다. 이것은 Sandbox가 더 유연한 macOS와의 근본적인 차이점입니다.

Apple은 앱 간 데이터 교환을 위한 세 가지 합법적인 메커니즘을 제공합니다. UIDocumentPickerViewController(사용자가 시스템 인터페이스에서 파일을 선택하고 앱이 Security-Scoped URL을 받음), Share Extension(다른 앱에 데이터를 전달하는 확장), App Groups(같은 개발자의 앱을 위한 공유 디렉터리)입니다.

UIDocumentPicker는 사전 설정 없이 다른 앱의 파일에 접근할 수 있는 유일한 방법입니다. 사용자는 표준 시스템 선택기를 통해 명시적으로 파일을 선택하고, iOS는 앱에 임시 Security-Scoped URL을 제공합니다. 접근은 선택기가 닫힐 때까지 또는 stopAccessingSecurityScopedResource가 호출될 때까지 유지됩니다.

Security-Scoped Bookmarks

Security-Scoped Bookmark는 앱 실행 사이에 Sandbox 외부 파일에 대한 접근을 유지할 수 있는 iOS 메커니즘입니다. 사용자가 UIDocumentPicker를 통해 파일을 선택하면 앱은 Security-Scoped URL에서 북마크를 만들고 UserDefaults 또는 다른 저장소에 저장할 수 있습니다.

다음 실행 시 앱은 Security-Scoped URL을 반환하는 URLByResolvingBookmarkData를 통해 접근을 복원합니다. 그런 다음 파일을 읽기 전에 startAccessingSecurityScopedResource를 호출하고 작업을 마친 후 stopAccessingSecurityScopedResource를 호출해야 합니다. 호출 균형은 필수입니다 — 각 start에는 해당하는 stop이 있어야 하며, 그렇지 않으면 시스템이 Security-Scoped 리소스 한도를 소진합니다.

swift
// Security-Scoped Bookmark 생성
func createBookmark(for url: URL) -> Data? {
    return try? url.bookmarkData(
        options: .minimalBookmark,
        includingResourceValuesForKeys: nil,
        relativeTo: nil
    )
}

// 북마크 데이터를 URL로 확인
func resolveBookmark(data: Data) -> URL? {
    var isStale = false
    let url = try? URL.byResolvingBookmarkData(
        data,
        options: .withoutUI,
        relativeTo: nil,
        bookmarkDataIsStale: &isStale
    )
    
    if isStale {
        // 북마크가 오래됨, 새로 만들어야 함
    }
    
    return url
}

중요한 제한: Security-Scoped Bookmarks는 자신의 Sandbox 내부 파일에는 작동하지 않습니다 — UIDocumentPicker 또는 iCloud Drive를 통해 얻은 파일에만 적용됩니다. 북마크에는 시스템이 어떤 앱이 어떤 파일에 대한 접근을 요청하는지 식별할 수 있는 Security-Scoped 데이터가 포함되어 있습니다. 앱 인증서가 만료되거나 변경되면 북마크는 유효하지 않게 됩니다.

Sandbox와 App Groups

App Groups는 같은 개발자의 여러 앱(및 그 확장)이 공통 Sandbox 디렉터리를 공유할 수 있게 하는 iOS 메커니즘입니다. 활성화하려면 Xcode에서 App Groups Capability를 추가하고 모든 대상 앱에 동일한 그룹 식별자를 지정해야 합니다.

공유 App Groups 디렉터리는 각 개별 앱의 Sandbox 외부에 있지만, 그룹의 모든 앱은 이 디렉터리에 대한 전체 읽기 및 쓰기 접근을 갖습니다. 이를 통해 메인 앱, Today Widget, Watch Extension, Share Extension 간에 파일, 데이터베이스(App Group 내 Store URL을 사용하는 Core Data), UserDefaults(initWithSuiteName을 통해)를 교환할 수 있습니다.

Apple은 앱과 확장 간 상태 동기화에 App Groups를 사용할 것을 권장합니다. 예를 들어 Today Widget은 메인 앱이 최신 데이터를 기록하는 공유 App Groups 디렉터리에서 데이터를 읽을 수 있습니다. 동시에 각 앱은 여전히 다른 App Groups로부터 격리됩니다 — 동일한 그룹 식별자를 가진 앱만 접근할 수 있습니다.

iOS에서 샌드박스의 제한

iOS의 Sandbox는 개발 중에 고려해야 하는 여러 엄격한 제한을 부과합니다. 주요 제한: 동적 코드 금지(Sandbox 외부에서 코드 로드 및 실행), 사용자 허가 없이 주소록, 캘린더, 사진에 대한 직접 접근 금지(Privacy framework), 자식 프로세스 생성 제한(fork와 exec는 금지).

네트워크: 앱은 TCP/UDP를 통해 모든 원격 서버에 연결할 수 있지만 localhost에 대한 접근은 제한됩니다 — 다른 앱은 앱 내부의 서버에 연결할 수 없습니다(디버그 빌드 제외). App Store 앱의 경우 멀티캐스트와 브로드캐스트 UDP도 차단됩니다.

하드웨어 리소스: 카메라, 마이크, 위치 정보, Bluetooth, HealthKit에 대한 접근은 시스템 대화 상자를 통한 사용자의 명시적 허가가 필요합니다. iOS는 각 리소스 유형에 대해 별도의 entitlement와 이유 설명이 있는 Info.plist 키(NSPhotoLibraryUsageDescription, NSCameraUsageDescription)를 사용합니다. Info.plist에 이유 설명 없이 권한을 요청하면 앱이 종료됩니다.

  • 동적 코드 — 금지: WebView의 JS에는 JavaScriptCore, 그러나 임의의 기계어 코드는 불가
  • 자식 프로세스 — fork, exec, system은 Sandbox에서 사용할 수 없음
  • 기기 접근 — 카메라, 마이크, GPS에는 시스템 대화 상자 필요
  • 로컬 네트워크 — App Store의 경우 멀티캐스트와 브로드캐스트 UDP 차단
  • 암호화 키 — Keychain은 사용할 수 있지만 자신의 앱에만 해당(App Group에는 kSecAttrAccessGroup)

자주 묻는 질문

iOS에서 Sandbox란 무엇인가요?

Sandbox는 파일 시스템, 네트워크, 다른 앱의 데이터에 대한 접근을 제한하는 iOS 앱용 격리된 실행 환경입니다. 각 앱은 고유한 Sandbox 컨테이너를 가지며, 접근은 Sandbox.kext를 통해 iOS 커널 수준에서 제어됩니다.

앱 Sandbox에서 어떤 파일을 사용할 수 있나요?

앱에서 사용 가능한 것: Documents(사용자 데이터), Library(Caches, Preferences, Application Support), tmp(임시 파일), Bundle(읽기 전용). App Group 디렉터리는 같은 개발자 그룹의 앱에서 사용할 수 있습니다.

다른 앱의 파일에 어떻게 접근할 수 있나요?

UIDocumentPickerViewController를 통해 — 사용자가 시스템 인터페이스에서 파일을 선택합니다. iOS는 stopAccessingSecurityScopedResource가 호출될 때까지 유효한 Security-Scoped URL을 제공합니다. 대안은 앱 간에 데이터를 전송하는 Share Extension입니다.

Security-Scoped Bookmark란 무엇인가요?

Security-Scoped Bookmark는 앱 실행 사이에 Sandbox 외부 파일에 대한 접근을 유지하는 Data입니다. bookmarkData를 통해 Security-Scoped URL(UIDocumentPicker에서 얻은)로 생성됩니다. 다음 실행 시 북마크는 URLByResolvingBookmarkData를 통해 복원됩니다.

iOS에서 Sandbox를 비활성화할 수 있나요?

아니요, App Store 앱의 경우 Sandbox를 비활성화할 수 없습니다. 탈옥(jailbreak)된 기기에서는 비활성화가 가능하지만 App Store 출시와는 호환되지 않습니다. 개발자는 시뮬레이터에서 Sandbox 없이 테스트할 수 있지만 실제 기기에는 항상 Sandbox가 적용됩니다.

요약

  • Sandbox — Mandatory Access Control로 각 앱을 커널 수준에서 격리하는 iOS의 기본 보안 시스템.
  • Sandbox 구조에는 접근 권한과 백업 정책이 서로 다른 Documents, Library, tmp, Bundle 디렉터리가 포함됩니다.
  • 직접 접근은 다른 앱의 파일 시스템에 완전히 차단 — 합법적인 것은 UIDocumentPicker와 App Groups뿐입니다.
  • Security-Scoped Bookmarks는 시스템 인터페이스를 통해 얻은 Sandbox 외부 파일에 대한 지속적인 접근을 제공합니다.
  • App Groups는 한 개발자의 앱 및 확장 집합을 위한 공유 Sandbox 공간을 만듭니다.
  • Sandbox 제한에는 동적 코드, 자식 프로세스, 멀티캐스트 네트워크 금지와 하드웨어 리소스를 위한 필수 시스템 대화 상자가 포함됩니다.
  • 모든 App Store 앱은 Sandbox에서 실행됩니다 — 이는 선택 사항이 아닌 iOS의 필수 아키텍처 기능입니다.

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

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

프로젝트 논의

더 읽어보기