iOS & SwiftUI
SwiftUI에서 Face ID / Touch ID 인증 구현하기
Prof.SSong
2025. 6. 15. 19:26
728x90
반응형
프로젝트 맥락
본 글은 Apple Developer Academy_Challenge 2에서 개발 중인 ‘Re:ToU(오늘의 너)’ 앱을 기반으로 작성되었습니다.
Re:ToU는 개인적인 감정을 기록하는 민감한 앱이기 때문에, 앱 실행 시 타인의 접근을 방지할 수단이 필요했습니다.
이런 보안 요구에 따라 우리는 iOS가 기본 제공하는 Face ID / Touch ID 생체인증 시스템을 적용해 앱을 보호하고자 했습니다.
기능 설명
- 사용자가 앱을 실행했을 때, 얼굴 인식(Face ID) 또는 지문 인식(Touch ID)으로 본인 여부를 확인
- 인증에 성공하면 메인 뷰로 진입
- 인증에 실패하거나 취소하면 앱을 잠금 상태로 유지
- 설정 여부에 따라 인증 건너뛰기 허용도 가능
시도 동기
개인적인 회고 내용은 외부 노출되면 불편함을 줄 수 있기 때문에,
단순한 앱 잠금 화면 정도가 아닌 iOS 레벨의 강력한 인증 수단을 원했습니다.
Face ID는 이미 시스템 내에 탑재되어 있고 UX도 익숙하기 때문에,
자체 구현 없이 신뢰도 높은 인증을 쉽게 구현할 수 있다는 점이 큰 장점이었습니다.
구현 코드
1. LocalAuthentication 사용
import LocalAuthentication
func authenticateUser(completion: @escaping (Bool) -> Void) {
let context = LAContext()
var error: NSError?
// Face ID or Touch ID 가능 여부 확인
if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) {
let reason = "앱 잠금을 해제하려면 Face ID 또는 Touch ID를 사용하세요."
context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: reason) { success, _ in
DispatchQueue.main.async {
completion(success)
}
}
} else {
// Face ID 불가능한 경우에도 대비
DispatchQueue.main.async {
completion(false)
}
}
}
2. SwiftUI에서 인증 흐름 적용 예시
@State private var isAuthenticated = false
var body: some View {
Group {
if isAuthenticated {
MainView()
} else {
Text("인증 중...")
.onAppear {
authenticateUser { success in
isAuthenticated = success
}
}
}
}
}
문제 발견 & 해결
문제해결 방법
Face ID가 등록되어 있지 않은 경우 앱 접근 불가 | .canEvaluatePolicy로 사전 확인 |
인증 취소 시 앱이 멈춘 듯 보임 | 실패/취소 분기를 명확하게 처리하여 fallback UX 제공 |
시뮬레이터에서는 Face ID 작동 안 함 | 조건 분기와 대체 수단 필요 (예: 패스코드 인증, 임시 스킵) |
느낀 점
Face ID는 iOS에서 기본 제공하는 기능이기 때문에
복잡한 설정 없이도 강력한 보안 기능을 추가할 수 있는 훌륭한 선택지였습니다.
특히 회고 앱처럼 프라이버시가 중요한 서비스에 있어선
앱을 켜자마자 자동으로 인증하는 흐름만으로도 사용자에게 심리적 안정감을 줄 수 있었습니다.
Re:ToU의 민감한 사용자 데이터를 보다 안전하게 보호할 수 있도록 구성할 수 있었습니다.
이번 주제는 글이 조금 짧습니다. 확실한 공부를 하고 구현했다기 보다 공식 문서나 블로그의 구현을 따라했기에 조금 부족하네요..
이 부분은 앞으로도 조금 더 공부를하고 다시 작성하겠습니다.
728x90
반응형