->
이번 프로젝트에서 로그인 후 인증 처리를 과정에서 전달받은 토큰을 관리해야했다. 어떻게할까 고민을 하던중 키체인에 대해서 알게되었고 이를 이 포스팅에 정리할려고한다.
->
인증토큰을 어디에 보관해야할까 고민을 할 때 가장 먼저 떠오는것은 UserDefault이다. 저장도 쉽고 불러오기도 쉬우니 이만한 것이 없다고 판단했다.
그렇지만 이 UserDefault에는 아래와 같은 단점들이 존재한다.
- 기기를 도난 당하면 그냥 끝장난다(저장된 토큰을 이용해서 개인정보를 손쉽게 가져가게된다....)
- 토큰이 평문이 아닌 암호화하여 저장하면 할 수 도 있지만 이것을 부수적인 작업이 필요해서 귀찮다.
그러나 이 키체인을 사용하면 이 모든 단점을 커버할 수 있다.
키체인은 애플 계셜 운영체제에서 동작하는 다양한 응용프로그램의 비밀번호나 계정등 보안에 필요한 요소를 저장하는데 사용되는 암호화된 저장소이다. 키체인은 잠글 수 있어서 한번 잠기면 풀기전까지는 접근하지 못하지만, ios에서는 기기의 잠금이 해제되는 순간 키 체인의 잠금도 함께 해제된다.
ex) 아이클라우드의 로그인 정보관리, 와이파이의 패스워드 관리, 사파리에서 웹사이트별 패스워드 관리
이러한 클라우드의 특징은 아래와 같다.
- 기본적으로 애플리케이션은 자기 자신의 키체인에만 접근할 수 있다.
- ios에서 키체인의 위치는 샌드박스 외부이므로 앱을 삭제해도 키체인에 저장된 정보는 삭제되지 않는다.
- 키체인 그룹을 사용하여 서로 다른 앱에서도 저장된 데이터를 공유할 수 있다.
- 비밀번호나 개인키와 같이 보호가 필요한 항목은 암호화되어 키체인에 저장된다.
#샌드박스??
샌드박스란 미국에소 어린아이를 보호하기위해 모래통에서만 놀도록 하는데서 유래한 보안 모델을 말한다.
ios system의 sandbox는 기본적으로 앱 마다 별도의 파일을 생성하여 공유되지 않도록 하고 외부로부터 들어온 접근에 대해 보호되는 영역으로 시스템이 부정적으로 조작되는 것을 막는 보안 형태를 이야기한다.
- 단순히 파일 시스템에 저장된 데이터베이스이다.
- macOS에서는 단순히 애플리케이션이 원하는 만큼 키체인을 만들 수 있다.
- ios에서는 모든 앱에서 사용할 수 있는 하나의 키체인만을 제공한다.
- 아이클라우드 계정에 로그인하게 되면 시스템은 아이클라우드 용 계정을 따로 제공한다.(그래서 동일한 계정의 로그인된 애플 기기에서 계정이 동기회되는 것이다.)
키체인을 구성하는 요소는 총 3개로 나눌수 있다.
- 키 체인 아이템
키 체인에 저장되는 데이터로, 키 체인은 여러 개의 키 체인 아이템을 가질 수 있다.- 아이템 클래스
키 체인 아이템에 저장되는 테이터의 종류를 지정할 수 있다. 대표적으로 인터넷용 아이디/패스워드르 저장할 때 사용하는 kSecClassInernetPassword, 인증서를 저장할 때 사용하느 kSecClassCertificate, 일반 비밀번호를 저장할 때 사용하느 kSecClassGenericPassword등이 있다.- 어트리뷰트
아이템 클래스에 대한 속성을 저장한다.
애플 문서를 보면 아래와 같이 각 아이템 클래스별로 다양한 어트리뷰트가 존재한다.
만약 여러개의 계정을 가질 수 있는 서비스에서 각 계정에 대한 토큰을 관리해한다고 하면 아이템 클래스는 kSecClassGenericPassword를 사용하고 필요한 어트리뷰들을 설정해주면된다.
여러 어트리뷰트들 중에서도 인증토큰을 관리할 때 핵심이 되는 어트뷰트들이 있다. 어떤 앱에서 사용되는 토큰인지를 표시하는 kSecAttrService, 어떤 사용자의 인증토큰인지를 식별한데 사용하는 kdSecAttrAccount등이있다.
만약 위와 같은 방식으로 keyChain을 구성하면 완성되 키체인의 구성은 다음과 같다.
키 체인 아이템:
토큰값을 저장
아이템 클래스:
kSecClassGenericPassword
어트리뷰트:
kSecAttrService = con.handUP
kdSecAttrAccount = ynwa3690@gmail.com
일단 기본적인 설명은 여기까지하고 이후 사용법과 관련된 내용은 실제 프로젝트에서 키체인을 이용해서 인증토큰을 다룰 때 또 정리할 예정이다.