이번 포스트에서는 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