[iOS] SandBox란 ?

·2024년 12월 2일
0

iOS-posting

목록 보기
1/3

UserDefaults?

itunes API간단하게 활용해서 SearchAPP을 만들어보는 과정에서 검색 기록을 저장하기 위한 솔루션으로 userDefaults라는 것에 대해서 알아보게 되었다.

  • 일반적으로 LocalStorage랑 비슷한 역할을 하는 것 같다. 간단한 정보 저장하고, 내가 삭제할 때 까지 삭제되지 않는것도 굉장히 비슷한 점으로 느껴졌다.
  • 이게 userDefaults는 Sandbox내의 Data Container에 저장된다고 하는데, 그럼 SANDBOX는 뭔지부터 알아보고자 했다.

SANDBOX란❓

공식사이트SANDBOX

IOS에서 앱이 독립적으로 실행되면서 다른앱이나 시스템에 영향을 주지않도록 격리된채로 실행되게 해주는 보안솔루션이라고 한다.

다른 블로그에서도 강조하던데, 이게 공격을 막는 방법이 아니라, 피해를 최소화하는 솔루션이라고 생각하시면 될 것 같다.

다시 한 번 정리하자면, 보안을 위해서 앱이 설치될 때마다 운영 체제에서 각각의 앱에 대한 SANDBOX를 생성하고, ios앱과 상호작용하는 건 SANDBOX내의 디렉토리로 제한한다.

Q : 샌드박스내 디렉토리에만 접근한다며! 그러면 내 사진첩에서 업로드하는 경우에는 내 사진첩에 접근하잖아, 여기는 샌드박스 내의 디렉토리가 아닐텐데?

A : 그럴때는 시스템 권한을 받고, 그 권한 범위 내에서 시스템 자원에 접근하게 되는 것이다. 어플을 사용할 때 아래 사진과 같은 권한설정이 시스템 권한을 여쭙는 것이다. 일반적으로 샌드박스 내로 제한되기 때문에, 접근하고자 할때는 사용자에게 권한을 묻는 것이다.

sandbox

대표적인 권한이 필요한것들 예시
USB, 카메라,마이크,인쇄,블루투스,주소록,위치정보,캘린더,파일 액세스

예시 사진처럼 줌과 인스타그램이 각각 다른 샌드박스라고 이해하시면 좀 더 쉽다. 줌vs인스타그램
각각 다른 sandbox를 독립되게 구성하고 있기 때문에 ZOOM에서 권한을 다 풀더라도, INSAGRAM에서는 새롭게 또 권한을 묻는 것이다.


SANDBOX 구조

sandbox

SANDBOX는 크게 3개의 덩어리로 볼 수 있다.
1. Bundle Container
2. Data Container
3. iCloud Container

번들 컨테이너 (Bundle Container)

앱의 실행파일, 리소스 등 포함
읽기 전용이며, 설치 시 암호화 서명됨 (변조나 무단 접근을 방지)
수정 시 앱 실행 불가하다.

번들 컨테이너를 수정하면 앱 서명이 깨지기 때문에 실행이 정상적으로 불가능할 것이다.(수정은 탈옥했을때 수정이 가능해지는 경우가 있다고 한다.)


데이터 컨테이너 (Data Container)

  • 런타임 중 생성된 데이터 저장(사용자 데이터나, 설정 파일 같은 동적으로 생성되는 것들)
    ex)사용자의 로그인정보, 앱설정, 캐시데이터 등...
    데이터 컨테이너는 번들컨테이너와는 다르게 조회/수정이 가능하지만, 앱에서 허용된 한에서만 조회나 수정이 가능하다 라고 이해하시면 될 것 같습니다. (디렉토리로서 사용자가 직접앱의 데이터 컨테이너를 조회하고 수정하는 것은 여전히 불가능하다)

주요 하위 디렉토리
1. Documents: 사용자 생성 문서 및 파일 콘텐츠 저장, iTunes와 iCloud 백업 가능
2. Library: 사용자 데이터가 아닌 파일 저장(앱의 설정 파일이나 캐시 데이터 등,,)
3. tmp: 임시 파일 저장, 앱 종료 시 삭제 권장



USERDEFAULT란❓

공식 사이트 정의

앱을 시작할 때마다 키-값 쌍을 지속적으로 저장하는 사용자 기본 데이터베이스에 대한 인터페이스입니다.
USERDEFAULTs

  • 앱에서 사용자의 기본설정이나 간단한 데이터를 저장, 앱이 꺼졌다 실행되어도 가져올 수 있음
    key-value 형태로 저장됨
    사용 예시 : 다크모드 여부, 알림설정 , 검색기록, 마지막으로 열었던 페이지 등..

사용예시 - 최근 검색기록 저장

private var RecentSearchLists: [String] {
        UserDefaults.standard.value(forKey: "recentSearchList") as? [String] ?? []
    }
    func registSearchLists(term: String) {
        var currentSearchLists = RecentSearchLists
        currentSearchLists.append(term)
        UserDefaults.standard.set(currentSearchLists, forKey: "recentSearchList")
    }

