KeychainItemWrapper 의 역할은 아이폰내 키체인에 보다 쉽게 계정을 저장하기 위한 wrapper이다.

사용 방법은 생각보다 간단한데 주의해야 할점은 초기화 할때 입력하는 identifier 값이 키체인의 영역을 구분하는 키 역할을 하는 부분인데

이때 입력되는 키체인의 속성에 따라 충돌이 발생되 오류가 나는 현상이 있다.

만약 한 앱에 2개 이상에 대한 패스워드를 키체인에 저장할 때는 반드시 주의해서 사용해야한다.

SAKeychainItemWrapper * item = [[SAKeychainItemWrapper alloc] initWithIdentifier:key accessGroup:nil];

    [item setObject:value forKey:(id)kSecValueData];

    [item release];



key : 키체인의 영역을 구분짓는 키
value : 저장되는 값

문제는 2개 이상의 계정에 대해 저장할 때 key 체인의 값이 계정에 따라 다르더라도 두번째 계정 비밀번호를 입력할 때 오류가 발생되었다.

(동일 아이템이 존재하여 입력이 안된단다)

분명 identifier 키가 다른데 왜 충돌이 날까? 그렇다고 중복된것이 있다면서 업데이트 역시 제대로 되지 않았다.

구글링을 한 결과 알아낸 사실은 kSecAttrAccount, kSecValueData 있었다.

wrapper를 사용하여 초기화할 때 kSecClassGenericPassword 속성이 들어가게 되는데 이 속성은

kSecAttrAccount가 유니크해야한다는 것이다. 이 사실을 모르고 아무리 비밀번호를 입력하니 오류가 발생된것이었다.

보통 아이디와 비밀번호 둘다 키체인에 저장하기 때문에 문제가 발생이 안되겠지만

현재 개발하는 프로젝트는 동일 아이디에 비밀번호가 다른 경우도 발생할수 있기 때문에 비밀번호만 키체인에 저장하려고 하니 문제가 발생한 것이었다

즉 해결하기 위해서 kSecAttrAccount 값에 패스워드의 identifier 값을 입력하므로써 각 계정간 유니크성을 유지하여 해결 할수 있었다.

SAKeychainItemWrapper * item = [[SAKeychainItemWrapper alloc] initWithIdentifier:key accessGroup:nil];
    [item setObject:key forKey:(id)kSecAttrAccount];
    [item setObject:value forKey:(id)kSecValueData];
    [item release];


참고 : http://useyourloaf.com/blog/2010/4/28/keychain-duplicate-item-when-adding-password.html

+ Recent posts