본문 바로가기

iOS/Swift

iOS Keychain 사용 방법과 예제

반응형

소개

iOS 앱에서 민감한 정보를 안전하게 저장하려면 Keychain을 사용하는 것이 좋습니다. Keychain은 iOS 시스템에서 제공하는 안전한 저장소로, 패스워드, 토큰, 인증 정보 등을 안전하게 보관할 수 있습니다. 이번 포스트에서는 iOS Keychain의 사용 방법과 예제 코드를 소개합니다.

 

Keychain 사용 방법 :

1. Security.framework 추가

먼저 프로젝트에 `Security.framework`을 추가해야 합니다. 이 프레임워크는 Keychain에 접근할 수 있는 메서드를 제공합니다.

 

2. KeychainWrapper 클래스 생성

Keychain 접근을 간편하게 하기 위해 `KeychainWrapper` 클래스를 생성합니다. 이 클래스는 Keychain에 값을 저장하고 가져오는 등의 작업을 수행합니다.

import Foundation
import Security

class KeychainWrapper {
    // ...
}

3. 값 저장하기

static func saveValue(_ value: String, forKey key: String) {
    let data = value.data(using: .utf8)!
    
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrAccount as String: key,
        kSecValueData as String: data
    ]
    
    SecItemDelete(query as CFDictionary)
    
    let status = SecItemAdd(query as CFDictionary, nil)
    assert(status == errSecSuccess, "Failed to save value in Keychain")
}

4. 값 불러오기

static func loadValue(forKey key: String) -> String? {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrAccount as String: key,
        kSecReturnData as String: kCFBooleanTrue!,
        kSecMatchLimit as String: kSecMatchLimitOne
    ]
    
    var dataTypeRef: AnyObject?
    let status = SecItemCopyMatching(query as CFDictionary, &dataTypeRef)
    
    if status == errSecSuccess, let data = dataTypeRef as? Data {
        return String(data: data, encoding: .utf8)
    } else {
        return nil
    }
}

예제 코드 :

1. 값 저장하기

KeychainWrapper.saveValue("mySecretToken123", forKey: "AuthToken")

2. 값 불러오기

if let authToken = KeychainWrapper.loadValue(forKey: "AuthToken") {
    print("AuthToken: \(authToken)")
} else {
    print("AuthToken not found")
}

 

결론

iOS Keychain은 민감한 정보를 안전하게 보관할 수 있는 훌륭한 방법입니다. 이번 포스트에서는 Keychain을 설정하고 값을 저장하고 불러오는 간단한 예제를 살펴보았습니다. 이를 통해 앱에서 보안을 강화하고 사용자 데이터를 안전하게 관리할 수 있습니다.

반응형

'iOS > Swift' 카테고리의 다른 글

Static VS Final  (0) 2023.10.18
@propertyWrapper 활용 예제 1  (0) 2023.10.16
Swift Collective Type (Set)  (0) 2017.07.07
Swift Bitwise Operator  (0) 2017.06.26