본문 바로가기
아이폰 개발/Swift

swift keyChain 예제

by 인생여희 2021. 3. 23.

swift keyChain 예제

 

1.키체인에 값을 저장하는 메소드

 

2.키체인에 저장된 값을 읽어오는 메소드

 

3.키체인에 저장된 값을 삭제하는 메소드

 

4.키 체인안에 저장된 엑세스 토큰을 이용하여 헤더를 만들어주는 메소드

 

 

import Security
import Foundation
import UIKit

class TokenUtils{

    //키체인에 값을 저장하는 메소드
    func save(_ service : String , account:String , value:String) {
        
        //1.키체인 쿼리 생성
        let keyChainQuery : NSDictionary = [
            kSecClass : kSecClassGenericPassword,  //어떤 타입의 데이터를 저장할지?
            kSecAttrService : service,      //앱 번들 id
            kSecAttrAccount : account,      //사용자 계정
            kSecValueData: value.data(using: .utf8, allowLossyConversion: false)! //저장할 값
        ]
        
        //현재 저장되어 있는 값 삭제 - 기존의 값을 덮어 쓰지 못하기 때문에
        SecItemDelete(keyChainQuery)
        
        //새로운 키 체인 아이템 등록
        let status: OSStatus = SecItemAdd(keyChainQuery, nil)
        assert(status == noErr, "토큰값 저장에 실패했습니다.")
        NSLog("status = \(status)")
        
    }
    
    
    //키체인에 저장된 값을 읽어오는 메소드
    func load(_ service:String, account:String) -> String? {
        
        //1.키 체인 쿼리 정의
        let keyChainQuery :NSDictionary = [
            kSecClass : kSecClassGenericPassword,
            kSecAttrService : service,
            kSecAttrAccount : account,
            kSecReturnData : kCFBooleanTrue!,
            kSecMatchLimit : kSecMatchLimitOne
        ]
        
        //2.키 체인에 저장된 값을 읽어온다.
        var dataTypeRef : AnyObject?
        let status = SecItemCopyMatching(keyChainQuery, &dataTypeRef)
        
        //3.처리 결과가 성공이라면 읽어온 값을 Data 타입으로 변환하고, 다시 String 타입으로 변환한다.
        if (status == errSecSuccess) {
            let retrievedData = dataTypeRef as! Data
            let value = String(data: retrievedData, encoding: .utf8)
            return value
        }else{
            //4.처리결과가 실패라면 nil을 반환한다.
            print("Nothing was retrieved from the keychain. Status code \(status)")
            return nil
        }

    }

    //키체인에 저장된 값을 삭제하는 메소드
    func delete(_ service:String, account:String) {
        
        let keyChainQuery:NSDictionary = [
            kSecClass: kSecClassGenericPassword,
            kSecAttrService: service,
            kSecAttrAccount : account
        ]
        
        //현재 저장되어 있는 값 삭제
        let status = SecItemDelete(keyChainQuery)
        assert(status == noErr , "토큰값 삭제에 실패했습니다.")
        NSLog("status = \(status)")
        
    }
    
    //키 체인안에 저장된 엑세스 토큰을 이용하여 헤더를 만들어주는 메소드
    func getAuthorizationHeader() -> NSDictionary? {
        
        let serviceID = "k.LoginTest"
        
        if let accessToken = self.load(serviceID, account: "accessToken"){
            return ["Authorization" : "Bearer \(accessToken)"]
        }else{
            return nil
        }
    }
}

 

 

 

참고

https://adora-y.tistory.com/entry/iOS-KeyChain%EC%9D%B4%EB%9E%80-Swift%EC%BD%94%EB%93%9C%EB%A5%BC-%ED%86%B5%ED%95%B4-%EC%82%B4%ED%8E%B4%EB%B3%B4%EA%B8%B0

https://blog.naver.com/go4693/221430028097

꼼꼼한 재은씨의 스위프트 실전편 참고