Archive/꼼꼼한 재은씨 시리즈

[iOS14] Touch ID 사용법

lgvv 2021. 4. 24. 02:12

터치 아이디는 iOS가 제공하는 인증 방식으로 아이디 패스워드 입력을 통해 처리되던 로컬 인증을 지문 인식만으로 대신할 수 있도록 만들어진 기능

iOS7부터 일부 자체앱을 통해 기능을 공개하기 시작하여, 특히 앱스토어나 아이클라우드 등에서는 최초 1회만 아이디/패스워드로 로그인 하고 나면 이후 부터는 터치 아이디를 통해 인증할 수 있게 되었다.

iOS8부터는 일반 앱에서도 터치 아이디 API를 이용한 로컬 인증 기능을 사용할 수 있게 되었다.

 

터치 아이디의 API는 LocalAuthentication이라는 프레임워크를 통해 제공된다.

이 프레임워크는 우리가 지문 인식에서 흔히 보게 되는, 아이폰 버튼에 손가락 대고 스캔하기에 대한 기본 화면을 제공할 뿐만 아니라 지문 인식이 실패하거나 사용자가 이 기능을 사용하지 않을 경우 로그인 창과 같은 별도의 인증 기능으로 연결되도록 처리하는 기능도 제공한다.

또한 인증이 필요한 이유를 메시지로 출력할 수 있게도 해준다.

 

터치 아이디를 통한 인증이 실패하는 경우는 생각보다 많기 때문에 LocalAuthentication 프레임워크는 터치 아이디의 오류 타입을 LAError.Code 열거형으로 제공하여 개발자가 각 경우에 적절한 조치를 취할 수 있도록 지원

 

LAError.Code의 구조

enum LAError.Code : Int {
	case authenticationFailed
    case userCancel
    case userFallback
    case systemCancel
    case passcodeNotSet
    case touchIDNotAvailable
    case touchIDNotEnrolled 
    ... 이하 생략 ...
}

주요 항목의 의미를 간단히 알아보자면

    case authenticationFailed : 사용자가 등록되지 않은 지문을 사용하는 등, 올바른 인증 정보를 제공하지 않았을 때 발생한다
    case userCancel : 사용자가 의도적으로 인증 프로세스를 취소했을 때 발생한다
    case userFallback : 사용자가 의도적으로 인증 프로세스를 사용하지 않고 별도의 자격 증명 방식으로 돌아가고자 할 경우에 발생한다
    case systemCancel : 다른 응용 프로그램이 활성화되어 시스템이 강제로 인증 프로세스를 중지했을 때 발생한다
    case passcodeNotSet : 스마트폰 기기에서 사용자가 암호를 설정하지 않은 경우에 발생한다.
    case touchIDNotAvailable : 스마트폰 기기가 터치 아이디를 지원하지 않는 경우에 발생한다.
    case touchIDNotEnrolled  : 터치 아이디가 지원되지만 등록된 지문이 없을 경우에 발생한다. 다만, 이 값은 iOS11부터는 biometryNotEnrolled로 대체된다.

 

import LocalAuthentication // 로컬인증 프레임워크 반입

let context = LAContext() // 인증 컨텍스트를 정의. 인증에 관한 종합 정보 관리하는 객체임

// 오류 코드를 처리할 변수와 터치 아이디 인증창에 들어갈 메시지 정의
var error: NSError?  // 오류가 없을 수도 있어서 옵셔널 타입이어야 한다.
let msg = "로그인을 위해 인증이 필요합니다"

