생체 인증
Face ID와 Touch ID로 사용자를 인증합니다.
생체 인증은(는) CoddyKit의 무료 Swift Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Swift Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
LocalAuthentication을 사용한 생체 인식
얼굴 인식과 지문 인식을 사용하면 사용자가 암호를 입력하지 않고도 본인임을 증명할 수 있습니다. LocalAuthentication 프레임워크는 인증 정책을 평가하고 사용자가 인증을 통과했는지 알려 주는 LAContext를 통해 이 기능을 제공합니다.
import LocalAuthentication
let context = LAContext()
// One LAContext object drives a single auth attempt먼저 사용 가능 여부 확인하기
인증을 요청하기 전에 항상 canEvaluatePolicy를 호출하십시오. 기기에 생체 인식 하드웨어가 없거나, 사용자가 생체 인식을 등록하지 않았거나, 생체 인식이 잠겨 있을 수 있습니다. 실패하면 실패 이유를 설명하는 오류와 함께 불리언 값을 반환합니다.
import LocalAuthentication
func canUseBiometrics() -> Bool {
let context = LAContext()
var error: NSError?
return context.canEvaluatePolicy(
.deviceOwnerAuthenticationWithBiometrics,
error: &error)
}두 가지 정책
.deviceOwnerAuthenticationWithBiometrics는 암호 대체 없이 얼굴 인식 또는 지문 인식을 요구합니다. .deviceOwnerAuthentication은 먼저 생체 인식을 시도하고 기기 암호로 대체합니다. 암호 대체를 허용할 수 있는지에 따라 선택하십시오.
import LocalAuthentication
// Biometrics only (no passcode fallback):
let strict = LAPolicy.deviceOwnerAuthenticationWithBiometrics
// Biometrics with passcode fallback:
let lenient = LAPolicy.deviceOwnerAuthentication
_ = (strict, lenient)정책 평가하기
evaluatePolicy는 시스템 생체 인식 화면을 표시하여 인증을 수행합니다. localizedReason 문자열은 사용자에게 인증을 요청하는 이유를 설명합니다. 비동기 형식은 불리언 값을 반환하거나 오류를 발생시킵니다.
import LocalAuthentication
func authenticate() async -> Bool {
let context = LAContext()
do {
return try await context.evaluatePolicy(
.deviceOwnerAuthentication,
localizedReason:
String(localized: "Unlock your account"))
} catch {
return false
}
}생체 인식 유형 감지하기
canEvaluatePolicy를 호출한 후 context.biometryType은 기기가 .faceID, .touchID, .opticID 또는 .none 중 무엇을 사용하는지 알려 줍니다. 이를 사용하여 자체 사용자 인터페이스에 올바른 아이콘과 문구를 표시하십시오.
import LocalAuthentication
func biometryLabel() -> String {
let context = LAContext()
_ = context.canEvaluatePolicy(
.deviceOwnerAuthenticationWithBiometrics, error: nil)
switch context.biometryType {
case .faceID: return "Face ID"
case .touchID: return "Touch ID"
case .opticID: return "Optic ID"
default: return "Passcode"
}
}오류 처리하기
실패는 LAError 코드로 전달됩니다. .userCancel은 사용자가 취소한 경우이고, .userFallback은 사용자가 암호를 선택한 경우이며, .biometryLockout은 너무 많이 실패한 후 생체 인식이 잠긴 경우이고, .biometryNotEnrolled는 생체 인식이 등록되지 않은 경우입니다. 이러한 경우를 구분하여 일반적인 실패 메시지 대신 유용한 안내를 제공하십시오.
import LocalAuthentication
func describe(_ error: Error) -> String {
guard let la = error as? LAError else { return "failed" }
switch la.code {
case .userCancel: return "cancelled"
case .biometryLockout: return "locked out"
case .biometryNotEnrolled: return "not set up"
default: return "failed"
}
}얼굴 인식 사용 설명 문자열
얼굴 인식을 사용하려면 Info.plist에 이유를 설명하는 NSFaceIDUsageDescription을 추가해야 합니다. 이를 생략하면 얼굴 인식 정책을 처음 평가할 때 앱이 충돌합니다. 지문 인식에는 이러한 키가 필요하지 않습니다.
// Info.plist:
// NSFaceIDUsageDescription =
// "We use Face ID to unlock your saved passwords."
let required = "NSFaceIDUsageDescription is mandatory"
_ = required인증 화면 맞춤 설정하기
인증 요청 화면을 맞춤 설정할 수 있습니다. localizedCancelTitle은 취소 버튼의 이름을 바꾸고, localizedFallbackTitle은 대체 옵션을 설정하거나 빈 값일 때 숨깁니다. 대체 제목을 빈 값으로 설정하면 암호 옵션이 숨겨집니다.
import LocalAuthentication
func configured() -> LAContext {
let context = LAContext()
context.localizedCancelTitle =
String(localized: "Not now")
context.localizedFallbackTitle = "" // hide fallback
return context
}성공한 인증 재사용하기
기본적으로 각 evaluatePolicy 호출은 다시 인증을 요청합니다. touchIDAuthenticationAllowableReuseDuration을 설정하면 최근에 성공한 잠금 해제로 이후 확인을 충족하여 새 인증 요청을 생략할 수 있습니다. 짧은 시간 안에 여러 민감한 작업을 묶어서 수행할 때 유용합니다.
import LocalAuthentication
func reusableContext() -> LAContext {
let context = LAContext()
context.touchIDAuthenticationAllowableReuseDuration = 30
return context
}생체 인식과 키체인 접근 제한 비교하기
LAContext는 사용자를 확인하지만 그 자체로 데이터를 보호하지는 않습니다. 실제 보안을 위해 키체인의 SecAccessControl과 함께 사용하십시오. 그러면 인증이 성공할 때까지 비밀을 암호학적으로 읽을 수 없게 만들 수 있으며, 단순히 확인된 불리언 값 뒤에 숨기는 것에 그치지 않습니다.
import LocalAuthentication
// A bare evaluatePolicy == true is bypassable if your
// logic is tampered with. Prefer SecAccessControl so
// the data is encrypted until auth succeeds.
let pairing = "combine LAContext with Keychain ACL"
_ = pairing완전한 잠금 해제 흐름
사용 가능 여부 확인, 유형에 맞는 메시지 표시, 평가 및 오류 처리를 사용자 인터페이스에서 호출할 수 있는 견고한 하나의 절차로 결합하십시오.
import LocalAuthentication
func unlock() async -> Bool {
let context = LAContext()
var err: NSError?
guard context.canEvaluatePolicy(
.deviceOwnerAuthentication, error: &err) else {
return false
}
return (try? await context.evaluatePolicy(
.deviceOwnerAuthentication,
localizedReason:
String(localized: "Access your vault"))) ?? false
}빠른 확인
두 가지 주요 정책의 차이를 떠올려 보십시오.
복습
생체 인식 인증을 배웠습니다:
LAContext를 사용하고evaluatePolicy를 호출하기 전에canEvaluatePolicy를 호출합니다..deviceOwnerAuthenticationWithBiometrics는 생체 인식만 사용하고,.deviceOwnerAuthentication은 암호 대체를 추가합니다.- 올바른 문구를 표시하려면
biometryType을 읽고,.biometryLockout과 같은LAError코드를 처리합니다. NSFaceIDUsageDescription을 추가하고, 실제 보호를 위해 키체인의SecAccessControl과 함께 사용합니다.
자주 묻는 질문
“생체 인증” 강의는 무료인가요?
네 — “생체 인증” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Swift Academy 강의 전체를 잠금 해제할 수 있습니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“생체 인증”에서 뭘 배우나요?
Face ID와 Touch ID로 사용자를 인증합니다. 브라우저에서 직접 실행하는 실습 코드로 Swift Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Swift Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Swift Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“생체 인증” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Swift Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Swift Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.