UserDefaults를 통해서 데이터를 쉽게 저장할 수 있지만, plist파일에 Key-Value형태로 저장하기 때문에 쉽게 내용물들을 볼 수 있다는 취약점이 있다.(보안이슈)
그러므로 보안이 필요한 데이터는 KeyChain에 저장하는것이 좋다.
KeyChain이란?
- Apple이 제공하는 보안 프레임 워크.
- KeyChain은 디바이스 안에 암호화된 데이터 저장공간을 의미.
- 앱을 삭제하고 재설치해도 데이터가 남아있다.
- 디바이스를 lock하면 keychain도 잠기고, unlock하면 keychain도 풀린다.
즉, keychain이 잠긴 상태에서는 데이터들에 접근할수도, 복호화 할 수도 없다. - 같은 개발자가 개발한 여러 앱에서 키체인 정보를 공유할 수 있다. (KeyChainSharing)
https://developer.apple.com/documentation/security/keychain_services/keychain_items/sharing_access_to_keychain_items_among_a_collection_of_apps - 키체인 정보를 저장할 때는 키체인 아이템으로 패키징해야함
- 키체인 아이템은 정보와 속성으로 구성
키체인 서비스 API는 아이템을 삽입하기 전에 정보를 암호화하고, 속성과 함께 패키징한다.
- 정보는 저장하고자 하는 정보
- 속성을 통해 정보를 식별하고, 저장하거나 저장된 항목에 대한 접근을 제어함

- 키체인을 구현하기 위해서는 Security프레임워크를 import해야함
- 키체인 아이템은 CFDictionary를 사용해 접근할 수 있다.
키체인 속성
- kSecClass: 키체인 아이템의 타입
- kSecClassGenericPassword
- kSecClassInternetPassword
- kSecClassCertificate
- kSecClassKey
- kSecClassIdentity - kSecAttrService: 키체인 아이템과 연관되어 있는 서비스의 이름
- kSecClassGenericPassword 타입에서 사용 - kSecAttrAccount: 저장할 아이템의 계정 이름(아이디)
- kSecClassGenericPassword, kSecClassInternetPassword 타입에서 사용 - kSecAttrGeneric: 저장할 아이템의 데이터(비밀번호)
- kSecClassGenericPassword 타입에서 사용 - kSecMatchLimit: 일치하는 값을 제한
- kSecMatchLimitOne
- kSecMatchLimitAll - kSecReturnAttributes
- 키의 값으로 true를 저장할 경우, CFDictionary 타입으로 반환 - kSecReturnData
- 키의 값으로 true를 저장할 경우, CFData 타입으로 반환 - kSecValueData
- 저장할 아이템의 비밀번호
메서드
- 생성
SecItemAdd(_:_:) - 조회
SecItemCopyMatching(_:_:) - 수정
SecItemUpdate(_:_:) - 삭제
SecItemDelete(_:)
참고
https://daeun28.github.io/ios%EC%82%AC%EC%9A%A9%EB%B2%95/post21/