Sandbox는 파일 시스템, 네트워크, 하드웨어 리소스 및 다른 앱의 데이터에 대한 접근을 제한하는 iOS 앱용 격리된 실행 환경입니다. 각 앱은 설치 시 자체 Sandbox 환경을 받으며, 모든 파일 작업은 자동으로 이 격리 영역으로 리디렉션됩니다. Apple App Sandbox Design Guide (2026)에 따르면 샌드박스 아키텍처는 세 가지 보호 수준을 기반으로 합니다. 파일 시스템 격리, 프로세스 간 통신 제어, 그리고 entitlements를 통한 명시적 권한 요청과 함께하는 하드웨어 리소스 분리입니다.
핵심 요점
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) 오류 코드와 시스템 로그 기록으로 끝납니다.
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 | 읽기 및 쓰기 |
| Bundle | Bundle.main.bundlePath | 읽기 전용 |
| Library | .libraryDirectory | 읽기 및 쓰기 |
| tmp | NSTemporaryDirectory() | 읽기 및 쓰기 |
| 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 Bookmark는 앱 실행 사이에 Sandbox 외부 파일에 대한 접근을 유지할 수 있는 iOS 메커니즘입니다. 사용자가 UIDocumentPicker를 통해 파일을 선택하면 앱은 Security-Scoped URL에서 북마크를 만들고 UserDefaults 또는 다른 저장소에 저장할 수 있습니다.
다음 실행 시 앱은 Security-Scoped URL을 반환하는 URLByResolvingBookmarkData를 통해 접근을 복원합니다. 그런 다음 파일을 읽기 전에 startAccessingSecurityScopedResource를 호출하고 작업을 마친 후 stopAccessingSecurityScopedResource를 호출해야 합니다. 호출 균형은 필수입니다 — 각 start에는 해당하는 stop이 있어야 하며, 그렇지 않으면 시스템이 Security-Scoped 리소스 한도를 소진합니다.
// 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 데이터가 포함되어 있습니다. 앱 인증서가 만료되거나 변경되면 북마크는 유효하지 않게 됩니다.
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의 Sandbox는 개발 중에 고려해야 하는 여러 엄격한 제한을 부과합니다. 주요 제한: 동적 코드 금지(Sandbox 외부에서 코드 로드 및 실행), 사용자 허가 없이 주소록, 캘린더, 사진에 대한 직접 접근 금지(Privacy framework), 자식 프로세스 생성 제한(fork와 exec는 금지).
네트워크: 앱은 TCP/UDP를 통해 모든 원격 서버에 연결할 수 있지만 localhost에 대한 접근은 제한됩니다 — 다른 앱은 앱 내부의 서버에 연결할 수 없습니다(디버그 빌드 제외). App Store 앱의 경우 멀티캐스트와 브로드캐스트 UDP도 차단됩니다.
하드웨어 리소스: 카메라, 마이크, 위치 정보, Bluetooth, HealthKit에 대한 접근은 시스템 대화 상자를 통한 사용자의 명시적 허가가 필요합니다. iOS는 각 리소스 유형에 대해 별도의 entitlement와 이유 설명이 있는 Info.plist 키(NSPhotoLibraryUsageDescription, NSCameraUsageDescription)를 사용합니다. Info.plist에 이유 설명 없이 권한을 요청하면 앱이 종료됩니다.
자주 묻는 질문
Sandbox는 파일 시스템, 네트워크, 다른 앱의 데이터에 대한 접근을 제한하는 iOS 앱용 격리된 실행 환경입니다. 각 앱은 고유한 Sandbox 컨테이너를 가지며, 접근은 Sandbox.kext를 통해 iOS 커널 수준에서 제어됩니다.
앱에서 사용 가능한 것: Documents(사용자 데이터), Library(Caches, Preferences, Application Support), tmp(임시 파일), Bundle(읽기 전용). App Group 디렉터리는 같은 개발자 그룹의 앱에서 사용할 수 있습니다.
UIDocumentPickerViewController를 통해 — 사용자가 시스템 인터페이스에서 파일을 선택합니다. iOS는 stopAccessingSecurityScopedResource가 호출될 때까지 유효한 Security-Scoped URL을 제공합니다. 대안은 앱 간에 데이터를 전송하는 Share Extension입니다.
Security-Scoped Bookmark는 앱 실행 사이에 Sandbox 외부 파일에 대한 접근을 유지하는 Data입니다. bookmarkData를 통해 Security-Scoped URL(UIDocumentPicker에서 얻은)로 생성됩니다. 다음 실행 시 북마크는 URLByResolvingBookmarkData를 통해 복원됩니다.
아니요, App Store 앱의 경우 Sandbox를 비활성화할 수 없습니다. 탈옥(jailbreak)된 기기에서는 비활성화가 가능하지만 App Store 출시와는 호환되지 않습니다. 개발자는 시뮬레이터에서 Sandbox 없이 테스트할 수 있지만 실제 기기에는 항상 Sandbox가 적용됩니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.