[swift] Swift로 개발된 앱의 안전한 사용자 데이터 저장

앱 개발 과정에서 사용자의 개인 데이터를 안전하게 저장하는 것은 매우 중요합니다. Swift 언어를 사용하여 개발된 앱에서도 이를 실현할 수 있습니다. 이번 글에서는 Swift에서 안전한 사용자 데이터 저장을 위한 몇 가지 방법을 알아보겠습니다.

1. Keychain 사용하기

Keychain은 iOS에서 암호, 인증서, 비밀번호 등의 사용자 데이터를 안전하게 저장하기 위한 메커니즘입니다. Keychain을 사용하면 개인 데이터를 암호화하여 저장할 수 있으며, 앱이 삭제되더라도 데이터는 남아있게 됩니다.

import Security

func saveDataToKeychain(data: Data, identifier: String) -> Bool {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrAccount as String: identifier,
        kSecValueData as String: data
    ]
    
    let status = SecItemAdd(query as CFDictionary, nil)
    return status == errSecSuccess
}

func loadDataFromKeychain(identifier: String) -> Data? {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrAccount as String: identifier,
        kSecReturnData as String: true
    ]
    
    var result: AnyObject?
    let status = SecItemCopyMatching(query as CFDictionary, &result)
    
    if status == errSecSuccess {
        return result as? Data
    }
    
    return nil
}

위의 코드는 Keychain에 데이터를 저장하고 불러오는 간단한 함수 예시입니다. saveDataToKeychain 함수는 데이터와 식별자를 입력받아 Keychain에 데이터를 저장하며, loadDataFromKeychain 함수는 식별자를 입력받아 저장된 데이터를 불러옵니다.

let dataToSave = "Hello, Keychain!".data(using: .utf8)
saveDataToKeychain(data: dataToSave, identifier: "MyData")

if let loadedData = loadDataFromKeychain(identifier: "MyData") {
    let loadedString = String(data: loadedData, encoding: .utf8)
    print(loadedString) // 출력: "Hello, Keychain!"
}

위의 예제에서는 “Hello, Keychain!”라는 문자열 데이터를 Keychain에 저장하고 다시 불러와서 출력하는 간단한 예제입니다.

2. CoreData 사용하기

CoreData는 앱 내에서 구조화된 데이터를 관리하기 위한 프레임워크입니다. CoreData를 사용하면 데이터를 쉽게 저장하고 검색하며, 데이터 모델을 관리할 수 있습니다.

import CoreData

func saveDataToCoreData(data: String) {
    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
        return
    }
    
    let managedContext = appDelegate.persistentContainer.viewContext
    
    let entity = NSEntityDescription.entity(forEntityName: "User", in: managedContext)!
    let user = NSManagedObject(entity: entity, insertInto: managedContext)
    
    user.setValue(data, forKeyPath: "name")
    
    do {
        try managedContext.save()
    } catch let error as NSError {
        print("Could not save. \(error), \(error.userInfo)")
    }
}

func loadDataFromCoreData() -> [String] {
    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
        return []
    }
    
    let managedContext = appDelegate.persistentContainer.viewContext
    
    let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "User")
    
    do {
        let result = try managedContext.fetch(fetchRequest)
        return result.compactMap { $0.value(forKeyPath: "name") as? String }
    } catch let error as NSError {
        print("Could not fetch. \(error), \(error.userInfo)")
        return []
    }
}

saveDataToCoreData(data: "John Doe")

let loadedData = loadDataFromCoreData()
print(loadedData) // 출력: ["John Doe"]

위의 코드는 CoreData를 사용하여 데이터를 저장하고 불러오는 예시입니다. saveDataToCoreData 함수는 문자열 데이터를 CoreData에 저장하며, loadDataFromCoreData 함수는 저장된 데이터를 불러옵니다.

위의 예제에서는 “John Doe”라는 문자열 데이터를 CoreData에 저장하고 다시 불러와서 출력하는 간단한 예제입니다.

결론

Swift로 개발된 앱에서는 Keychain과 CoreData를 사용하여 사용자 데이터를 안전하게 저장할 수 있습니다. Keychain은 보안에 민감한 데이터의 경우, CoreData는 구조화된 데이터 관리에 적합한 경우 사용될 수 있습니다. 개인 데이터의 보안을 고려하여 적절한 방법을 선택하여 사용하면 됩니다.

참고: