Frontend/iOS

[iOS] 안전한 데이터 저장, Keychain 사용하기

데니 Denny 2020. 8. 17. 21:27
반응형
SMALL

이번 포스트에서는 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에 정보를 저장하고 불러오는 방법에 대해 간단하게 살펴보았습니다.

반응형
LIST