Sandbox


샌드박스는 어린 아이를 보호하기 위해 샌드박스에서만 놀도록 하는데 유래한 보안 모델입니다.
iOS에서 앱 샌드박스는 커널 수준에서 앱의 데이터에 대한 접근을 제한하는 기술입니다.
앱 샌드박스가 있는 이유는? 앱이 손상되었을 때 사용자의 데이터나 시스템이 위험하지 않지 않도록 하는 역할을 합니다.
보안을 위해서 앱을 설치할 때 운영 체제는 자동으로 해당 앱에 대한 샌드박스를 만듭니다.

샌드박스가 없을 경우(왼쪽)에는 해당 앱에 보안 허점이 있을 때
공격자는 앱을 제어해서 시스템 리소스나 모든 데이터를 가지고 이것 저것 할 수 있겠죠
그래서 오른쪽과 같이 하나의 앱에 하나의 샌드박스를 만들어서
앱이 손상될 경우 시스템 및 사용자 데이터에 대한 손상을 방지하도록 설계되어 있습니다.
샌드박스 전략은 시스템이 앱에서 필요한 리소스에 대한 액세스 권한을 앱에 부여하는 것 입니다.
앱 샌드박스는 만병통치약이 아닙니다. 왜냐하면 샌드박스는 공격을 차단하는 기술이 아니라 공격을 받았을 때 발생하는 피해를 최소화할 수 있도록 도와주는 기술이기 때문이에요!
앱이 작업을 수행하는 데 필요한 최소한의 권한으로 제한되면 손상될 수 있는 범위가 줄어들게 됩니다.
App Sandbox는 앱별로 민감한 리소스에 대한 액세스를 제한함으로써
공격자가 앱의 보안 허점을 성공적으로 악용하는 경우 앱 샌드박스에 의해 허용된 영역만 접근할 수 있기 때문에 허용되지 않은 영역은 안전하게 보호할 수 있습니다.
다음과 같은 리소스를 앱 내에서 사용하려면
샌드박스가 적용된 앱은 자격을 사용하여 다음 리소스를 사용하려는 의도를 명시적으로 명시해야 합니다.
- Hardware (Camera, Microphone, USB, Printer)
- Network Connections (Inbound or Outbound)
- App Data (Calendar, Location, Contacts)
- User Files (Downloads, Pictures, Music, Movies, User Selected Files)
프로젝트에서 명시적으로 권한 요청을 정의하지 않는다면 요청되지 않은 리소스에 대한 액세스는 런타임 시 시스템에서 거부됩니다.
File System

iOS 앱은 위의 그림처럼 앱 하나당 전부 SandBox화 되어있습니다. 앱이 가지는 개인 사물함같은거에요!
그래서 앱은 샌드박스 디렉토리 내부에 있는 파일들과만 상호작용할 수 있도록 제한됩니다.
새 앱을 설치하게되면 설치 프로그램이 샌드박스 디렉토리 내에 앱에 대한 여러 컨테이너 디렉토리를 만들고, 만들어진 각 컨테이너 디렉토리에는 특정한 역할이 있습니다. 위의 그림이 앱의 컨테이너 디렉터리 구조를 나타내는데요.
번들 컨테이너 디렉터리
- 앱의 번들을 보유하고 앱과 모든 리소스가 포함되어 있습니다.
- Compile Source(.swift)가 바이너리 형태의 실행 파일로 변환
- 라이브러리는 프레임워크로 그룹화
- 스토리보드, Xib, strings 등이 변환
- 이 디렉토리엔 쓸 수 없음
- 앱 번들에 저장된 리소스에 대한 읽기 전용 액세스 권한을 얻을 수 있습니다.
데이터 컨테이너 디렉터리
- 앱과 사용자 모두에 대한 데이터를 보유합니다.
- 앱이 데이터를 정렬하고 구성하는 데 사용할 수 있는 여러 하위 디렉토리로 더 나뉩니다.
- Dcouments/
- 사용자가 생성한 데이터 저장, 사용자에게 노출되는 파일 저장
- 개발자가 Document, Library, tmp, System Data 외의 직접 디레토리나 파일을 추가할 수 없기에 Document의 서브 디렉토리를 통해 관리
- 이 디렉토리의 내용은 파일 공유를 통해 사용자가 사용할 수 있습니다. 따라서 이 디렉토리에는 사용자에게 노출하려는 파일만 포함되어야 합니다.
- 이 디렉토리의 내용은 iTunes 및 iCloud에 의해 백업됩니다.
- Realm은 기본적으로 Documents의 경로를 사용하는데, 노출이 되면 안되는 중요 정보는 Library의 Application Support 폴더로 경로를 변경
- Library/
- 사용자 데이터 파일이 아닌 모든 파일의 최상위 디렉토리입니다. 따라서 앱은 사용자 데이터 파일에 이러한 디렉터리를 사용해서는 안 됩니다.
- iOS 앱은 일반적으로 Application Support 및 Caches(앱의 스냅샷 등 저장) 하위 디렉토리를 사용합니다.
- 사용자에게 노출되고 싶지 않은 파일에는 라이브러리 하위 디렉토리를 사용합니다.
- 라이브러리 디렉토리의 내용(Caches 하위 디렉토리 제외)은 iTunes 및 iCloud에 의해 백업됩니다.
- tmp/
- 이 디렉토리를 사용하여 앱 실행 간에 지속할 필요가 없는 임시 파일을 작성합니다. 앱은 더 이상 필요하지 않은 파일을 이 디렉터리에서 제거해야 합니다.
- 시스템은 앱이 실행되고 있지 않을 때 이 디렉토리를 제거할 수 있습니다.
- 이 디렉토리의 내용은 iTunes 또는 iCloud에 의해 백업되지 않습니다.
- Dcouments/
iCloud 컨테이너
- 앱은 런타임 시 iCloud 컨테이너와 같은 추가 컨테이너 디렉토리에 대한 액세스를 요청할 수도 있습니다.
Code
override func viewDidLoad() {
super.viewDidLoad()
print(NSHomeDirectory()) //Prints SandBox data container path
}
시뮬레이터에서 앱의 SandBox 컨테이너 경로를 찾을 수 있습니다. 참고할 점은 실제 장치가 아니라 시뮬레이터에서만 된다는 점입니다!
실제 기기에서는 앱의 샌드박스의 위치가 이리저리 옮겨다닌다고 합니다.
위의 코드를 입력하면 앱의 샌드박스 경로를 출력할 수 있습니다.

위의 경로를 파인더에 복사붙여넣기 해서 이동해보면?!!


이렇게 확인할 수 있습니다.
출처
'IOS' 카테고리의 다른 글
SPM으로 설치한 Crashlytics에서 누락된 dsyms 업로드하기 (2) | 2021.12.18 |
---|---|
iOS | Authorization & Privacy, CoreLocation, 위치로 주소 변환하기 (0) | 2021.11.01 |
iOS ) Autolayout3 - Adaptive Layout, Size Class (0) | 2021.10.05 |
iOS ) AutoLayout2 - Content Hugging, Compression Resistance (0) | 2021.10.04 |
iOS ) AutoLayout1 - Frame-based Layout Autoresizing Mask (0) | 2021.10.02 |