[swift] Swift에서 키체인을 사용하여 소셜 미디어 계정 연결 관리하기

소개

Swift에서 키체인(Keychain)은 암호화된 저장소로, 사용자의 중요한 정보를 안전하게 보관할 수 있는 기능을 제공합니다. 이 기능을 활용하여 소셜 미디어 계정 연결을 관리할 수 있습니다. 이 글에서는 Swift를 사용하여 소셜 미디어 계정 연결을 키체인을 이용해 안전하게 저장하고 관리하는 방법에 대해 알아보겠습니다.

키체인에 계정 정보 저장하기

먼저, Swift에서 키체인에 계정 정보를 저장하는 기능을 구현해보겠습니다. 다음은 Facebook 로그인을 예시로 설명하겠습니다.

import Security

func saveSocialMediaCredentials(username: String, password: String) {
    let serviceIdentifier = "com.example.app.facebook"

    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrService as String: serviceIdentifier,
        kSecAttrAccount as String: username,
        kSecValueData as String: password.data(using: .utf8)!
    ]

    let status = SecItemAdd(query as CFDictionary, nil)

    guard status == errSecSuccess else {
        print("Failed to save credentials to keychain")
        return
    }

    print("Credentials saved to keychain")
}

위의 코드는 saveSocialMediaCredentials(username: String, password: String) 함수를 통해 사용자의 Facebook 계정 정보를 키체인에 저장합니다. serviceIdentifier 변수에는 식별자를 입력하여 해당 앱이 사용자 계정 정보를 저장하는 것임을 알립니다. query 변수는 키체인에 저장할 데이터의 속성을 정의합니다. kSecClassGenericPassword는 키체인에 일반적인 비밀번호 타입의 데이터를 저장하겠다는 의미이고, kSecAttrService는 저장소의 식별자를 지정합니다. kSecAttrAccount는 계정의 사용자명을 지정하고, kSecValueData는 계정의 비밀번호를 지정합니다.

키체인에서 계정 정보 불러오기

저장한 계정 정보를 키체인에서 불러오는 기능을 구현해보겠습니다.

func getSocialMediaCredentials() -> (username: String?, password: String?) {
    let serviceIdentifier = "com.example.app.facebook"

    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrService as String: serviceIdentifier,
        kSecMatchLimit as String: kSecMatchLimitOne,
        kSecReturnAttributes as String: true,
        kSecReturnData as String: true
    ]

    var result: AnyObject?

    let status = SecItemCopyMatching(query as CFDictionary, &result)

    guard status == errSecSuccess else {
        print("Failed to retrieve credentials from keychain")
        return (nil, nil)
    }

    guard let item = result as? [String: Any],
        let username = item[kSecAttrAccount as String] as? String,
        let passwordData = item[kSecValueData as String] as? Data,
        let password = String(data: passwordData, encoding: .utf8) else {
        print("Failed to decode credentials from keychain")
        return (nil, nil)
    }

    return (username, password)
}

위의 코드는 getSocialMediaCredentials() 함수를 통해 키체인에서 사용자의 계정 정보를 불러옵니다. 저장한 계정 정보와 동일한 serviceIdentifier를 지정하여 해당 계정 정보를 찾습니다. kSecMatchLimitOne을 사용하여 하나의 결과만 반환하도록 설정하고, kSecReturnAttributeskSecReturnData를 true로 설정하여 결과에 대한 속성과 데이터를 함께 받아옵니다.

키체인에서 계정 정보 삭제하기

키체인에서 저장된 계정 정보를 삭제하는 기능을 구현해보겠습니다.

func deleteSocialMediaCredentials() {
    let serviceIdentifier = "com.example.app.facebook"

    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrService as String: serviceIdentifier
    ]

    let status = SecItemDelete(query as CFDictionary)

    guard status == errSecSuccess else {
        print("Failed to delete credentials from keychain")
        return
    }

    print("Credentials deleted from keychain")
}

위의 코드는 deleteSocialMediaCredentials() 함수를 통해 키체인에서 저장된 해당 계정 정보를 삭제합니다. 마찬가지로 serviceIdentifier를 지정하여 삭제할 계정 정보를 찾습니다.

결론

이렇게 Swift에서 키체인을 사용하여 소셜 미디어 계정 연결 관리를 할 수 있습니다. 중요한 정보를 안전하게 저장하고 관리하는 키체인은 보안에 매우 중요한 역할을 합니다. 이를 잘 활용하여 사용자의 개인 정보를 보호하는 것을 권장합니다.

참고 자료