이런식으로 standard, 즉 기본설정을 의미한다고 보시면된다. 이전에 URLSession.shared를 썼던 것과 비슷한 개념으로 느껴졌다. 이것도 기본설정을 활용할 때 사용되었었던 것처럼 큰 변수가 없다면, standard를 사용해주면 되는 것 같다. 거기에 이제 set으로 key값과 함께 등록을 해주면 사용할 수가 있다. 불러올때는 value로 불러와서 활용해줄 수 있다.

Q: 그럼 userDefaults의 유효기한은 ?

  • 별도로 정해져 있지 않다. LocalStorage처럼 앱이 삭제되거나, 사용자가 직접 삭제하지 않는한 유지된다.

Q: 그럼 기한을 생성할때 별도로 정해줄 순 있나?

  • 유효기한이 별도로 정해져 있지 않아서, 직접 타이머나 날짜같은 데이터들을 활용해서 정리를 해줘야한다.

Q: 그럼 삭제 방법??

A : UserDefaults.standard.removeObject(forKey: "exampleKey")
해당 함수로 키 값을 주면 해당 데이터가 삭제 된다. 전체 삭제하는 방법은 반복문 돌려야하고, 키 안에서 몇개의 값만 삭제해주려면 그 값을 받은다음에, 내가 새롭게 초기화해서 이를 .set해주어서 덮어씌우는 방법이 있다.

// 기존에 저장된 데이터
let initialArray = ["apple", "banana", "cherry"]
UserDefaults.standard.set(initialArray, forKey: "exampleKey")
// 특정 값만 삭제 (banana삭제)
if var storedArray = UserDefaults.standard.array(forKey: "exampleKey") as? [String] {
    storedArray.removeAll { $0 == "banana" }
    UserDefaults.standard.set(storedArray, forKey: "exampleKey")
}

Q:그럼 용량은 어느정도 인거지? 막 저장해도 괜찮은건가??

userDefaults용량에 관한 토의1
userDefaults용량에 관한 토의2
확실하게 정해지진 않았지만, KB대에서 해결을 보는게 좋다고 한다! 이론상으로는 제한이 없고, 기기의 가용공간만큼도 저장은 할 수 있다고 하지만, 불가능하고, 1MB미만으로 해결보는 것이 좋다고 한다. 때문에 이미지 같은 것을 저장하고 싶다면은 UserDefaults에 이미지를 저장하는게 아니라, 클라우드 스토리지와 같은 형태로 저장하는것이 좋다고 하며, 대용량은 FileManager를 사용하라고 한다.

SANDBOX에 데이터 저장하는 방식엔 UserDefaults뿐만이 아니라, 사용목적에 따라Core Data, FileManager, Keychain 등 여러가지가 있는데 일단 오늘은 UserDefaults와 FileManager에 대해서만 간단히 다루고 다음 포스팅에서 이 4가지를 비교하면 좋을 것 같다.

FileManager예시

let data = Data("Large data".utf8)
let url = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("largeData.txt")
try? data.write(to: url)

주의사항

  • 적은 양의 데이터만 저장하자(환경설정, 간단한 사용자 정보(예: 테마 색상, 로그인 상태 등))등
  • 보안 데이터 저장 금지: 암호, 인증 토큰 같은 민감한 데이터는 Keychain을 사용해야 한다.
  • 대량 데이터 저장 방지: 대규모 데이터를 저장하려면 Core Data, FileManager 등을 사용하는게 권장된다.

FileManager❓

주요 기능

파일 쓰기

let data = "Hello, FileManager!".data(using: .utf8)!
try? data.write(to: fileURL)

파일 읽기

if let data = try? Data(contentsOf: fileURL),
   let content = String(data: data, encoding: .utf8) {
    print(content) // "Hello, FileManager!"
}

파일 삭제

try? FileManager.default.removeItem(at: fileURL)

폴더 생성

let folderURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("MyFolder")
try? FileManager.default.createDirectory(at: folderURL, withIntermediateDirectories: true)
특징UserDefaultsFileManager
저장 위치앱 샌드박스의 Library/Preferences 폴더 (자동 관리)앱 샌드박스의 다양한 폴더 (Documents, Caches 등)
저장 데이터간단한 키-값 쌍 데이터파일, 이미지, 대규모 JSON 등 복잡한 데이터
데이터 크기 제한약 1~2MB 정도 (작은 설정 데이터에 적합)크기 제한 없음 (디스크 공간 허용 범위 내에서 가능)
사용 목적환경설정, 작은 데이터 저장파일 저장, 읽기, 삭제, 복잡한 데이터 관리
보안앱 샌드박스 내 보관, 탈옥된 기기에서 접근 가능앱 샌드박스 내 보관, 디렉토리별 보안 설정 가능
데이터 영구성기본적으로 앱 삭제 시 함께 삭제폴더에 따라 데이터가 유지되거나 삭제될 수 있음

느낀점

새로운 운영체제, 구조, 언어 등 여러가지가 겹쳐서 모든게 좀 새로운 영역이라서 공부하는게 좀 오래걸리는 느낌인데, 나중에는 익숙해지겠지 싶다.

profile
기억보단 기록을

0개의 댓글