4월 11일 TIL (KeyChain) (수정 중)

이승원·2024년 4월 12일
0

TIL

목록 보기
63/75
post-thumbnail

KeyChain

공식 문서

KeyChain Services
Securely store small chunks of data on behalf of the user

사용자를 대신하여 작은 데이터 덩어리를 안전하게 저장한다.

  • KeyChain 는 디바이스 안에 암호화된 데이터를 저장하는 공간을 의미한다.
  • 로그인 및 암호, 결제 데이터, 토큰 등등을 안전하게 보관할 수 있다.

특징

  • 사용자가 제거하지 않는 이상, 앱을 제거해도 데이터는 남아있다.
  • 디바이스 잠금 상태에 따라서 KeyChain의 잠금상태도 변한다.
  • Keychain에는 그냥 data를 마구마구 넣을 수 있는게 아니라, KeyChain Item으로 변환해서 넣어야 한다.
  • KeyChainItem Class 는 공식 문서에서 확인할 수 있다.
// 일반 비밀번호 저장용
let kSecClassGenericPassword: CFString
	The value that indicates a generic password item.
    
// 인터넷용 아이디/패스워드 저장용  
let kSecClassInternetPassword: CFString
	The value that indicates an Internet password item.
    
// 인증서 저장용
let kSecClassCertificate: CFString
	The value that indicates a certificate item.

// 암호화 키 저장용
let kSecClassKey: CFString
	The value that indicates a cryptographic key item.

// ID 항목 저장용
let kSecClassIdentity: CFString
	The value that indicates an identity item.

사용 방법

  • ADD
// MARK: - ADD
// Keychain에 저장할 데이터를 추가하는 쿼리 생성
let addQuery: [String: Any] = [
  kSecClass as String: kSecClassGenericPassword, // Keychain 내에서 다루고자 하는 데이터의 유형을 지정합니다.
  kSecAttrService as String: "service", // 데이터를 저장하는 서비스나 앱을 식별하는데 사용됩니다.
  kSecAttrAccount as String: "key", // Keychain에서 데이터를 찾거나 식별하는데에 사용됩니다.
  kSecValueData as String: "data" // 실제로 Keychain에 저장될 데이터를 의미합니다.
]

// 데이터를 Keychain에 추가합니다.
let addStatus = SecItemAdd(addQuery as CFDictionary, nil)
  • GET
// MARK: - GET
// Keychain에서 데이터를 조회 위한 쿼리 생성
let getQuery: [String: Any] = [
  kSecClass as String: kSecClassGenericPassword, // Keychain 내에서 다루고자 하는 데이터의 유형을 지정합니다.
  kSecAttrService as String: "service", // 데이터를 저장하는 서비스나 앱을 식별하는데 사용됩니다.
  kSecAttrAccount as String: "key", // Keychain에서 데이터를 찾거나 식별하는데에 사용됩니다.
  kSecReturnData as String: kCFBooleanTrue, // Keychain에서 데이터를 가져올 때 반환할 데이터의 형태를 지정합니다.
  kSecMatchLimit as String: kSecMatchLimitOne // 일치하는 항목의 수를 제한하는데 사용됩니다.
]

// 데이터를 Keychain에서 조회합니다.
var item: CFTypeRef?
let getStatus = SecItemCopyMatching(getQuery as CFDictionary, &item)
  • UPDATE
// MARK: - UPDATE
// Keychain에서 데이터를 업데이트하기 위한 쿼리 생성
let updateQuery: [String: Any] = [
  kSecClass as String: kSecClassGenericPassword, // Keychain 내에서 다루고자 하는 데이터의 유형을 지정합니다.
  kSecAttrService as String: "service", // 데이터를 저장하는 서비스나 앱을 식별하는데 사용됩니다.
  kSecAttrAccount as String: "key", // Keychain에서 데이터를 찾거나 식별하는데에 사용됩니다.
]

// 업데이트할 데이터로 속성 설정
let attributes: [String: Any] = [
  kSecValueData as String: "newData"
]

// 데이터를 Keychain에서 업데이트합니다.
let updateStatus = SecItemUpdate(updateQuery as CFDictionary, attributes as CFDictionary)
  • DELETE
// MARK: - DELETE
// Keychain에서 데이터를 삭제하기 위한 쿼리 생성
let deleteQuery: [String: Any] = [
  kSecClass as String: kSecClassGenericPassword, // Keychain 내에서 다루고자 하는 데이터의 유형을 지정합니다.
  kSecAttrService as String: "service", // 데이터를 저장하는 서비스나 앱을 식별하는데 사용됩니다.
  kSecAttrAccount as String: "key", // Keychain에서 데이터를 찾거나 식별하는데에 사용됩니다.
]
// 데이터를 Keychain에서 삭제합니다.
let deleteStatus = SecItemDelete(deleteQuery as CFDictionary)
profile
개발자 (진)

0개의 댓글