안녕하세요 !
이번에는 키체인 사용법에 대해서 알아보겠습니다
Keychain은 iOS와 macOS에서 제공하는 암호화된 데이터베이스이며 주로 비밀번호, 인증 토큰, 암호화 키 등 민감한 정보를 안전하게 저장하는 데 사용됩니다
Keychain을 사용하면 개발자가 직접 복잡한 암호화 로직을 구현할 필요 없이, 시스템에서 제공하는 안전한 저장소를 활용할 수 있어요~!
Keychain을 사용하기 위해서는 Security 프레임워크를 import해야하고 Keychain 작업은 아래 세 가지로 나눌 수 있어요
- 데이터 추가
- 데이터 검색
- 데이터 업데이트
각 작업에 대해 자세히 살펴볼게요 ㅎㅎㅎㅎ
Keychain에 데이터를 추가할때는 SecItemAdd 함수를 사용하며 이 함수는 CFDictionary 형태의 쿼리를 받아 Keychain에 항목을 추가할 수 있습니다
struct Keychain {
static func addItemToKeychain(password: String) {
let passwordData = password.data(using: .utf8)!
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecValueData as String: passwordData
]
let status = SecItemAdd(query as CFDictionary, nil)
if status == errSecSuccess {
print("비밀번호가 Keychain에 성공적으로 추가되었습니다.")
} else {
print("Keychain에 비밀번호 추가 실패: \(status)")
}
}
}
kSecClass에서 저장할 항목의 유형을 지정하며, kSecValueData는 실제 저장할 데이터를 나타냅니다
저장된 데이터를 검색하려면 SecItemCopyMatching 함수를 사용하며 이 함수도 쿼리를 받아 해당 조건에 맞는 항목을 반환합니다.
static func searchItemFromKeychain() -> String? {
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecReturnData as String: true
]
var item: CFTypeRef?
let status = SecItemCopyMatching(query as CFDictionary, &item)
guard status == errSecSuccess else {
print("Keychain 검색 실패: \(status)")
return nil
}
guard let passwordData = item as? Data,
let password = String(data: passwordData, encoding: .utf8) else {
print("비밀번호 데이터 변환 실패")
return nil
}
return password
}
kSecReturnData를 true로 설정하여 데이터를 반환받도록 합니다
마지막으로, 저장된 데이터를 업데이트하려면 SecItemUpdate 함수를 사용하고 이 함수는 업데이트할 항목을 찾기 위한 쿼리와 새로운 데이터를 포함한 쿼리, 두 개의 쿼리를 받습니다.
static func updateItemInKeychain(newPassword: String) -> Bool {
let searchQuery: [String: Any] = [
kSecClass as String: kSecClassGenericPassword
]
let newPasswordData = newPassword.data(using: .utf8)!
let updateQuery: [String: Any] = [
kSecValueData as String: newPasswordData
]
let status = SecItemUpdate(searchQuery as CFDictionary, updateQuery as CFDictionary)
if status == errSecSuccess {
print("비밀번호가 성공적으로 업데이트되었습니다.")
return true
} else {
print("비밀번호 업데이트 실패: \(status)")
return false
}
}
searchQuery는 업데이트할 항목을 찾는 데 사용되고, updateQuery는 새로운 데이터를 지정합니다
이상으로 포스팅 마무리 하겠습니다.
.
.
.
감사합니다.