씬디의 블로그

UserDefaults는 샌드박스 내부에, KeyChain은 외부에 저장된다? 본문

App/Swift

UserDefaults는 샌드박스 내부에, KeyChain은 외부에 저장된다?

cyndi 2024. 7. 17. 22:23

UserDefaults와 KeyChain: iOS 데이터 저장소의 선택과 보안

앱 개발을 하면서 사용자 정보를 UserDefaults에 저장하는 경우가 많았다

UserDefaults는 앱 설정이나 간단한 사용자 기본 값을 저장하는데 편리하다

하지만 프로젝트를 진행하면서, 토큰같은 민감한 데이터를 저장하는 데는 보안상 한계가 있음을 알게 되었고

KeyChain을 사용하는 것이 더 적절하다는 것을 깨달았다

 

샌드박스란 무엇?

샌드박스란, 어린 아이들이 안전하게 놀 수 있도록 보호하는 '모래 놀이터'에서 유래한 개념으로

보안을 위해 앱의 데이터 접근을 제한하는 모델이다

iOS에서 샌드박스는 커널 수준에서 앱의 데이터와 자원을 다른 앱으로부터 격리하여 보호한다

 

이로 인해 악의적인 앱이 사용자의 데이터를 무단으로 읽거나 수정할 수 없게 된다

앱이 설치될 때, 운영체제는 자동으로 그 앱에 대한 샌드박스를 생성하여 데이터를 보호한다

 

UserDefaulst: 샌드박스 내부 저장소

USerDefaults는 앱의 설정, 사용자 기본값, 앱에서 사용하는 간단한 데이터를 저장하는데 사용된다

예를 들어, 앱의 테마 설정, 마지막으로 열었던 페이지, 사용자 이름 등이 여기에 저장된다

 

UserDefaults에 저장된 데이터는 앱의 샌드박스 내부에 위치한 파일에 저장된다

이 데이터는 해당 앱만 접근할 수 있으며, 다른 앱은 이 데이터를 볼 수 없다

샌드박스 내에 저장되기 때문에 어느 정도의 보안이 제공되지만,

암호화된 형태로 저장되는 것은 아니므로 민감한 정보를 저장하기에는 부적합하다

 

KeyChain: 샌드박스 외부 저장

반면, KeyChain은 비밀번호, 인증 토큰, 신용카드 정보와 같은 암호화된 민감한 정보를 저장하는 데 사용된다

KeyChain에 저장된 데이터는 앱의 샌드박스 외부에 위치하며, 운영체제 차원에서 보호된다

 

KeyChain은 운영체제가 관리하는 보안 엔클레이브(Secure Enclave)라는

특수한 보안 저장소나 파일 기반 암호화 시스템에 데이터를 저장한다

Secure Enclave는 애플 기기에서 암호화 키 관리, 생체 인증(지문, 얼굴 인식) 등을 처리하며,

KeyChain의 데이터 보호에 중요한 역할을 한다

 

왜 샌드박스 외부에 저장되지?

앱 샌드박스는 앱을 격리하여 다른 앱이 데이터에 접근하지 못하게 설계되었다

그러나 샌드박스 내부에 저장된 데이터는 암호화되지 않은 경우가 많아,

물리적 접근이나 탈옥 등을 통해 악의적인 공격자가 데이터를 탈취할 수 있는 위험이 있다

이러한 이유로, 민감한 정보는 운영체제가 관리하는 KeyChain에 저장하여 추가적인 보안을 확보하는 것이 중요하다

 

KeyChain의 보안 이점과 잠재적 위험

KeyChain에 저장된 데이터는 암호화되어 안전하게 보호된다

사용자의 Face ID나 Touch ID와 같은 생체 인증을 통해 KeyChain 데이터를 안전하게 해제할 수 있다

또한, KeyChain은 애플의 iCloud Keychain 기능을 통해 기기 간에 데이터를 동기화할 수 있다

이 기능 덕분에 사용자에게 편리함을 제공하지만,

만약 기기가 탈취 되거나 악성 소프트웨어에 감염된다면 모든 기기의 인증 정보가 위험해질 수 있다

 

하지만 사용자가 허용하지 않는 한, 다른 앱이 KeyChain 데이터에 접근할 수 없고

기기가 손상되거나 분실된 경우에도 KeyChain 데이터는 iCloud KeyChain을 통해 안전하게 복구될 수 있다

이 과정에서도 데이터는 암호화되어 전송되고 저장된다

 

각 저장소의 목적에 맞는 사용

UserDefaults와 KeyChain의 보안 수준을 직접 비교하기보다는, 각각의 저장소가 제공하는 목적에 맞게 사용하는 것이 중요한 것 같다

 

UserDefaults

- 보안 요구가 상대적으로 낮고, 탈취되더라도 심각한 보안 위협이 없는 데이터

- 사용자의 앱 설정(테마, 언어 설정)

- 최근 본 항목의 목록

- 간단한 사용자 기본값

 

KeyChain

- 민감한 정보로, 탈취될 경우 사용자에게 심각한 위험을 초래할 수 있는 데이터

- 비밀번호 및 인증 토큰

- 금융 정보

- 개인 식별 정보

 

따라서, 민감한 데이터는 반드시 KeyChain에 저장하고, 일반적인 설정 값이나 사용자 기본값은 UserDefaults에 사용한 것이 좋다