Xcode - 키체인 사용법

CodeCat·2024년 9월 11일
post-thumbnail

안녕하세요 !

이번에는 키체인 사용법에 대해서 알아보겠습니다

Keychain이란?

Keychain은 iOS와 macOS에서 제공하는 암호화된 데이터베이스이며 주로 비밀번호, 인증 토큰, 암호화 키 등 민감한 정보를 안전하게 저장하는 데 사용됩니다

Keychain을 사용하면 개발자가 직접 복잡한 암호화 로직을 구현할 필요 없이, 시스템에서 제공하는 안전한 저장소를 활용할 수 있어요~!

Keychain 사용하기

Keychain을 사용하기 위해서는 Security 프레임워크를 import해야하고 Keychain 작업은 아래 세 가지로 나눌 수 있어요

  1. 데이터 추가
  2. 데이터 검색
  3. 데이터 업데이트

각 작업에 대해 자세히 살펴볼게요 ㅎㅎㅎㅎ

1. Keychain에 데이터 추가하기

Keychain에 데이터를 추가할때는 SecItemAdd 함수를 사용하며 이 함수는 CFDictionary 형태의 쿼리를 받아 Keychain에 항목을 추가할 수 있습니다

struct Keychain {
    static func addItemToKeychain(password: String) {
        let passwordData = password.data(using: .utf8)!
        
        let query: [String: Any] = [
            kSecClass as String: kSecClassGenericPassword,
            kSecValueData as String: passwordData
        ]
        
        let status = SecItemAdd(query as CFDictionary, nil)
        
        if status == errSecSuccess {
            print("비밀번호가 Keychain에 성공적으로 추가되었습니다.")
        } else {
            print("Keychain에 비밀번호 추가 실패: \(status)")
        }
    }
}

kSecClass에서 저장할 항목의 유형을 지정하며, kSecValueData는 실제 저장할 데이터를 나타냅니다

2. Keychain 데이터 검색하기

저장된 데이터를 검색하려면 SecItemCopyMatching 함수를 사용하며 이 함수도 쿼리를 받아 해당 조건에 맞는 항목을 반환합니다.

static func searchItemFromKeychain() -> String? {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecReturnData as String: true
    ]
    
    var item: CFTypeRef?
    let status = SecItemCopyMatching(query as CFDictionary, &item)
    
    guard status == errSecSuccess else {
        print("Keychain 검색 실패: \(status)")
        return nil
    }
    
    guard let passwordData = item as? Data,
          let password = String(data: passwordData, encoding: .utf8) else {
        print("비밀번호 데이터 변환 실패")
        return nil
    }
    
    return password
}

kSecReturnData를 true로 설정하여 데이터를 반환받도록 합니다

3. Keychain의 데이터 업데이트하기

마지막으로, 저장된 데이터를 업데이트하려면 SecItemUpdate 함수를 사용하고 이 함수는 업데이트할 항목을 찾기 위한 쿼리와 새로운 데이터를 포함한 쿼리, 두 개의 쿼리를 받습니다.

static func updateItemInKeychain(newPassword: String) -> Bool {
    let searchQuery: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword
    ]
    
    let newPasswordData = newPassword.data(using: .utf8)!
    let updateQuery: [String: Any] = [
        kSecValueData as String: newPasswordData
    ]
    
    let status = SecItemUpdate(searchQuery as CFDictionary, updateQuery as CFDictionary)
    
    if status == errSecSuccess {
        print("비밀번호가 성공적으로 업데이트되었습니다.")
        return true
    } else {
        print("비밀번호 업데이트 실패: \(status)")
        return false
    }
}

searchQuery는 업데이트할 항목을 찾는 데 사용되고, updateQuery는 새로운 데이터를 지정합니다

이상으로 포스팅 마무리 하겠습니다.

.
.
.

감사합니다.

profile
코드와 고양이의 만남

0개의 댓글