샌드박스는 커널 수준에서 애플리케이션의 데이터 접근을 제한하는 기술로,
각 애플리케이션이 독립된 환경에서 실행되도록 하여 보안을 강화하고 앱 간 상호작용을 제한하는 중요한 보안 모델입니다.
이를 통해 애플리케이션이 손상되더라도 사용자 데이터나 시스템에 위협이 되는 상황을 방지하는 역할을 합니다.
커널 레벨에서 앱의 데이터 접근을 제한하는 이유는?
커널 레벨에서 앱의 데이터 접근을 제한하는 이유
샌드박스가 굳이 커널 모드에서 동작해야 하는 이유는 여러 가지가 있지만, 가장 중요한 두 가지는 보안과 성능입니다.보안
커널은 시스템의 모든 리소스에 대한 최상위 권한을 가지고 있어, 애플리케이션의 동작을 가장 낮은 수준에서 제어할 수 있습니다.
커널 모드에서 동작하는 보안 메커니즘은 사용자 모드 애플리케이션에 의해 쉽게 우회될 수 없습니다. 이를 통해 악성 코드나 권한 상승 공격을 효과적으로 방지할 수 있습니다.
시스템 보호
커널은 CPU, 메모리, 파일 시스템 등 중요한 시스템 자원을 관리합니다. 커널 레벨에서 샌드박싱을 통해 애플리케이션이 이러한 자원에 직접 접근하는 것을 제한하여 시스템 보호를 강화할 수 있습니다.
성능
커널은 시스템 하드웨어와 리소스에 직접 접근할 수 있기 때문에, 보안 검사를 빠르고 효율적으로 수행할 수 있습니다.
사용자 모드에서 보안 검사를 수행할 경우, 커널 모드와의 컨텍스트 스위칭으로 인해 성능 오버헤드가 발생할 수 있습니다. 반면에 커널 모드에서 샌드박싱을 수행하면 이러한 오버헤드를 최소화할 수 있습니다.
각 앱은 자신만의 샌드박스에서 실행되며, 다른 앱의 샌드박스에 접근할 수 없습니다. 이를 통해 앱 간 데이터가 보호되고, 한 앱에서 문제가 발생하더라도 다른 앱에 영향을 미치지 않습니다. 이러한 방식은 프로세스 간 분리와 유사한 느낌을 줍니다.
앱은 자신에게 할당된 샌드박스 디렉토리에서만 파일을 읽고 쓸 수 있습니다. 외부 파일이나 다른 앱의 파일에 접근할 수 없으며, 각 앱의 샌드박스 디렉토리는 Document, Library, tmp 등의 디렉토리로 구성됩니다.
앱은 네트워크, 카메라, 마이크, 위치 서비스 등 특정 하드웨어 리소스에 접근하기 위해 사용자의 명시적인 허가가 필요합니다. iOS는 이를 통해 사용자의 개인정보와 기기 보안을 보호합니다.
iOS는 앱이 요청하는 권한을 사용자가 명확하게 인지할 수 있도록 하며, 사용자가 이를 직접 제어할 수 있게 합니다. 예를 들어, 위치 정보나 사진, 앨범 접근, 푸시 알림 등은 사용자의 명시적인 허가가 있어야만 사용 가능합니다.
샌드박스의 유래는 아이들이 안전하게 놀 수 있도록 만든 '모래 상자(sandbox)'에서 비롯되었습니다.
원래 샌드박스는 가정이나 놀이터에서 아이들이 모래놀이를 할 때 그 안에서만 놀도록 경계를 설정한 공간을 의미합니다.
이 개념이 소프트웨어 분야로 확장되면서, 프로그램이나 코드를 제한된 환경 내에서 실행하는 보안 기술을 설명하는 용어로 사용되기 시작했습니다.
소프트웨어 샌드박스는 프로그램이 독립된 환경에서 실행되어 시스템의 나머지 부분이나 다른 프로그램에 영향을 미치지 않도록 보호하는 방식입니다.
이 처럼 iOS의 모든 앱이 이 샌드박스 개념을 따르며, 앱 간의 상호작용을 제한하고 독립적으로 실행되고 다른 앱에 영향을 미치지 않도록 합니다.
모래 상자 안에서 아이들이 안전하게 놀 수 있는 것처럼, 프로그램도 제한된 환경 내에서만 작동하게 하여 위험을 최소화하는 개념과 유사합니다.
결론적으로, 샌드박스라는 용어는 물리적 보호 구역에서 비롯된 개념이 소프트웨어 보안 기술로 전이된 것입니다.
샌드박스를 사용하지 않는다면, 그림에서 설명한 것처럼 왼쪽의 샌드박스가 없는 앱은 시스템의 모든 리소스와 다른 사용자 데이터에 자유롭게 접근할 수 있습니다.
겉보기에는 앱의 자유도가 높아서 더 많은 기능을 구현할 수 있을 것 같지만, 사실 이러한 접근 권한이 너무 넓어지면 보안 문제를 야기할 수 있습니다.
위험한 앱이 사용자 데이터를 훔치거나, 시스템 자원을 남용하는 등 악용될 가능성이 높아집니다.
이런 이유로 iOS는 모든 앱이 제한된 공간(샌드박스)에서 실행되도록 설계했습니다.
앱 번들은 앱의 실행 가능 파일(AppName.app), 리소스 파일(이미지, 스토리보드, XIB 파일 등), 설정 파일(plist) 등을 포함하는 디렉토리입니다. 번들은 애플리케이션이 설치될 때 생성되며, 주로 애플리케이션의 정적 자원을 저장합니다. 번들 컨테이너는 읽기 전용입니다. 수정이 필요한 경우는 Data Container로 옮겨서 작업을 합니다.
데이터 영역은 애플리케이션이 동적으로 생성하고 수정하는 데이터를 저장하는 곳입니다. 이 영역은 여러 디렉토리로 나뉘며, 각 디렉토리는 특정 유형의 데이터를 저장하는 데 사용됩니다.
사용자가 직접 디텍토리를 추가할 수는 없으며 Document 같은 서브 디렉토리를 통해 관리할 수 있습니다.
DataContainer의 경로는 NSHomeDirectory()
로 확인할 수 있습니다.
FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
// Libray
FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask)
// Application Support
FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask)
// Cache
FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask)
Application Support
Library/Application Support
Preferences
Library/Preferences
Cache
Library/Caches
iCloud는 사용자가 여러 장치에서 데이터를 동기화하고 저장할 수 있도록 하는 클라우드 스토리지 서비스입니다. 애플리케이션은 iCloud를 통해 데이터를 저장하고, 사용자가 동일한 애플리케이션을 다른 iOS 장치에서 사용할 때 데이터를 동기화할 수 있습니다.
이번 포스팅에서는 샌드박스에 대해서 알아보았는데 앱이 독립적인 환경에서 실행되고 왜 독립적인 환경이 필요한지, 그리고 그렇지 않으면 어떻게 되는지에 대해서 명확하게 알게 되었습니다.
샌드박스라는 단어의 유래와 왜 샌드박스라는 단어를 선택했는지에 대해 이해하면서 기억에 잘 남았던 것 같습니다.
질문과 피드백은 언제나 환영합니다 🤗