/* 다음으로 할 일은 canEvaluatePolicy 메소드를 호출하여, 터치 아이디 인증을 사용할 수 있는지 프레임워크에 
문의하는 것
파라미터 1 : LAPolicy 라는 열거형 객체의 속성으로 다음과 같은 다중 조건이 모두 만족되는지 체크
 - 해당기기가 터치 아이디 인증을 지원하는가?
 - 해당 기기 설정에서 터치 아이디가 허용되어 있는가?
 - 패스 코드가 설정되어 있는가?
 - 최소한 하나 이상의 지문이 등록되어 있는가?
 이중 하나라도 만족못하면 false를 반환한다. 
 이 경우 파라미터2로 오류 코드가 전달되므로 이를 분석하여 오류의 원인을 확인하고 그에 맞는 처리.
 
 만약 true를 반환하면 이들 인증 정책을 모두 적용할 수 있다는 뜻이므로 evaluatePolicy 메소드가 사용된다.
 evaluatePolicy 메소드는 인자값 3개가 사용된다.
 파라미터 1 : 방금 전에 사용했던 인증 정책 조건
 파라미터 2 : 인증창에 표시될 인증 사유 메시지
 파라미터 3 : 완료 처리 클로저로 성공 여부에 대한 Bool 타입의 인자값과 오류 원인이 기록될
 NSError 타입의 인자값이 함께 전달된다.
 실질적으로 인증 후의 처리 로직은 모두 완료 클로저 내부에 구현된다.
 
 실패할 경우에서 주의깊게 봐야하는데 _code 속성의 값이 정수형이라는 것인데
 enum으로 정의되어 있어서 rawValue를 사용하면 정수로 값을 변환한 후에 비교해야 한다.
 또한 UI변경이 필요한 오류 처리의 경우에는 OperationQueue.main 블록을 사용하여 메인 스레드에서 실행될 수 
 있도록 처리해주는 것도 잊지 말자.
 혹시 이와 유사한 DispatchQueue.main 블록을 사용해도 된다.
 
 if context.canEvaluatePolicy() 조건을 통과하지 못한 오류들은 
 else 블록을 통해 처리해 주어야 한다.
 터치 아이디를 지원하지 않는 기기거나 지원하더라도 지문이 등록되어 있지 않거나 등등
 이때에는 오류가 무엇이든 간에 사용자가 아이디와 패스워드를 입력할 수 있도록 화면을 전환해 주는것이 적절하다.
 
*/

if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error){
	context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics,
    							localizedReason : msg , 
                                reply: {(success, e) in
                                	if success {
                                    // 성공에 대한 처리
                                    } else {
                                    // 실패에 대한 처리
                                    	print(e!.localizedDescription)
                                    	switch (e!._code) {
                                        case LAError.systemCancel.rawValue :
                                        	print("시스템에러")
                                            ... 다른 케이스는 생략 ...
                                    }
                                
                                })
}

 

... 주석을 꼭 참고하기 바란다 터치 아이디의 개념이 생각보다 체계적이고 이해하기가 쉽다.!!!

 

크게 보면 터치 아이디 인증과 관련된 오류 항목은 두개로 나눌 수 있는데

하나는 인증창이 아예 실행되지 못하는 상태와 관련된 오류

다른 하나는 인증창은 실행되었지만 그 과정에서 다양한 상황으로 인해 인증이 실패한 경우

 

전자의 경우는 오류 내용에 상관없이 인증을 대신할 수 있는 기능을 띄워주는 것이 적절한 반면

후자의 경우에는 케이스별로 따져서 어떻게 처리하는 것이 적절한가를 고민해야 한다.

 

 

** 키체인 & 로컬인증 

iOS에서는 로컬 인증만으로 열 수 있는 키 체인 저장 속성을 제공.

이를 이용하면 위 코드를 구현하지 않고도 리프레시 토큰을 읽어오기 위해 자동으로 로컬 인증을 사용할 수 있음.

앞서의 로컬 인증이 범용적으로 사용할 수 있는 방식이라면, 키 체인 연동 로컬 인증은 키 체인만을 위해 최적화된 형태의 로컬 인증이라고 할 수 있음,

키 체인 연동 로컬 인증은 키 체인에 값을 저장 시 로컬 인증 속성을 설정하는 것에서 시작

 

 

 

우선은 터치 아이디만 하고 터치 아이디를 완성한 후에 페이스 아이디도 정복해보도록 하자~!