[swift] Swift에서 키체인을 사용하여 앱 설정값 초기화하기

앱 설정값은 앱의 동작을 제어하고 사용자 경험을 개선하는 데 중요한 역할을 합니다. 이러한 설정값은 종종 사용자 기기에 저장되며, 앱을 다시 시작해도 유지되어야 합니다. 이러한 값을 안전하게 저장하고 관리하기 위해 Swift에서 키체인(Keychain)을 사용할 수 있습니다.

키체인(Keychain)이란?

키체인은 iOS와 macOS에서 암호화된 데이터를 안전하게 저장하기 위한 기능입니다. 이는 사용자의 비밀번호, 토큰, 인증서 등과 같은 중요한 정보를 저장하는 데 사용됩니다. 키체인은 운영체제 수준에서 관리되기 때문에 다른 애플리케이션에서 접근할 수 없으며, 기기가 재부팅되더라도 정보가 유지됩니다.

키체인에 설정값 저장하기

다음은 Swift에서 키체인을 사용하여 앱 설정값을 저장하고 초기화하는 간단한 예제입니다.

import Foundation
import Security

// 설정값을 저장할 키
let settingKey = "myAppSettingKey"

// 설정값 저장 함수
func saveSetting(value: String) {
    // 설정값을 NSData로 변환
    let settingData = value.data(using: .utf8)

    // 키체인에 설정값 저장
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrService as String: Bundle.main.bundleIdentifier ?? "",
        kSecAttrAccount as String: settingKey,
        kSecValueData as String: settingData!
    ]

    let status = SecItemAdd(query as CFDictionary, nil)
    if status != errSecSuccess {
        print("Failed to save setting")
    }
}

// 설정값 로드 함수
func loadSetting() -> String? {
    // 키체인에서 설정값 불러오기
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrService as String: Bundle.main.bundleIdentifier ?? "",
        kSecAttrAccount as String: settingKey,
        kSecMatchLimit as String: kSecMatchLimitOne,
        kSecReturnData as String: true
    ]

    var result: AnyObject?
    let status = SecItemCopyMatching(query as CFDictionary, &result)
    if status == errSecSuccess {
        if let data = result as? Data {
            // NSData를 문자열로 변환하여 설정값 반환
            return String(data: data, encoding: .utf8)
        }
    }

    return nil
}

// 설정값 초기화 함수
func resetSetting() {
    // 키체인에서 설정값 삭제
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrService as String: Bundle.main.bundleIdentifier ?? "",
        kSecAttrAccount as String: settingKey
    ]

    let status = SecItemDelete(query as CFDictionary)
    if status != errSecSuccess {
        print("Failed to reset setting")
    }
}

// 사용 예시
saveSetting(value: "myAppSettingValue")

if let savedSetting = loadSetting() {
    print("Saved setting: \(savedSetting)")
} else {
    print("Setting not found")
}

resetSetting()

위의 코드에서 saveSetting 함수는 주어진 설정값을 NSData로 변환한 후, 해당 데이터를 키체인에 저장합니다. loadSetting 함수는 키체인에서 설정값을 가져와 NSData를 문자열로 변환하여 반환합니다. resetSetting 함수는 키체인에서 설정값을 삭제합니다.

키체인은 개인 정보를 보호하기 위한 강력한 도구입니다. 설정값과 같은 중요한 데이터를 안전하게 저장하고 앱 초기화 시에 사용할 수 있습니다. 이를 통해 사용자 경험을 개선하고 앱의 보안을 강화할 수 있습니다.

참고 자료