[swift] Swift에서 키체인으로 사용자 인증 구현하기

소개

사용자 인증은 모바일 애플리케이션에서 매우 중요한 기능입니다. 애플리케이션 내에서 사용자가 로그인한 후에는 사용자의 인증 정보를 안전하게 저장해야 합니다. 이때 키체인은 매우 유용한 기술입니다. 키체인을 사용하면 사용자의 인증 정보를 보호하고, 재사용하기 쉽게 저장할 수 있습니다.

이번 포스트에서는 Swift에서 키체인을 사용하여 사용자 인증을 구현하는 방법을 알아보겠습니다.

키체인 사용

Swift에서 키체인을 사용하기 위해서는 Security 프레임워크를 임포트해야 합니다. 다음의 코드로 Security 프레임워크를 임포트합니다.

import Security

키체인에 데이터를 추가하기 위해서는 아래의 함수를 사용합니다.

func saveToKeychain(key: String, data: Data) throws {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrAccount as String: key,
        kSecValueData as String: data
    ]

    let status = SecItemAdd(query as CFDictionary, nil)
    if status != errSecSuccess {
        throw KeychainError.saveFailed
    }
}

키체인에서 데이터를 읽어오기 위해서는 아래의 함수를 사용합니다.

func loadFromKeychain(key: String) throws -> Data {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrAccount as String: key,
        kSecReturnData as String: true
    ]

    var result: AnyObject?
    let status = withUnsafeMutablePointer(to: &result) {
        SecItemCopyMatching(query as CFDictionary, UnsafeMutablePointer($0))
    }

    if status != errSecSuccess {
        throw KeychainError.loadFailed
    }

    guard let data = result as? Data else {
        throw KeychainError.invalidData
    }

    return data
}

위의 코드에서 KeychainError는 사용자 정의 예외로서, 키체인 작업 중 발생하는 오류를 처리합니다.

사용 예제

다음은 실제 사용자 인증을 구현하기 위해 키체인을 사용하는 예제입니다.

let username = "john@example.com"
let password = "secretpassword"

do {
    // 사용자 인증 정보를 키체인에 저장
    try saveToKeychain(key: "username", data: username.data(using: .utf8)!)
    try saveToKeychain(key: "password", data: password.data(using: .utf8)!)

    // 키체인에서 사용자 인증 정보를 읽어옴
    let loadedUsernameData = try loadFromKeychain(key: "username")
    let loadedPasswordData = try loadFromKeychain(key: "password")

    let loadedUsername = String(data: loadedUsernameData, encoding: .utf8)
    let loadedPassword = String(data: loadedPasswordData, encoding: .utf8)

    print("Loaded username: \(loadedUsername ?? "")")
    print("Loaded password: \(loadedPassword ?? "")")
} catch {
    print("Error: \(error)")
}

위의 코드는 사용자의 이메일 주소와 비밀번호를 키체인에 저장한 후, 다시 키체인에서 읽어와서 출력하는 예제입니다.

결론

Swift에서 키체인을 사용하여 사용자 인증을 구현하는 것은 매우 간단하고 보안성이 높은 방법입니다. 위의 예제를 참고하여 안전하게 사용자 인증 정보를 관리할 수 있도록 해보세요.

참고자료