[swift] Swift에서 키체인을 사용하여 사용자 토큰 관리하기

이번 포스트에서는 Swift 언어를 사용하여 사용자 토큰을 안전하게 관리하는 방법을 알아보겠습니다. 키체인은 iOS와 macOS에서 데이터 보호를 위해 사용되는 안전한 저장소입니다. 사용자 토큰을 키체인에 저장하면 앱을 다시 시작하거나 재설치해도 토큰을 계속 사용할 수 있습니다.

1. 키체인 접근하기

Swift에서 키체인에 접근하기 위해서는 ‘Security’ 프레임워크를 사용해야 합니다. 먼저, 해당 프레임워크를 import 하겠습니다.

import Security

2. 키체인에 토큰 저장하기

사용자 토큰을 키체인에 저장하기 위해서는 다음과 같은 함수를 사용할 수 있습니다.

func saveTokenToKeychain(token: String) -> Bool {
    let tokenData = token.data(using: .utf8)
    
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrAccount as String: "userToken",
        kSecValueData as String: tokenData!,
        kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlocked
    ]
    
    let status = SecItemAdd(query as CFDictionary, nil)
    return status == errSecSuccess
}

위의 코드에서 token은 저장할 토큰 값입니다. 이 함수는 토큰을 tokenData로 변환한 뒤, 키체인 쿼리를 생성하여 SecItemAdd 함수를 호출하여 토큰을 키체인에 저장합니다. 저장이 성공하면 errSecSuccess가 반환됩니다.

3. 키체인에서 토큰 불러오기

이제 저장한 토큰을 키체인에서 불러와서 사용하는 방법을 알아보겠습니다. 다음과 같은 함수를 사용하면 됩니다.

func getTokenFromKeychain() -> String? {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrAccount as String: "userToken",
        kSecReturnData as String: true,
        kSecMatchLimit as String: kSecMatchLimitOne
    ]
    
    var result: AnyObject?
    let status = SecItemCopyMatching(query as CFDictionary, &result)
    
    if status == errSecSuccess, let tokenData = result as? Data {
        return String(data: tokenData, encoding: .utf8)
    } else {
        return nil
    }
}

위의 코드에서 getTokenFromKeychain 함수는 키체인에서 userToken이라는 이름의 토큰을 찾아서 해당 데이터를 불러옵니다. 데이터의 존재 여부에 따라 String 또는 nil을 반환합니다.

4. 토큰 삭제하기

토큰을 더 이상 사용하지 않을 때는 키체인에서 삭제해야 합니다. 다음과 같은 함수를 사용하여 키체인에 저장된 토큰을 삭제할 수 있습니다.

func deleteTokenFromKeychain() -> Bool {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrAccount as String: "userToken"
    ]
    
    let status = SecItemDelete(query as CFDictionary)
    return status == errSecSuccess
}

위의 코드에서 deleteTokenFromKeychain 함수는 userToken이라는 이름의 토큰을 키체인에서 삭제합니다. 삭제가 성공하면 errSecSuccess가 반환됩니다.

결론

이제 Swift에서 키체인을 사용하여 사용자 토큰을 안전하게 관리하는 방법을 알았습니다. 키체인을 사용하면 데이터를 보호하고 재사용성을 높일 수 있습니다. 안전한 토큰 관리는 앱의 보안을 강화하는 데에 중요한 역할을 합니다.

참고: Apple Developer Documentation - Keychain Services