앱에서는 가끔 비밀번호와 같은 sensitive user data 를 관리해야 할 때가 있다 이런 경우 암호화 하지 않으면, 유출 될 위험성이 있다
항상 유저에게 비밀번호를 입력하라고 하면 User Experience 가 저하되는 문제도 있다
Keychain Service 는 암호화 된 저장소를 제공함으로써 이런 문제에 대한 쉬운 해결책을 제시한다

인터넷 비밀번호를 저장하기 위해 Keychain 을 사용하는 과정
앱에서 처음으로 유저의 credential 이 필요할 때 만큼은 유저가 직접 암호를 입력해야 한다 이 때 다이어그램의 오른쪽 플로우를 따르게 된다
유저가 정상적으로 동작하는 credential 을 추가한다면,
앱에서는 SecItemAdd(_: _: ) 함수를 통해 저장한다
그리고는 정상적으로 동작하다가, 서버에서 재인증을 필요로 하게 되면, 앱에서 credential 을 keychain 으로부터 불러와서 인증한다
Adding a Password to the Keychain
가장 흔한 유저 흐름은 다이어그램의 가운데 부분이다
정상적이고 보안이 잘 지켜져있다면, 앱을 사용한지 오래 된 경우 재인증을 필요로 하는 등의 재인증을 필요로 해야한다
앱에서는 비밀번호에 대한 keychain 을 갖고 있는지 확인하기 위해 SecItemCopyMatching(_: _: )
함수를 실행한다
앱에서 해당하는 keychain 을 찾는다면, 유저가 개입할 일 없이 정상적으로 동작한다
가끔 유저는 앱의 권한 바깥에서 credential 을 바꾸는 경우도 있는데, 이런 경우에는 앱에서 기한이 지나 인증되지 않는 비밀번호를 찾게 된다
다이어그램의 왼쪽 부분인데, 이런 경우에는 SecItemUpdate(_: _: ) 함수를 실행하여
저장되어 있는 값을 바꿔 주어야 한다
유저가 아예 서비스와의 연결을 끊으려고 하는 경우도 생기는데,
이런 경우에는 앱에서 해당되는 credential 들을 SecItemDelete(_: ) 를 통해 잊어야 한다