[iOS] Keychain과 UserDefaults 병행

2025. 1. 10. 23:24iOS

반응형

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는 부가적 필요에 따라 사용합니다. 병행 사용이 필요 없는 경우도 많습니다.
반응형