UserDefaults와 KeychainManager
Swift에서 데이터를 저장하는 방법은 여러 가지가 있다. 그 중에서도 UserDefaults와 Keychain은 가장 많이 사용되는 두 가지 방법이다. 이 두 저장소는 각각의 용도와 특성이 다르기 때문에 어떤 상황에서 어떤 저장소를 사용해야 할지 이해하는 것이 중요하다. 그런 의미로 이번 포스트에서는 UserDefaults와 KeychainManager의 개념, 사용법, 그리고 주요 차이점에 대해 자세히 알아보자.
UserDefaults
UserDefaults는 간단한 데이터(예: 설정, 사용자 기본값 등)를 저장하는 데 사용되는 클래스이며,. 주로 앱의 사용자 설정이나 간단한 정보를 저장할 때 유용하다.
// 값 저장
UserDefaults.standard.set("John Doe", forKey: "username")
UserDefaults.standard.set(25, forKey: "age")
// 값 읽기
if let username = UserDefaults.standard.string(forKey: "username") {
print("Username: \(username)")
}
let age = UserDefaults.standard.integer(forKey: "age")
print("Age: \(age)")
특징
- 간편한 사용: 간단한 키-값 쌍으로 데이터를 저장하고 읽을 수 있음
- 비휘발성: 앱이 종료되더라도 데이터가 유지됨
- 데이터 타입: 문자열, 숫자, 불리언, 배열, 딕셔너리 등 다양한 데이터 타입을 지원
- 성능: 빠른 읽기/쓰기가 가능하지만, 대량의 데이터 저장에는 적합하지 않음
사용 사례
- 사용자 설정(테마, 언어 등)
- 앱의 기본값
- 간단한 캐시 데이터
KeychainManager
Keychain은 보안이 중요한 데이터를 저장하는 데 사용되는 API이다. 주로 비밀번호, 인증 토큰, 개인 정보 등 민감한 데이터를 안전하게 저장할 때 사용된다.
import Security
class KeychainManager {
class func save(key: String, data: Data) {
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: key,
kSecValueData as String: data
]
SecItemDelete(query as CFDictionary) // 기존 항목 삭제
SecItemAdd(query as CFDictionary, nil) // 새 항목 추가
}
class func load(key: String) -> Data? {
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: key,
kSecReturnData as String: kCFBooleanTrue!,
kSecMatchLimit as String: kSecMatchLimitOne
]
var dataTypeRef: AnyObject? = nil
let status: OSStatus = SecItemCopyMatching(query as CFDictionary, &dataTypeRef)
if status == errSecSuccess {
return dataTypeRef as? Data
}
return nil
}
}
// 사용 예
let passwordData = "mySecurePassword".data(using: .utf8)!
KeychainManager.save(key: "userPassword", data: passwordData)
if let retrievedData = KeychainManager.load(key: "userPassword"),
let password = String(data: retrievedData, encoding: .utf8) {
print("Retrieved Password: \(password)")
}
특징
- 보안: 데이터를 암호화하여 저장하므로, 민감한 정보를 안전하게 보호할 수 있음
- 비휘발성: 앱이 종료되더라도 데이터가 유지됨
- 데이터 타입: 주로 Data 타입으로 저장되며, 문자열, 비밀번호 등 다양한 형식으로 변환하여 사용할 수 있음
- 복잡성: 사용법이 UserDefaults보다 복잡하지만, 보안이 필요한 경우 필수
사용 사례
- 사용자 비밀번호
- 인증 토큰
- 개인 정보(신용카드 번호 등)
UserDefaults vs KeychainManager: 주요 차이점
| 특성 | UserDefaults | KeychainManager |
| 목적 | 간단한 데이터 저장 | 보안이 필요한 데이터 저장 |
| 보안 | 보안이 취약 (암호화 없음) | 데이터 암호화 및 보안 저장 |
| 데이터 타입 | 문자열, 숫자, 배열, 딕셔너리 등 | 주로 Data 타입 |
| 성능 | 빠른 읽기/쓰기 | 상대적으로 느림 (보안 처리 필요) |
| 사용 용도 | 사용자 설정, 기본값 | 비밀번호, 인증 토큰, 민감한 정보 |
결론
UserDefaults와 KeychainManager는 각각의 용도와 특성이 다르기 때문에, 상황에 맞게 적절히 선택하여 사용해야 한다.
- UserDefaults는 간단한 설정이나 기본값을 저장할 때 유용하며, 사용이 간편함
- KeychainManager는 보안이 중요한 데이터를 저장할 때 필수적이며, 데이터의 안전성을 보장함
'걔 (개발)로그 > Swift' 카테고리의 다른 글
| Swift에서 프로토콜 (Protocols) (0) | 2024.08.14 |
|---|---|
| Swift의 인스턴스와 컴포넌트: 개념과 차이점 (0) | 2024.08.05 |
| Swift의 private static 조합 (0) | 2024.08.05 |
| Swift의 override, 재정의, 상속··· 그게 다 뭔 소리람 (0) | 2024.08.05 |
| Swift의 순환 참조(Circular Reference)는 어떻게 해결하지? (0) | 2024.07.02 |