-
안녕하세요. 그린입니다!
이번 포스팅에서는 KeyChain 즉 키체인에 대해 알아보겠습니다😀
우선 키체인이란 무엇인가!?
: 키체인은 데이터베이스에 암호화된 데이터의 작은 모음들을 저장하는 매커니즘 (열쇠다발)로 표현됩니다!
그럼 이제 키체인과 관련하여 좀 더 자세히 알아보도록하죠🧐
1. 유저 데이터를 저장하는 방법들
1) Keyed Archiver: coreData보다 덜 복잡하고 느리지만 사용이 간단하다. 저장할 데이터가 NSConfig 프로토콜을 채택해야하며
데이터를 저장할 시 키/이름으로 인코딩을하고 꺼낼때 디코딩을 이용한다.
2) CoreData: UserDefault보다 더 복잡하지만 저장된 정보에 구조가 필요할 때 유용하다.
대용량 데이터 저장에 사용되는 관계형 DB, 간단한 UI에서 자동으로 모델을 생성
3) User Defaults: 데이터를 저장 및 유지하는 가장 간단한 방법으로 데이터를 구조화하지 않는다.
(User Preference 같은 정보를 저장할때 적당하다.)
2. 1의 방법과 KeyChain의 차이점
1) User Defaults는 info.plist에 데이터(패스워드 등)가 저장되기에 앱이 삭제되면 정보도 삭제되지만 키 체인은 별도의 키체인에 데이터를 저장함으로 앱이 삭제되도 키 체인을 삭제해주기전에는 삭제되지 않는다.
-> 저장 및 로드가 쉽지만 해킹도 쉽다 (base64 인코딩하여 plist에 저장되기에..)
2) 키 체인 그룹을 사용하면 다른 앱에서도 데이터 공유 가능 (여러 환경에서 연동 가능)
3) 키 체인은 가장 안전하고 민감한 데이터를 저장 및 유지할때 사용하지만 가장 느리다.
3. Security
: 앱에서 관리하는 데이터를 보호하고 앱에 대한 액세스를 제어하는 프레임워크
-. 보안 프레임워크 사용 -> 정보보호/신뢰 구축 -> 소프트웨어 액세스 제어
-. 암호화는 어렵고 비용이 크기에 자체적으로 암호화 솔루션 구축은 지양한다.
(Security 프레임워크 사용을 권장하고 있다.)
-. 보안 네트워크 통신 시 보안 프레임워크 기반으로 하는 URL 로딩 시스템을 고려해야한다.
4. Keychain Services
: 사용자를 대신해 작은 데이터 모음을 안전하게 저장해주는 서비스
-. KeyChain Services API: 키 체인이라는 암호화된 DB에 사용자 데이터의 작은 비트를 저장하는 매커니즘을 앱에 제공해준다.
(e.g. 인증서, 키/신뢰 서비스 (암호화 키 및 인증서))
[키 체인 구성요소]
1) KeyChain Items
: 키 체인에 저장되는 데이터
2) ItemClass
: 아이템에 저장되는 데이터 종류 (인터넷패스워드/제네릭패스워드 등등...)
3) Attribute
: 아이템 클래스에 대한 속성값
[API Components]
1) Keychain Items
: 키 체인에 저장한 항목 (보안 정보 포함)
2) Keychain
: macOS에서 전체 키 체인 생성 및 관리
3) Access Control List
: macOS의 키 체인 항목 접근할 앱 제어
5. KeyChain Items
: 키 체인에 저장한 항목 데이터 (보안 정보 포함)
-. 암호화 키에 저장하려면 키 체인 항목으로 패키징해야된다.
-. 항목 접근성 제어 및 검색을 가능하게 공개적으로 표시되는 속성값의 모음을 제공
1) 키 체인 암호 추가
: 키 체인을 추가할때 아래와 같은 코드로 구현된다.
let account = credentials.username let password = credentials.password.data(using: String.Encoding.utf8)! var query: [String: Any] = [kSecClass as String: kSecClassInternetPassword, kSecAttrAccount as String: account, kSecAttrServer as String: server, kSecValueData as String: password]
: 키 체인을 추가할 시 다양한 분류가 있는데 위 부분은 인터넷 암호에 대한 클래스를 추가하는 경우
: 위의 Attribute에서 필요한 암호화 속성값을 골라 설정할 수 있다.
2) 키 체인 항목 추가
: SecItemAdd(_:_:)
let status = SecItemAdd(query as CFDictionary, nil) guard status == errSecSuccess else { throw KeychainError.unhandledError(status: status) }
3) 키 체인 항목 매칭 검색
: SecItemCopyMatching(_:_:)
func SecItemCopyMatching(_ query: CFDictionary, _ result: UnsafeMutablePointer<CFTypeRef?>?) -> OSStatus
4) 키 체인 항목 수정
: SecItemUpdate(_:_:)
-. 검색하여 일치하는 항목 수정
func SecItemUpdate(_ query: CFDictionary, _ attributesToUpdate: CFDictionary) -> OSStatus
5) 키 체인 항목 삭제
: SecItemDelete(_:_:)
-. 검색하여 일치하는 항목 삭제
func SecItemDelete(_ query: CFDictionary) -> OSStatus
6. KeyChains
:macOS에서 전체 키 체인 생성 및 관리
-. iOS에서는 단일 키 체인만 접근 가능 (iCloud 키 체인 포함)--> 모든 앱에서 사용할 수 있는 하나의 키 체인을 제공
-. macOS에서는 여러 키 체인 지원 (앱이 원하는만큼 키체인을 만들 수 있음)
--> e.g. 여러 키체인 카테고리 및 이름을 만들어 따로 관리
7. Access Control List (ACL)
: macOS 키 체인 항목 접근 앱 제어
-. 해당 항목에는 작업 배열과 작업 수행 신뢰할 수 있는 앱 배열이 포함 ( ACL이 해당 키 체인 항목 접근성 제어)
1)앱이 키체인 항목 엑세스 시도
2)시스템이 ACL에서 항목 탐색
3)액세스 권한 부여 및 거부
**ACL은 iOS / iCloud 키 체인 사용하는 macOS 앱에서는 사용 불가!!!
8. 키 체인 서비스 사용을 위한 k-접두어란???
: 상수의 의미로 표현되는것 (변하지 않는 값)
9. 키 체인에서 k-접두어가 붙은 값은 어떤 프레임워크???
: Core Foundation
-> 프로퍼티가 CFString 타입이고, 해당 타입은 Core Foundation에 포함된 타입
-> Low-Level functions으로 원시 데이터 타입에 접근하여 Foundation 프레임워크와 원활하게 연동시켜주는 기능을 함
-> Core Foundation은 Foundation은 CoreServices layer 내 위치한 프레임워크로 같은 계층에 속함
이렇게 이번 포스팅에서는 키 체인에 대해 알아보았습니다..!
아이폰이나 맥북 사용자라면 분명 키 체인을 적극 활용하고 있다고 생각합니다.
어렵고 복잡한 만큼 애플에서 제공하는 확실하고 안전한 민감 데이터 저장 방식임으로 꼭 능숙하게 사용할 수 있게
최선을 다해야겠습니다.
감사합니다앗!🙌
[참고자료]
-. 애플 공식 개발자 문서
https://developer.apple.com/documentation/security
https://developer.apple.com/documentation/security/keychain_services/keychain_items
https://developer.apple.com/documentation/security/keychain_services/keychains
-. 블로그
https://daeun28.github.io/ios사용법/post21/
https://kor45cw.tistory.com/285
https://velog.io/@cooo002/ios키체인Key-Chain
'iOS' 카테고리의 다른 글
의존성 관리도구 (0) 2021.02.18 CoreData (0) 2021.02.15 Collection View (0) 2021.01.25 Application Life Cycle (0) 2021.01.14 단위테스트와 TDD (0) 2020.12.15