[swift] Swift에서 키체인을 사용하여 암호화된 데이터 전송 확장 기능 구현하기

암호화된 데이터를 안전하게 전송하는 것은 모바일 앱 개발에서 중요한 요소입니다. 이를 위해 iOS 개발에서는 키체인(Keychain)을 사용하여 데이터를 안전하게 저장 및 전송할 수 있습니다. 이번 기사에서는 Swift에서 키체인을 사용하여 암호화된 데이터를 전송하는 확장 기능(Extension)을 구현해 보겠습니다.

1. 키체인 클래스 생성

먼저, 암호화된 데이터를 저장하고 전송하기 위한 키체인 클래스를 생성해야 합니다. 아래와 같이 KeychainManager 클래스를 생성합니다.

import Foundation
import Security

class KeychainManager {
    
    static let shared = KeychainManager()
    
    private let service = "com.example.app"
    
    func saveEncryptedData(data: Data, forKey key: String) {
        let query: [String: Any] = [
            kSecClass as String: kSecClassGenericPassword,
            kSecAttrService as String: service,
            kSecAttrAccount as String: key,
            kSecValueData as String: data
        ]
        
        SecItemDelete(query as CFDictionary)
        
        SecItemAdd(query as CFDictionary, nil)
    }
    
    func getEncryptedData(forKey key: String) -> Data? {
        let query: [String: Any] = [
            kSecClass as String: kSecClassGenericPassword,
            kSecAttrService as String: service,
            kSecAttrAccount as String: key,
            kSecReturnData as String: kCFBooleanTrue!,
            kSecMatchLimit as String: kSecMatchLimitOne
        ]
        
        var result: AnyObject?
        let resultCode = SecItemCopyMatching(query as CFDictionary, &result)
        
        if resultCode == noErr {
            return result as? Data
        } else {
            return nil
        }
    }
    
    // 이 외에도 데이터 삭제, 업데이트 등의 기능을 추가할 수 있습니다.
}

위의 코드에서 saveEncryptedData 메소드는 암호화된 데이터를 저장하는 메소드이고, getEncryptedData 메소드는 특정 키에 해당하는 암호화 데이터를 가져오는 메소드입니다.

2. 확장 기능 구현

이제 키체인 클래스를 활용하여 암호화된 데이터를 전송하는 확장 기능을 구현해 보겠습니다. 예를 들어, Data 타입에 sendEncryptedData() 메소드를 추가하여 데이터를 암호화하고 전송하는 로직을 작성할 수 있습니다.

extension Data {
    
    func sendEncryptedData() {
        // 데이터를 암호화하는 로직 추가
        
        // 암호화된 데이터를 키체인에 저장
        KeychainManager.shared.saveEncryptedData(data: self, forKey: "encryptedData")
        
        // 암호화된 데이터 전송 로직 추가
    }
    
}

위의 코드에서 sendEncryptedData() 메소드는 데이터를 암호화하여 키체인에 저장한 후, 전송하는 역할을 수행합니다.

3. 사용 예시

이제 위에서 구현한 확장 기능을 사용하여 암호화된 데이터를 전송하는 예시를 살펴보겠습니다.

let dataToEncrypt = "Hello, World!".data(using: .utf8)!

dataToEncrypt.sendEncryptedData()

위의 코드에서는 “Hello, World!”라는 문자열을 Data 타입으로 변환한 후, sendEncryptedData() 메소드를 호출하여 데이터를 암호화하고 전송합니다.

결론

Swift에서 키체인을 사용하여 암호화된 데이터를 안전하게 전송하기 위한 확장 기능을 구현하는 방법을 살펴보았습니다. 데이터 보안에 중요한 역할을 수행하는 키체인을 통해 암호화된 데이터를 안전하게 전송할 수 있으므로, 앱의 보안 강화를 위해 이러한 확장 기능을 적절히 활용해 보시기 바랍니다.

참고 자료