[swift] Swift 키체인 기초

이번 포스트에서는 Swift에서 키체인(Keychain)을 사용하는 기초적인 방법에 대해 알아보겠습니다.

키체인이란?

키체인은 iOS나 macOS 앱에서 사용자의 민감한 데이터를 보호하기 위해 사용되는 보안 저장소입니다. 예를 들어, 사용자의 로그인 정보나 인증 토큰을 안전하게 저장하는데 사용됩니다. 키체인은 암호화와 안전한 저장 기술을 사용하여 데이터를 보호합니다.

키체인 작업

1. 키체인에 데이터 저장하기

먼저, 키체인에 데이터를 저장하는 방법을 알아보겠습니다. 다음은 키체인에 문자열을 저장하는 예제 코드입니다.

import Security

let service = "MyApp"
let account = "user@example.com"
let password = "mypassword"

if let passwordData = password.data(using: .utf8) {

    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrService as String: service,
        kSecAttrAccount as String: account,
        kSecValueData as String: passwordData
    ]

    let status = SecItemAdd(query as CFDictionary, nil)
    if status == errSecSuccess {
        print("Password saved successfully")
    } else {
        print("Error saving password")
    }
}

위의 코드에서는 SecItemAdd 함수를 사용하여 키체인에 데이터를 추가합니다. kSecClassGenericPassword를 사용하여 generic password를 저장하도록 설정하고, kSecAttrServicekSecAttrAccount를 사용하여 저장된 데이터를 식별합니다. kSecValueData를 사용하여 실제 데이터를 저장합니다.

2. 키체인에서 데이터 불러오기

이제, 키체인에서 데이터를 불러오는 방법을 알아보겠습니다. 다음은 키체인에서 저장된 문자열을 불러오는 예제 코드입니다.

import Security

let service = "MyApp"
let account = "user@example.com"

let query: [String: Any] = [
    kSecClass as String: kSecClassGenericPassword,
    kSecAttrService as String: service,
    kSecAttrAccount as String: account,
    kSecMatchLimit as String: kSecMatchLimitOne,
    kSecReturnData as String: true
]

var dataTypeRef: AnyObject?
let status = SecItemCopyMatching(query as CFDictionary, &dataTypeRef)

if status == errSecSuccess, let retrievedData = dataTypeRef as? Data, let password = String(data: retrievedData, encoding: .utf8) {
    print("Retrieved password: \(password)")
} else {
    print("Error retrieving password")
}

위의 코드에서는 SecItemCopyMatching 함수를 사용하여 키체인에서 데이터를 검색합니다. kSecMatchLimitOne을 사용하여 하나의 결과만 가져오도록 설정하고, kSecReturnData를 사용하여 실제 데이터를 반환받습니다. 검색 결과는 CFData 형식으로 반환되므로, 이를 Data로 변환한 후 String으로 파싱하여 사용할 수 있습니다.

3. 키체인에서 데이터 삭제하기

마지막으로, 키체인에서 데이터를 삭제하는 방법을 알아보겠습니다. 다음은 키체인에서 저장된 데이터를 삭제하는 예제 코드입니다.

import Security

let service = "MyApp"
let account = "user@example.com"

let query: [String: Any] = [
    kSecClass as String: kSecClassGenericPassword,
    kSecAttrService as String: service,
    kSecAttrAccount as String: account
]

let status = SecItemDelete(query as CFDictionary)

if status == errSecSuccess {
    print("Password deleted successfully")
} else {
    print("Error deleting password")
}

위의 코드에서는 SecItemDelete 함수를 사용하여 키체인에서 데이터를 삭제합니다. kSecClass, kSecAttrService, kSecAttrAccount를 사용하여 삭제할 데이터를 지정합니다.

결론

이번 포스트에서는 Swift에서 키체인을 사용하는 방법을 간단히 알아보았습니다. 키체인은 사용자의 민감한 데이터를 안전하게 저장하는데 매우 유용합니다. 앱 개발시에는 키체인을 사용하여 보안에 신경을 써야 합니다. 앱의 사용자 데이터를 보호하고 개인정보 유출을 방지하기 위해 키체인을 적절히 활용해 보세요.

참고 자료