[swift] Swift에서 키체인을 사용하여 사용자 접속 기록 관리하기

사용자 접속 기록을 안전하게 관리하고 저장하기 위해 암호화된 형태로 저장해야 합니다. Swift에서는 Keychain이라는 기능을 사용하여 이를 구현할 수 있습니다. 이번에는 Swift에서 Keychain을 사용하여 사용자 접속 기록을 관리하는 방법에 대해 알아보겠습니다.

Keychain에 데이터 저장하기

Keychain에 데이터를 저장하기 위해서는 Security 프레임워크를 import 해야 합니다. 아래는 Keychain에 데이터를 저장하는 예제 코드입니다.

import Foundation
import Security

func saveDataToKeychain(account: String, password: String) -> Bool {
    // 데이터를 저장할 Dictionary 생성
    let keychainQuery: [NSString: AnyObject] = [
        kSecClass: kSecClassGenericPassword,
        kSecAttrAccount: account,
        kSecValueData: password.data(using: .utf8)! as AnyObject
    ]
    
    // 기존에 저장된 데이터를 삭제
    let deleteStatus = SecItemDelete(keychainQuery as CFDictionary)
    
    // 새로운 데이터를 Keychain에 저장
    let status = SecItemAdd(keychainQuery as CFDictionary, nil)
    
    return status == errSecSuccess
}

위의 코드에서는 kSecClassGenericPassword 값을 통해 Generic Password 타입의 데이터를 저장하고 있습니다. kSecAttrAccount는 데이터의 식별을 위해 사용되며, kSecValueData에는 실제 데이터를 암호화하여 저장합니다.

Keychain에서 데이터 불러오기

데이터를 Keychain에서 불러오기 위해서는 저장할 때와 마찬가지로 Security 프레임워크를 import 해야 합니다. 아래는 Keychain에서 데이터를 불러오는 예제 코드입니다.

import Foundation
import Security

func getDataFromKeychain(account: String) -> String? {
    // 데이터를 조회하기 위한 Query 생성
    let keychainQuery: [NSString: AnyObject] = [
        kSecClass: kSecClassGenericPassword,
        kSecAttrAccount: account,
        kSecReturnData: kCFBooleanTrue!,
        kSecMatchLimit: kSecMatchLimitOne
    ]
    
    // Keychain에서 데이터 조회
    var retrievedData: AnyObject?
    let status = SecItemCopyMatching(keychainQuery as CFDictionary, &retrievedData)
    
    if status == errSecSuccess {
        if let data = retrievedData as? Data {
            return String(data: data, encoding: .utf8)
        }
    }
    
    return nil
}

위의 코드에서는 kSecReturnData 값을 통해 실제 데이터를 반환받고 있습니다. 조회한 데이터는 Data 형태로 반환되므로, 이를 원하는 형태로 변환하여 사용할 수 있습니다.

사용 예제

이제 Keychain을 사용하여 사용자 접속 기록을 저장하고 불러오는 예제를 보겠습니다.

let account = "user123"
let password = "password123"

// 데이터 저장
let saveSuccess = saveDataToKeychain(account: account, password: password)

if saveSuccess {
    print("접속 기록이 저장되었습니다.")
} else {
    print("접속 기록 저장에 실패했습니다.")
}

// 데이터 조회
if let retrieved = getDataFromKeychain(account: account) {
    print("접속 기록: \(retrieved)")
} else {
    print("접속 기록이 없습니다.")
}

위의 코드에서는 accountpassword 변수에 적절한 값을 입력한 후, saveDataToKeychain 함수를 사용하여 데이터를 저장하고, getDataFromKeychain 함수를 사용하여 저장한 데이터를 불러옵니다.

결론

Swift에서 Keychain을 사용하여 사용자 접속 기록을 안전하게 관리할 수 있습니다. Keychain은 사용자 데이터를 암호화하여 저장하므로, 데이터의 보안성을 높일 수 있습니다. 이를 활용하여 사용자 및 애플리케이션의 접속 기록 관리에 활용할 수 있습니다.


참고자료