Skip to content

Comments

[Feat] 생체 인증을 통한 앱 잠금 기능#174

Open
maxminseok wants to merge 7 commits intodevfrom
feature/biometric-auth
Open

[Feat] 생체 인증을 통한 앱 잠금 기능#174
maxminseok wants to merge 7 commits intodevfrom
feature/biometric-auth

Conversation

@maxminseok
Copy link
Collaborator

@maxminseok maxminseok commented Mar 6, 2025

1. 요약

  • 생체인증을 통한 앱 잠금을 추가하였습니다.

2. 스크린샷

앱 잠금 토글 추가

이미지1
  • 설정 화면에 앱 잠금 토글을 추가했습니다.

앱 잠금 활성화

이미지1 이미지2 이미지3
앱 잠금 스위치 처음 켤 때 권한 요청 생체 인증 실패시 실패 alert 생체 인증 성공시 활성화 alert

앱 잠금 활성화 후 앱 실행시 동작

이미지1
  • 생체 인증 실패시 재시도 alert이 나오도록 하였고, 취소하면 아무 동작도 하지 않습니다.

3. 공유사항

1. 생체 인증을 위해 LocalAuthentication을 import하고, BiometricAuthManager로 객체화

  • LocalAuthentication의 evaluatePolicy라는 메서드를 통해 로컬 인증 정책(Face ID 또는 Touch ID 등)을 평가하여 생체 인증이나 암호 인증을 진행 할 수 있습니다.
context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: reason) { success, error in
...
}
  • BiometricAuthManager로 객체화 한 이유는 SettingViewController와 LockViewController(앱 잠금 활성화 후 앱 실행시 맨 처음 동작할 뷰컨트롤러) 2군데에서 사용되어야 하고, ViewController로부터 생체 인증을 위한 코드를 분리하여 객체 지향 코드를 작성하고 싶었기 때문입니다.

2. 권한 요청에 대한 부분

  • 권한 요청의 경우 Face ID 기기에서만 진행됩니다. Touch ID의 경우 기기에서 Touch ID가 활성화 되어 있다면 별도의 권한 요청 없이 생체 인증 진행이 가능합니다.
  • 권한 요청의 경우, 위에서 이야기했던 evaluatePolicy를 통해 진행되는데, 처음 동작 할 경우 iOS가 알아서 info.plist에 추가한 권한요청 메세지를 띄워 권한 요청을 진행하고, 권한 요청이 진행된 적 있는 경우 같은 메서드로 알아서 인증 진행까지 수행합니다.
  • 따라서 권한을 요청하는 것, 권한이 거부되거나 허가 되었을 때의 분기처리 등을 컨트롤 할 수 없었고, 하나의 메서드로 한 번에 알아서 권한 요청과 생체 인증이 진행되는 바람에 고민이 길었습니다.
  • 결과적으로 메서드를 쓰는 건 그대로이고, LAError 라는 로컬 인증 정책의 에러를 통해 분기 처리를 시도했습니다.
if let laError = error as? LAError {
 switch laError.code {
  case .biometryNotAvailable:
  case 
  ...
  }
}
  • 에러와 alert을 통해 간접적으로나마 권한 허용이나 생체 인증 동작의 분기 처리를 시도했고, 저 혼자 테스트 했을 땐 문제 없어 보였는데 팀원분들이 좀 더 다양하게 테스트 해주시면 감사하겠습니다..!!🙇

3. 암호 인증

