티스토리 뷰

[ios] Keychain으로 안전하게 데이터 저장하기


안녕하세요. 오늘은 비밀번호를 포함한 사용자의 민감한 정보를 Keychain을 통해 안전하게 저장하는 방법을 알아보도록 하겠습니다. 기존의 포스팅들에서 데이터를 저장하기 위해 저는 UserDefaults를 사용했습니다. 하지만 UserDefaults는 단순한 데이터를 저장하는데는 문제가 없지만 민감한 비밀번호나, 인증서같은 정보들, 혹은 사용자가 생각하기에 본인만의 민감한 정보들을 저장하기에는 안전하지 않습니다.


그러므로 오늘은 Keychain이 무엇인지와 간단한 사용법을 알아보도록 하겠습니다.


Keychain이란?

민감한 데이터들을 안전하게 저장하는 것은 굉장히 복잡한 암호화 절차를 필요로 합니다. 하지만 이러한 알고리즘을 개발자들이 일일히 작성하기는 여간 까다롭고 어려운 것이 아닙니다. 그렇기 때문에 OS와 iOS에서는 Keychain이라는 서비스를 제공합니다.


Keychain은 하나의 암호화된 컨테이너이며 Keychain services API는 이처럼 민감한 데이터를 암호화하고 복호화하며 재사용하는 행위를 보다 쉽고 안전하게 사용할 수 있게끔 API를 제공합니다. 밑의 그림처럼 저장되는 단위를 Item이라 부릅니다.



기본적으로 디바이스를 잠그면(Lock) Keychain 역시 잠기고 디바이스를 풀면(Unlock) Keychain 역시 풀립니다. 이렇게 Keychain이 잠긴 상태에서는 Item들에 접근할 수도 복호화할 수도 없습니다. 또한 풀린 상태에서도 해당 Item을 생성하고 저장한 어플리케이션에서만 접근이 가능합니다.


하지만 지정된 그룹에 속한 어플리케이션끼리는 데이터에 접근할 수 있습니다.


Keychain Items

위에서 언급한 Item을 조금 더 알아보도록 하겠습니다. Item을 표현하는 그림은 다음과 같습니다.



공식 문서에선 Keychain Item을 다음과 같이 설명합니다.


민감한 정보를 저장할 때 해당 데이터를 Keychain Item으로 패키징합니다. 이렇게 패키징된 Item안에는 저장하려는 데이터뿐만 아니라 해당 데이터의 속성(Attributes)또한 같이 저장됩니다. 이 속성으로 데이터의 접근 가능성을 제어하고 해당 Item이 검색에 노출되게끔 공개적으로 보여주는 속성입니다. (해당 데이터의 특징과 속성을 보여주는 것이지 데이터에 접근하는 것은 접근 제어에 해당하는 프로세스만 접근 가능)


그리고 추후에 검증된 프로세스(같은 그룹이거나 해당 데이터를 저장한 어플리케이션)가 Item에 접근할 때 속성의 검색을 통해 해당 데이터를 찾고 접근할 수 있습니다.


Keychain Wrappers

기본적으로 제공되는 Keychain Services API도 존재하지만 이를 보다 편하고 안전하게 이용할 수 있게끔 해주는 라이브러리들이 존재합니다. 대표적인 라이브러리들은 다음과 같습니다.


  1. SwiftKeychainWrapper
  2. SAMKeychain - (Obj - C)
  3. LockSmith

그리고 저는 SwiftKeychainWrapper가 가장 사용하기에 괜찮았습니다. 간단한 사용법은 다음의 링크를 참조하시기 바랍니다.


Securing user data with Keychain for iOS


마무리

오늘은 이렇게 간단히 민감한 데이터를 안전하게 암호화하여 저장하고 사용할 수 있게 해주는 Keychain Service에 대해 알아보았습니다. 민감한 주제이기 때문에 해당 서비스를 사용하기 전에 반드시 완벽히 숙지를 한 후 사용하시기 바랍니다. 감사합니다.

 

Source : github


참고자료


  1. Securing user data with Keychain for iOS
  2. Keychain Services


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함