키체인 간단 사용법

업데이트:

키체인에 대해 알아보고, 구현해보는 글입니다

Keychain Service

Securely store small chunks of data on behalf of the user.

사용자를 대신하여 작은 데이터 덩어리를 안전하게 저장하는 서비스

컴퓨터 사용자들은 종종 안전하게 저장이 필요한 작은 비밀을 가지고 있습니다. 예를 들어 많은 사람들은 많은 온라인 계정을 관리합니다. 각 계정에 대해 복잡하고 고유한 암호를 기억하는 것은 불가능하지만 그것들을 적어 두는 것은 불안하고 귀찮습니다. 사용자들은 일반적으로 많은 계정에서 간단한 비밀번호를 재활용함으로써 이러한 상황을 해결하는데 이 또한 안전한 방법이 아닙니다.

키체인 서비스 API는 키체인이라고 불리는 암호화된 데이터베이스에 사용자 정보의 작은 비트을 저장할 수 있는 메커니즘을 제공함으로써 이 문제를 해결 할 수 있도록 도와줍니다. 암호를 안전하게 저장하면, 사용자는 복잡한 암호를 선택할 수 있습니다.

키체인은 비밀번호에 국한되어 있지 않습니다. 사용자가 걱정하는 신용카드 정보나 작은 메모같은 다른 정보도 저장할 수 있습니다. 또한 사용자에게 필요하지만, 알 필요가 없는 정보를 저장할 수도 있습니다. 예를들어 Certificate, Key, and Trust Services로 관리하는 암호키, 인증서는 사용자가 안전하게 통신할 수 있도록 하고, 다른 유저나 기기와의 신뢰를 보장할 수 있도록 합니다.

키체인은 운영체제에 따라 다르게 작동합니다. iOS는 iCloud 키체인을 포함하는 단일 키체인에 접근합니다. 앱은 자신의 item이나 자신이 속한 그룹에서 공유하는 항목에만 접근할 수 있습니다. 반면, macOS는 여러개의 키체인을 지원합니다. 일반적으로 애플이 제공하는 Keychain Access(키체인 접근) 앱에서 키체인을 관리하고 직접 조작할 수 있습니다.

키체인을 사용하는 이유

UserDefaults에 저장하면 쉬운데 왜 키체인을 사용해야 할까요? UserDefault에 저장되는 정보들은 모두 base64 인코딩되어 plist형식으로 저장됩니다. 이렇게 저장된 정보를 복구하는 것은 해커에게 누워서 떡먹기겠죠. 게다가 UserDefaults는 앱이 삭제됨과 동시에 정보가 삭제되지만 키체인은 정보를 직접 삭제하기전까지 삭제되지 않습니다. 따라서 보안이 필요하거나 앱이 삭제되어도 유지가 필요한 정보는 키체인을 사용하는 것이 적절합니다.

구현해보기

키체인에 정보를 저장할 때는 키체인 아이템으로 패키징해야합니다. 키체인 아이템은 정보속성으로 구성됩니다. 키체인 서비스 API는 아이템을 삽입하기 전에 정보를 암호화하고 속성과 함께 패키징합니다. 정보는 말그대로 저장하고자 하는 정보이고, 속성을 사용해 정보를 식별하고 저장하거나 저장된 항목에 대한 접근을 제어합니다.

구현을 위해서는 Security프레임워크가 필요합니다. 키체인 아이템은 모두 CFDictionary를 사용해 접근할 수 있습니다.

User는 구조체로 Codable을 채택합니다. 구조체에 사용자의 이름, 비밀번호, 토큰을 모두 포함하고 있기 때문에 kSecAttrAccount키의 값으로 서비스 이름을 저장합니다. 계정과 비밀번호만 저장할때는 원래대로 사용자의 이름(아이디)를 저장해주면 됩니다.

속성

  • kSecClass: 키체인 아이템의 타입
    • kSecClassGenericPassword
    • kSecClassInternetPassword
    • kSecClassCertificate
    • kSecClassKey
    • kSecClassIdentity
  • kSecAttrService: 키체인 아이템과 연관되어 있는 서비스의 이름
    • kSecClassGenericPassword 타입에서 사용
  • kSecAttrAccount: 저장할 아이템의 계정 이름(아이디)
    • kSecClassGenericPassword, kSecClassInternetPassword 타입에서 사용
  • kSecAttrGeneric: 저장할 아이템의 데이터(비밀번호)
    • kSecClassGenericPassword 타입에서 사용
  • kSecMatchLimit: 키의 값을 저장할 경우, 이 값은 반환하거나 다른 조치를 취할 최대 결과 수를 지정
    • kSecMatchLimitOne
    • kSecMatchLimitAll
  • kSecReturnAttributes: 키의 값으로 true를 저장할 경우, CFDictionary 타입으로 반환
  • kSecReturnData: 키의 값으로 true를 저장할 경우, CFData 타입으로 반환

생성

SecItemAdd(_:_:) 함수를 사용해 키체인 아이템을 생성하고 성공했을 때 true를 반환합니다.

조회

SecItemCopyMatching(_:_:)함수를 사용해 키체인 아이템을 조회하여 성공했을 때 User를 반환합니다.

수정

SecItemUpdate(_:_:)함수를 사용해 키체인 아이템을 수정하고 성공했을 때 true를 반환합니다.

삭제

SecItemDelete(_:)함수를 사용해 키체인 아이템을 삭제하고 성공했을 때 true를 반환합니다.

전체 코드

출처

애플 공식 개발자 문서

https://kor45cw.tistory.com/285

댓글남기기