[iOS] Keychain과 UserDefaults 병행
2025. 1. 10. 23:24ㆍiOS
반응형
Keychain과 UserDefaults를 병행할 필요성은 사용 사례에 따라 다릅니다. 두 저장소는 목적과 특성이 다르기 때문에, 병행 사용 여부는 다음과 같은 요인에 의해 결정됩니다:
1. Keychain과 UserDefaults의 차이점
특성KeychainUserDefaults
주요 용도 | 민감한 데이터(암호, 토큰, 인증 정보) 저장 | 비민감한 데이터(설정, 사용자 기본값) 저장 |
보안 | 데이터 암호화 및 보안 하드웨어(Secure Enclave) 활용 | 암호화되지 않음, 일반 파일로 저장 |
데이터 접근 | 특정 접근 권한(kSecAttrAccessible) 설정 가능 | 앱에서 바로 접근 가능 |
동기화 옵션 | iCloud Keychain 활성화 시 동기화 가능 | iCloud 동기화 별도 구현 필요 |
사용성 | 데이터 읽기/쓰기 과정이 더 복잡 | 간단한 API 제공 |
2. Keychain만 사용하는 경우
Keychain은 보안이 강화된 저장소이므로 민감한 데이터를 저장할 때 적합합니다. 예를 들어:
- 토큰: OAuth 인증 토큰, Apple 로그인 ID.
- 비밀번호: 사용자의 로그인 정보.
- 결제 관련 정보: 카드 식별자, 인증 키.
Keychain은 암호화 및 보안 처리가 기본적으로 제공되므로, 민감한 데이터를 저장하는 경우 UserDefaults를 추가적으로 사용할 필요가 없습니다.
3. UserDefaults와 병행 사용이 필요한 경우
Keychain만으로 부족한 상황에서 UserDefaults를 병행 사용할 수 있습니다. 주요 예는 다음과 같습니다:
3.1. 비민감한 데이터의 캐싱
Keychain에 접근할 때 성능이 떨어질 수 있습니다. 비민감한 데이터는 UserDefaults에 저장해 Keychain 접근을 최소화하는 방식으로 성능을 개선할 수 있습니다.
예:
- Keychain: 로그인 토큰(accessToken).
- UserDefaults: 사용자 이름(userName)과 같은 비민감 데이터.
3.2. Keychain 데이터의 유효성 확인
Keychain 데이터가 삭제되거나 손상된 경우, UserDefaults를 사용해 데이터 복구를 시도할 수 있습니다. 예:
- Keychain에서 appleLoginId를 읽을 수 없는 경우 UserDefaults에 저장된 백업 값 사용.
3.3. 동기화 및 설정 데이터
- UserDefaults는 앱의 비민감한 설정 값을 저장하는 데 적합합니다(예: "자동 로그인 여부", "마지막으로 본 화면").
4. Keychain과 UserDefaults를 병행할 때 코드 예시
var appleLoginId: String? {
get {
let keychain = Keychain(service: "com.example.app").accessibility(.afterFirstUnlock)
// Keychain에서 먼저 데이터 조회
if let loginId = keychain["appleLoginId"] {
return loginId
}
// Keychain 데이터가 없으면 UserDefaults 사용
return UserDefaults.standard.string(forKey: "appleLoginId")
}
set {
let keychain = Keychain(service: "com.example.app").accessibility(.afterFirstUnlock)
// Keychain과 UserDefaults에 동기화 저장
keychain["appleLoginId"] = newValue
UserDefaults.standard.set(newValue, forKey: "appleLoginId")
}
}
5. Keychain 단독 사용을 권장하는 경우
- 민감한 데이터를 저장하고 보안이 최우선일 때는 Keychain만 사용하는 것이 더 적합합니다.
- UserDefaults에 민감한 데이터를 저장하는 것은 보안 위험이 있습니다.
요약
- Keychain 단독 사용: 민감한 데이터(토큰, 비밀번호 등).
- UserDefaults 병행 사용: 성능 최적화 또는 비민감 데이터 캐싱 필요 시.
- 결론: 민감한 데이터 저장에는 Keychain이 기본이며, UserDefaults는 부가적 필요에 따라 사용합니다. 병행 사용이 필요 없는 경우도 많습니다.
반응형
'iOS' 카테고리의 다른 글
[RxSwift] PublishSubject (0) | 2025.01.10 |
---|---|
[RxSwift] BehaviorSubject (0) | 2025.01.10 |
[API] 400 Bad Request (1) | 2025.01.10 |
[iOS] Method cannot be marked @objc because the type of the parameter 5 cannot be represented in Objective-C (0) | 2025.01.10 |
[API] UnexpectedRollbackException 500 Error (1) | 2025.01.10 |