[iOS] 안전한 데이터 저장, Keychain 사용하기
이번 포스트에서는 Keychain을 사용하여 안전하게 데이터를 저장하고 불러오는 방법에 대해 살펴보고자 합니다.
Keychain은 디바이스 안에 암호화된 데이터 저장 공간을 의미합니다. 사용자는 암호화된 공간에 데이터를 안전하게 보관할 수 있습니다.
Keychain에 저장할 수 있는 데이터는 다양한 데이터가 포함될 수 있습니다.
사용자 계정 정보를 비롯하여 결제 지불 정보, 사용자 개인 정보 등 민감한 데이터를 모두 저장할 수 있습니다.
현재까지 Keychain 영역이 외부 침입자에 의해 뚫렸다는 소식이 없었을 만큼 안전한 공간입니다.
Keychain Service는 Keychain Service API를 통해 데이터를 암호화할 후 Keychain에 저장하게 됩니다. 아래 그림을 살펴보면 이해에 도움이 될 수 있습니다.
Keychain Item Class로는 아래와 같이 5가지가 존재합니다. 저장하려는 모든 데이터에 적합하도록 클래스가 구성되어 있지는 않지만 우리는 여기서 가장 관련있는 값을 선택하여 구현할 수 있습니다.
- kSecClassGenericPassword
- kSecClassInternetPassword
- kSecClassCertificate
- kSecClassIdentity
- kSecClassKey
이번 포스트에서는 kSecClassInternetPassword라는 Keychain Item Class를 사용하여 사용자 계정 정보를 처리하는 과정에 대해 살펴보도록 하겠습니다.
아래 코드는 간단하게 Keychain에 사용자 계정 로그인 정보를 저장하는 코드입니다.
let keychainItem = [
kSecValueData: "Password".data(using: .utf8)!,
kSecAttrAccount: "UserId",
kSecAttrServer: "test.com",
kSecClass: kSecClassInternetPassword
] as CFDictionary
let status = SecItemAdd(keychainItem, nil)
print("Operation finished with status: \(status)")
- kSecValueData : 비밀번호 정보
- kSecAttrAccount : 계정 ID 정보
- kSecAttrServer : 접속하려는 서버 정보
- kSecClass : Keychain Item Class
자, 그럼 이렇게 저장한 계정 정보를 어떻게 불러올 수 있을까요?
우선 Data를 Retrieve 할 수 있도록 query 프로퍼티를 정의해줍니다.
let query = [
kSecClass: kSecClassInternetPassword,
kSecAttrServer: "test.com",
kSecReturnAttributes: true,
kSecReturnData: true
] as CFDictionary
kSecAttrServer에 계정 정보를 불러올 서버 정보를 넣고 kSecReturnAttributes와 kSecReturnData에 true를 리턴시켜 값을 불러올 수 있도록 구성해줍니다.
그 다음 정의한 query에 맞는 결과를 SecItemCopyMatching함수를 통해 result로 값을 받아옵니다.
var result: AnyObject?
let status = SecItemCopyMatching(query, &result)
print("Operation finished with status: \(status)")
let dic = result as! NSDictionary
let username = dic[kSecAttrAccount] ?? ""
let passwordData = dic[kSecValueData] as! Data
let password = String(data: passwordData, encoding: .utf8)!
print("Username: \(username)")
print("Password: \(password)")
결과 값은 Dictionary이기 때문에 kSec 키 값을 이용하여 정보를 불러올 수 있는데, kSecAttrAccount, kSecValueData를 통해 계정 이름과 패스워드 정보를 가져올 수 있습니다.
위 코드를 실행하면 아래와 같은 화면을 볼 수 있습니다.
올바른 값을 받아온 것을 확인할 수 있습니다.
이번 포스트에서는 iOS의 안전한 데이터 저장 공간인 Keychain에 정보를 저장하고 불러오는 방법에 대해 간단하게 살펴보았습니다.