암호입력

  • 생체 인증이 2번 실패하고 나면, 위와 같은 [취소|암호 입력] 이 쓰여 있는 Alert이 자동으로 나오는데, 이 부분에 대해서도 고민이 많았습니다.
  • 우선 암호 인증이 굳이 필요한가도 고민이었고, 암호 인증을 쓰지 않더라도 '암호 입력' Alert이 자동으로 나오기 때문에 어려움이 있었습니다. 또한, 암호 인증을 쓰고자 해도 별도의 처리를 하지 않으면 '암호 입력'을 눌러도 아무 동작도 없이 그냥 종료 됐었습니다.
  • 암호 입력도 같이 사용하도록 하려고 별도 처리를 하면, '암호 입력'을 눌렀을 때 다시 또 생체인증부터 진행하게 되었습니다. 암호 인증과 생체 인증이 별도로 진행되지 않고, '암호 입력'을 눌러도 다시 생체 인증 2번을 진행 후 암호 입력 Alert이 나온뒤 암호 입력으로 넘어가는 것입니다..
  • 위 예시 코드를 보면 아시겠지만 마치 CoreData때처럼 context를 써서 로컬 인증을 진행하게 되는 것인데, 이 context가 문제인듯 하여 새로 생성되게도 해보고, 사용 되던 context를 이어서 사용하게도 해보았는데 계속 같은 동작을 했습니다. 암호 인증만 따로 진행되지 않는 이유를 찾지 못한 것입니다.
  • 시중에 있는 몇 개의 앱(토스, 트래블월렛, 꼬박일기) 앱을 확인해보니 토스와 트래블월렛은 Face ID 인증만 진행하고, 실패시 암호 입력 없이 취소만 가능하도록 하였고, 꼬박일기는 위에서 말한 '암호 입력' Alert이 나오지만 암호 입력을 눌러도 별도 동작 없이 그냥 종료 되었습니다.
  • 결국 생체 인증 실패시 alert에서 암호 입력이 나오지 않도록 처리하였고, 스크린샷에서 볼 수 있는 [취소] 버튼만 있는 alert이 그 결과입니다. 위에서 말씀드린 토스나 트래블월렛과 같은 방식이라고 생각됩니다.
  • 다만 공식문서에서 생체 인증이 실패할 경우 대체 인증을 진행하라고 하는 걸 보기도 해서, 리젝 당할 수도 있다는 걸 염두에 두고 있어야 합니다..🥲

4. 'Face ID' 혹은 'Touch ID'라고 띄우기

  • 일단 Face ID 기기인지, Touch ID 기기인지 구분하는 방법은 간단하기 때문에, 구분한 뒤에 UserDefaults에 저장되도록 해두었습니다.
  • 다만 이를 위해 BiometricAuthManager가 UserDefaultsManager를 의존하는데 이 부분이 조금 신경쓰이는 상태입니다.
  • 그리고 마찬가지로, Label이나 Alert에도 'Face ID' 혹은 'Touch ID'를 띄우기 위해서는 필요한 곳에서 모두 UserDefaultsManager를 의존해야 하는데, UserDefaultsManager가 싱글톤이라 상관 없나 싶기도 하고, 저희가 열심히 의존성 고민해서 분리 해보려고 애쓰는 와중에 UserDefaultsManager는 그냥 막 가져다 쓰는 게 맞는가 싶기도 해서 이 부분도 팀원 분들의 이야기가 듣고 싶었습니다.
  • 일단은 그래서 'Face ID'나 'Touch ID'라고 안 나오고 그냥 '생체 인증'이나 '앱 잠금' 이라고 나오는 상태입니다.

참고

스크린샷 2025-03-06 오후 1 13 18

참고로, LAError 에러 코드는 위와 같이 정리할 수 있는데, 표현이 조금 미묘한 느낌이 있습니다.

자세한 건 LAError 공식문서를 보시면 아실 수도 있는데, 설명이 워낙 간결해서 저는 써봐야 알겠더라구요..

.biometryNotAvailable은 공식 문서에도 Biometry is not available on the device. 이렇게만 쓰여있고, GPT 설명으로는 생체 인증이 불가능한 기기에서 생체 인증을 진행하려 할 경우 나는 것처럼 쓰여있습니다. 틀린 건 아닌데, Face ID 권한을 거부했을 때도 이 에러가 동작해서 .biometryNotEnrolled.authenticationFailed랑 구분하기 어려워 당황스러운 경우가 있었습니다.

로컬 인증 정책에 대한 것은 LAPolicy 공식문서 확인하면 편합니다..!

@maxminseok maxminseok self-assigned this Mar 6, 2025
@maxminseok maxminseok linked an issue Mar 6, 2025 that may be closed by this pull request
5 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feat] 생체 인증을 통한 앱 잠금 기능 추가

1 participant