ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • KeyChain
    iOS 2021. 2. 1. 16:58

    안녕하세요. 그린입니다!

    이번 포스팅에서는 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 프레임워크 사용을 권장하고 있다.)

    Security Framework

    -. 보안 네트워크 통신 시 보안 프레임워크 기반으로 하는 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

    : 위의 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/keychain_items/using_the_keychain_to_manage_user_secrets

    https://developer.apple.com/documentation/security/keychain_services/keychain_items/adding_a_password_to_the_keychain

    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
Designed by Tistory.