이 페이지는 자동 번역되었습니다. 영어 원문은 여기.
| 접근 방식 | 채택률 | 패스키 생성 | 패스키 사용 | 패스키 관리 | 기술적 복잡성 | OAuth 지원 |
|---|---|---|---|---|---|---|
| 네이티브 구현(Native Implementation) | 🟢🟢🟢 | 높은 채택률, 최고의 UX, 원활한 생체 인식 | 즉각적이고 조용한 인증 | 완전한 네이티브 제어 | 중간-높음 | 별도 흐름 필요 |
| 시스템 WebView(System WebView) | 🟢🟢 | 우수한 채택률, 브라우저와 유사한 경험 | 표준 브라우저 UX, 공유 키체인 | 브라우저 기반 관리 | 낮음 | 우수함 |
| 임베디드 WebView(Embedded WebView) | 🟢 | 낮은 채택률, 더 많은 설정 필요 | iOS 및 Android(WebKit 1.12.1+) 네이티브 지원, 조건부 UI 없음 | 제한된 제어 | 중간-높음 | 해당 없음 |
참고: 시스템 WebView와 임베디드 WebView는 종종 결합되어 사용됩니다. 시스템 WebView가 로그인(자동 자격 증명 공유 포함)을 처리한 다음, 임베디드 WebView가 설정에서 패스키 관리를 렌더링합니다.
주요 결정 요소:
최신 모바일 플랫폼은 네이티브 앱에 패스키를 통합하는 세 가지 고유한 접근 방식을 제공하며, 각각은 사용자 경험, 기술적 복잡성 및 OAuth 호환성에 대한 장단점이 다릅니다.
네이티브 구현: 플랫폼 API(iOS AuthenticationServices, Android Credential Manager)를 사용하여 앱에 직접 패스키 흐름을 구축합니다. 원활한 생체 인증으로 최고의 사용자 경험을 제공하지만 중간에서 높은 수준의 기술 구현 노력이 필요합니다.
시스템 WebView: 플랫폼의 브라우저 구성 요소(iOS ASWebAuthenticationSession / SFSafariViewController, Android Chrome Custom Tabs)를 사용하여 인증을 처리합니다. OAuth 기반 로그인 흐름에 탁월하며 시스템 브라우저와 자격 증명을 공유합니다.
임베디드 WebView: 앱 내에 사용자 정의 가능한 웹 뷰(iOS WKWebView, Android WebView)를 내장하여 네이티브 앱 뼈대와 함께 웹 인증을 재사용합니다. URL 표시줄 없이 네이티브와 같은 모양을 제공하고 웹 뷰 UI에 대한 완벽한 제어를 제공합니다. 패스키 기능을 활성화하려면 권한 및 자격 증명(iOS)과 AndroidX WebKit 1.12.1+(Android)을 통한 WebView 구성 등 추가 설정이 필요합니다.
올바른 선택은 앱의 인증 아키텍처, OAuth 공급자 사용 여부, UI에 대한 제어 수준, 네이티브 중심으로 구축할지 웹 구성 요소를 재사용할지에 따라 달라집니다.
네이티브 패스키 구현은 플랫폼별 API를 사용하여 앱의 UI에 직접 구축된 인증 흐름을 통해 최적의 사용자 경험을 제공합니다. 사용자는 플랫폼 네이티브 대화 상자, 원활한 생체 인식 및 가장 빠른 로그인 시간의 이점을 누릴 수 있습니다.
네이티브 구현을 선택해야 하는 경우:
preferImmediatelyAvailableCredentials를 사용하여 패스키를 사용할 수 있을 때
자동으로 패스키 오버레이 표시할
수 있으므로, 식별자를 입력하지 않고도 가장 빠른 로그인 환경을 제공할 수 있습니다.주요 장점: preferImmediatelyAvailableCredentials()
네이티브 구현은 preferImmediatelyAvailableCredentials()를 활용하여 패스키를 사용할 수
있을 때 앱 시작 즉시 나타나는
자동 패스키 오버레이를
생성할 수 있습니다. 이 사용자 이름 없는 흐름은 가능한 가장 빠른 로그인 경험을 제공합니다.
사용자는 식별자를 먼저 입력하지 않고도 즉시 패스키를 볼 수 있습니다. 이 기능은 네이티브
구현 전용이며 WebView 변형에서는 사용할 수 없습니다.
아래 다이어그램은 WebView의 조건부 UI 접근 방식에 비해 네이티브 인증이 어떻게 더 빠른 사용자 여정을 제공하는지 보여줍니다.
네이티브의 자동 오버레이는 앱 실행 시 즉시 인증이 시작되므로 패스키 사용률이 더 높은 우수한 UX를 제공하는 반면, WebView 구현은 사용자가 먼저 입력 필드와 상호 작용해야 합니다.
기술 요구 사항 개요:
네이티브 패스키 통합에는 앱과 웹 도메인 간의 암호화 신뢰가 필요합니다. 이 신뢰가 없으면 OS는 모든 WebAuthn 작업을 거부합니다. 주요 요구 사항:
/.well-known/에서 호스팅되는 앱-도메인 연결 파일(App-Domain Association Files)주요 이점: 웹사이트에서 생성된 패스키는 앱에서 원활하게 작동하며 그 반대의 경우도 마찬가지입니다.
iOS에서 네이티브로 패스키를 구현하려면 WebAuthn 작업을 위한 API를 제공하는 Apple의 AuthenticationServices 프레임워크가 필요합니다.
주요 구성 요소:
ASAuthorizationController: 인증 흐름을 관리합니다.ASAuthorizationPlatformPublicKeyCredentialProvider: 패스키 요청을 생성합니다.개발 팁
?mode=developer를 추가하여 강제로 새로 가져오도록 합니다.Android의 네이티브 패스키 구현은 Credential Manager API(또는 이전 버전과의 호환성을 위한 구형 FIDO2 API)를 사용합니다.
엔터프라이즈 Passkey 백서. passkey 프로그램을 위한 실무 가이드, 도입 패턴, KPI.
주요 구성 요소:
CredentialManager: 모든 자격 증명 작업의 중앙 APICreatePublicKeyCredentialRequest: 패스키 등록용GetCredentialRequest: 패스키 인증용참고: Android는 현재 네이티브 앱에서 iOS의 조건부 UI 키보드 제안 기능이 없습니다(조건부 UI는 웹 앱에서 작동함).
네이티브로 패스키를 구현하는 데에는 다음과 같은 중요한 과제와 학습 내용이 있습니다. OS 수준에서 통합하면 여러 기기 및 OS 버전에 걸쳐 문제가 표면화될 수 있습니다.
원시 플랫폼 API를 사용하여 패스키를 구현할 수도 있지만, 목적에 맞게 빌드된 SDK는 WebAuthn의 복잡성과 엣지 케이스를 처리하고 내장된 원격 측정을 제공하여 개발을 크게 가속화합니다. 또한 SDK는 단위 테스트를 위한 모의 인터페이스를 제공합니다(시뮬레이터에서 생체 인식을 테스트할 수 없으므로 중요함).
권장 사항: 네이티브 구현의 경우, 프로덕션 배포를 통해 발견된 수많은 엣지 케이스를 처리하고 추가 원격 측정 및 테스트를 제공하는 Corbado SDK(iOS Swift Passkey SDK, Android Kotlin Passkey SDK)를 사용하는 것이 좋습니다.
Igor Gjorgjioski
Head of Digital Channels & Platform Enablement, VicRoads
We hit 80% mobile passkey activation across 5M+ users without replacing our IDP.
See how VicRoads scaled passkeys to 5M+ users — alongside their existing IDP.
Read the case study시스템 WebView는 플랫폼의 네이티브 브라우저 구성 요소를 사용하여 앱 내에서 인증을 처리합니다. 완전한 네이티브 구현과 달리 시스템 WebView는 실제 시스템 브라우저(iOS의 Safari, Android의 Chrome)를 사용하여 웹 콘텐츠를 표시하며, 공유 쿠키, 저장된 자격 증명 및 친숙한 브라우저 보안 표시기를 유지합니다.
시스템 WebView를 선택해야 하는 경우:
주요 장점:
플랫폼 구성 요소:
ASWebAuthenticationSession(인증 흐름에 권장) 또는
SFSafariViewController(일반 브라우징)Google 및 GitHub와 같은 주요 기업은 기존 웹 인증 페이지에 WebView 오버레이를 통해 모바일 앱에 패스키 로그인을 추가하는 데 이 접근 방식을 채택했습니다. 이는 완전한 네이티브 인증 재구축을 당장 실행할 수 없을 때 효과적입니다.
iOS는 인증을 위해 두 가지 주요 시스템 WebView 구성 요소를 제공합니다.
ASWebAuthenticationSession (인증 시 권장):
SFSafariViewController (일반 브라우징):
| 기능 | ASWebAuthenticationSession | SFSafariViewController |
|---|---|---|
| 주요 사용 사례 | 인증 흐름 | 일반 웹 브라우징 |
| OAuth/OIDC | 매우 우수함 | 우수함 |
| 패스키 지원 | 예 | 예 |
| 사용자 정의 | 제한적 | 최소한 |
앱이 OAuth 기반 로그인을 사용하는 경우, ASWebAuthenticationSession은 인증 시나리오를
위해 특별히 설계되었고 보안과 사용자 경험의 최상의 균형을 제공하므로 권장되는 선택입니다.
Chrome 맞춤 탭(CCT)은 앱 내에서 Chrome 기반의 인증 경험을 제공합니다.
주요 기능:
OAuth 통합: Chrome 맞춤 탭은 iOS ASWebAuthenticationSession과 동등한 Android 기능으로, 저장된 패스키에 대한 액세스를 유지하면서 뛰어난 OAuth 지원을 제공합니다.
라이브 데모에서 passkeys를 체험하세요.
임베디드 WebView는 앱 내 웹 콘텐츠 렌더링에 대한 완벽한 제어를 제공하여, URL 표시줄 없이 쿠키, 세션 및 탐색을 직접 조작할 수 있게 해줍니다. 그러나 이 제어 권한을 얻으려면 패스키 기능을 활성화하기 위한 추가 기술적 요구 사항을 충족해야 합니다.
임베디드 WebView를 선택해야 하는 경우:
중요한 배경 설명:
많은 앱이 하이브리드 접근 방식을 사용합니다. 시스템 WebView가 초기 OAuth 인증(패스키가 원활하게 작동함)을 처리한 다음, 설정에서 패스키를 관리하기 위해 인증 후 임베디드 WebView로 전환합니다. 임베디드 WebView 내에서 패스키를 직접 사용하려 할 때 문제가 발생합니다.
기술 요구 사항:
임베디드 WebView는 시스템 WebView에 비해 추가 설정이 필요합니다.
플랫폼 구성 요소:
WKWebViewandroid.webkit.WebView장단점:
WebView를 통해 패스키를 구현할 때 시스템 WebView와 임베디드 WebView의 차이를 이해하는 것이 중요합니다. 위에 설명된 세 가지 접근 방식(네이티브 구현, 시스템 WebView 및 임베디드 WebView)은 각각 서로 다른 사용 사례를 제공합니다.
iOS에서는 인앱으로 웹 콘텐츠를 표시하는 여러 옵션이 있습니다.
Android에서의 주요 선택 사항은 다음과 같습니다.
android.webkit.WebView)입니다. 사용자 정의가 가능하지만 앱의 프로세스 내에서
실행됩니다.다음 섹션에서는 iOS 및 Android용 WebView 유형에 대해 더 자세히 살펴보고, 패스키 인증 흐름에 가장 적합한 것이 무엇인지 논의하겠습니다.
최신 뉴스를 위해 Passkeys Substack을 구독하세요.
Apple의 플랫폼은 위에 나열된 세 가지 WebView 옵션을 제공합니다. 선택에 따라 앱 내에서 패스키가 얼마나 원활하게 사용될 수 있는지가 결정됩니다.
iOS에서 다양한 WebView 동작을 테스트하려면 앱 WebView - WKWebView and UIWebView rendering을 권장합니다.
WKWebView는 iOS용 다목적 WebView 구성 요소입니다. 개발자는 UI 및 동작에 대한 높은 수준의 제어 기능을 통해 WKWebView를 임베드하여 웹 콘텐츠를 렌더링할 수 있습니다. WKWebView는 Safari와 동일한 렌더링 엔진을 사용하므로 성능이 매우 뛰어나고 최신 웹 기능을 지원합니다. 이론적으로 WKWebView는 올바르게 구성되면 WebAuthn(따라서 패스키)을 처리할 수 있지만, 보안을 위해 일부 고급 브라우저 기능이 제한될 수 있습니다. 주의해야 할 한 가지는 WKWebView가 기본적으로 모바일 Safari와 쿠키나 키체인 데이터를 공유하지 않는다는 점입니다. WebView 세션이 Safari의 세션과 격리되어 있으므로 사용자는 새로 로그인해야 할 수 있습니다. 또한 앱에서 WKWebView 콘텐츠를 완전히 사용자 지정할 수 있으므로 사용자에게 주소 표시줄이나 Safari UI가 표시되지 않습니다. 이는 브랜딩에는 좋지만 페이지의 적법성을 확인할 수 있는 단서가 적어짐을 의미합니다(피싱 방지에 대한 우려). 일부 앱은 스크립트를 주입하거나 콘텐츠를 변경하기 위해 WKWebView를 남용한 적이 있으므로(예: TikTok이 인앱 브라우저를 통해 추적 JS를 주입한 것으로 나타남) WKWebView를 안전하고 사용자가 신뢰할 수 있는 방식으로 사용하도록 주의해야 합니다.
SFSafariViewController는 인앱 Safari 경험을 제공합니다. SFSafariViewController를 사용하여 URL을 여는 것은 실제 Safari 브라우저에서 여는 것과 거의 동일하지만 사용자가 앱의 UI 내에 머문다는 점이 다릅니다. 패스키에 대한 장점은 큽니다. 근본적으로 Safari이므로 사용자의 iCloud 키체인과 저장된 패스키에 액세스할 수 있습니다. 쿠키는 iOS 11+에서 공유되지 않는다는 점에 유의하세요. 즉, 사용자가 이미 사이트에 대한 패스키를 가지고 있는 경우 Safari는 해당 패스키를 찾아 조건부 UI 자동 완성 기능을 표시하여 쉽게 로그인할 수 있습니다. SFSafariViewController는 사용자 정의 기능은 떨어지지만(도구 모음을 많이 변경할 수 없음) 많은 보안 및 개인정보 보호 기능을 자동으로 처리합니다. URL 표시줄이 HTTPS용 자물쇠 아이콘과 함께 표시되므로 사용자는 올바른 도메인에 있다는 확신을 얻을 수 있습니다. 일반적으로 SFSafariViewController는 원시 WKWebView보다 더 안전한 것으로 간주되며 구현하기도 더 간단합니다(Apple이 드롭인 형태로 제공). 가장 큰 단점은 룩앤필에 대한 일부 제어 권한을 희생한다는 것입니다. 인증 흐름의 경우 이는 일반적으로 허용됩니다. 여기의 최우선 순위는 보안과 로그인 편의성인데, SFSafariViewController는 Safari의 컨텍스트를 사용하여 이를 훌륭하게 수행합니다.
| WKWebView | SFSafariViewController | |
|---|---|---|
| 사용자 경험 | - 네이티브 느낌: 개발자가 앱의 디자인과 일치하도록 룩앤필을 사용자 지정할 수 있으므로 웹 콘텐츠가 앱의 네이티브 부분이라고 느낄 수 있습니다. - 자동 완성: Safari 데이터를 통한 자동 완성이 가능합니다. | - 원활함: 사용자의 Safari 설정을 사용하여 네이티브 앱과 브라우저 간에 일관된 웹 브라우징을 보장하는 원활한 사용자 경험. |
| 개발자 경험 | - 높은 사용자 정의성: 광범위한 사용자 정의 및 구성이 가능 - 유연함: 웹 콘텐츠와 상호 작용하기 위한 다양한 API 제공 | - 중간 사용자 정의성: 특히 WKWebView와 비교할 때 제한된 사용자 지정 옵션 - 간단함: WKWebView에 비해 구현이 더 간단함 |
| 성능 | - 다소 느림: 구현 및 웹 콘텐츠에 따라 로딩 속도를 최적화할 수 있지만 맞춤형 기능 및 상호 작용의 추가 처리로 인해 SFSafariViewController에 비해 여전히 느릴 수 있습니다. | - 다소 빠름: 속도와 효율성에 최적화된 Safari 엔진을 활용하므로 일반적으로 성능이 우수하고 웹 페이지의 로딩 시간이 빠릅니다. |
| 신뢰와 인지 | - URL 표시 불필요: WKWebView는 웹페이지를 확인하기 어렵게 URL을 표시하지 않는 경우가 많습니다. 악성 앱이 이 동작을 모방하여 자격 증명을 피싱할 가능성이 있습니다. | - 브라우저와 유사한 경험: Safari를 사용하여 웹 페이지를 렌더링하여 "브라우저와 유사한" 경험을 제공합니다. 사용자는 URL을 확인하고 Safari의 자동 완성 기능에 액세스할 수 있으며 익숙한 인터페이스 덕분에 신뢰도를 높일 수 있습니다. |
| 격리 | - 분리됨: 쿠키 및 세션은 Safari에서 분리됩니다. 사용자가 WKWebView에 자동으로 로그인되지 않습니다. | - 분리됨: 쿠키 및 세션은 Safari에서 분리됩니다. 사용자가 SFSafariViewController에도 자동으로 로그인되지 않습니다. |
| 취약점 | - 보안: Apple의 앱 샌드박싱 덕분에 본질적으로 안전하지만, 동작 및 보안은 앱의 구현에 따라 다릅니다. 제대로 구현되지 않으면 잠재적 취약성이 발생할 수 있습니다. | - 더욱 안전함: 피싱 방지 및 악성 웹사이트 경고 등 Safari의 내장된 보안 기능의 혜택을 누릴 수 있습니다. 이러한 기능과 사용자의 Safari에 대한 친숙함 덕분에 웹 콘텐츠 표시 측면에서 일반적으로 WKWebView보다 더 안전한 것으로 간주됩니다. |
| 기타 | - 사용할 수 없는 기능: 일부 브라우저 기능(예: WebAuthn)은 보안 문제 및 앱 컨텍스트 내에서 WKWebView가 실행되기 때문에 완전히 액세스할 수 없을 수 있습니다. - JavaScript 주입: TikTok 등 일부 앱은 인앱 WKWebView에 추적 JavaScript를 주입하거나 사용자 컨트롤러를 제한합니다(예: Facebook). - 개인정보 문제: 개인정보와 관련된 더 많은 커뮤니티 피드백이 있습니다. | - JavaScript 주입 금지: 앱에서 JavaScript 실행을 허용하지 않아 보안과 개인정보 보호를 향상합니다. 또한 JavaScript 알림이나 확인을 지원하지 않아 특정 웹페이지의 사용자 경험에 영향을 미칠 수 있습니다. - 리더 모드: 명확하고 읽기 쉬운 버전의 기사를 위한 리더 모드를 제공합니다. |
SFAuthenticationSession / ASWebAuthenticationSession - 이러한 클래스(후자는 더 최신의 Swift 친화적인 이름임)는 OAuth 또는 OpenID Connect와 같은 로그인 흐름을 위해 특별히 제작되었습니다. 웹 페이지를 통해 사용자 인증이 필요한 경우(예: 외부 IdP로), 이 세션은 iOS에서 권장되는 선택입니다. 내부적으로 Safari 브라우저를 활용하고 Safari와 쿠키/저장소를 공유한다는 점에서 SFSafariViewController와 매우 유사합니다. 주요 차이점은 SFAuthenticationSession은 항상 앱이 웹페이지를 사용하여 인증을 원한다는 메시지를 사용자에게 표시(사용자 인지를 위해)하고 사용 가능한 경우 사용자의 기존 Safari 세션을 자동으로 사용한다는 점입니다.
이점은 원활한 SSO 경험입니다. 사용자가 Safari의 공급자에 이미 로그인되어 있는 경우 이 세션은 해당 쿠키를 사용하여 다시 로그인하지 않도록 할 수 있습니다. 패스키의 경우 Safari/iCloud 키체인에 저장된 모든 패스키 자격 증명도 여기서 사용할 수 있음을 의미하기 때문에 중요합니다. Apple의 공식 가이드는 로그인 흐름처럼 보이는 모든 항목에 ASWebAuthenticationSession을 사용하는 것입니다. 장점은 개인정보 보호 강화(앱이 자격 증명이나 쿠키를 절대 볼 수 없으며 Safari가 처리함)와 내장된 SSO 지원입니다. 단점은 인증 흐름에 국한된다는 것입니다(앱에서 임의의 웹 콘텐츠를 렌더링하는 데 사용하지 않음). 요약하면, iOS에서 WebView 접근 방식을 선택하는 경우 ASWebAuthenticationSession이 안전하고, Safari와 상태를 공유하며, 인증용으로 특별히 제작되었기 때문에 패스키 구현에 있어 최고의 선택입니다.
실제로 얼마나 많은 사람이 passkeys를 쓰는지 확인하세요.
Android에서 WebView 결정은 클래식 WebView와 Chrome 맞춤 탭 간의 선택입니다.
Android에서 다양한 WebView 동작을 테스트하려면 앱 WebView vs Chrome Custom Tabs를 권장합니다.
Android WebView(android.webkit.WebView)는 액티비티 레이아웃에 웹페이지를 임베드할 수 있는 구성 요소입니다. 탐색을 가로채거나 JavaScript를 주입하거나 UI를 사용자 지정할 수 있는 등 완전한 제어 권한을 제공한다는 점에서 WKWebView와 유사합니다. 또한 앱의 프로세스 내에서 실행됩니다. 패스키에 WebView를 사용하면 앱이 웹 로그인 페이지를 로드하고 해당 페이지가 WebAuthn 패스키 의식을 시작할 수 있음을 의미합니다. 최신 Android WebView는 WebAuthn을 지원합니다(기기의 WebView 구현이 Android 시스템 WebView 또는 Chrome 구성 요소를 통해 최신 상태라고 가정할 때). 한 가지 주요 고려 사항은 기본적으로 Android WebView는 사용자의 Chrome 브라우저와 쿠키나 저장된 자격 증명을 공유하지 않는다는 점입니다. 따라서 WebView에서 생성되거나 사용된 패스키를 Chrome에서 인식하지 못할 수 있으며 그 반대의 경우도 마찬가지입니다. 이러한 격리는 보안 측면에서는 좋지만(앱에서 브라우저 쿠키를 읽을 수 없음) 사용자가 Chrome에서 이미 인증된 경우 다시 로그인하도록 강요할 수 있습니다. 또 다른 문제는 신뢰입니다. 일반 WebView는 URL이나 SSL 잠금 아이콘을 표시하지 않으므로 사용자는 피싱 당하지 않으리라고 앱을 완전히 신뢰해야 합니다. Google은 잠재적인 피싱 위험을 이유로 Google OAuth 로그인에 WebView 사용을 금지하기도 했습니다. 성능 측면에서 WebView는 괜찮지만, 특히 무거운 페이지를 로드할 때 사용자의 기본 브라우저를 사용하는 것보다 느리거나 메모리 집약적일 수 있습니다.
**Chrome 맞춤 탭(CCT)**은 하이브리드 접근 방식입니다. 앱 내에 속한 것처럼 보이는 Chrome에서 렌더링된 페이지를 앱에서 열 수 있습니다. 툴바 색상을 사용자 지정하거나 앱 로고를 추가하는 등의 작업을 할 수 있지만, 콘텐츠는 별도의 프로세스에서 Chrome에 의해 렌더링됩니다. 패스키와 관련하여 CCT에는 여러 가지 이점이 있습니다. 사용자의 쿠키 및 자격 증명을 Chrome 브라우저와 공유합니다. 즉, 사용자가 Chrome(Google 비밀번호 관리자)을 통해 저장된 패스키를 보유한 경우 맞춤 탭에서 해당 패스키에 액세스할 수 있습니다. 또한 사용자는 실제 URL과 보안 표시기를 볼 수 있으므로 신뢰를 얻을 수 있습니다. 성능이 더 나은 경우가 많습니다. 백그라운드에서 Chrome을 "준비(warmed up)"하여 더 빠르게 로드할 수 있습니다. 그리고 중요한 것은 보안이 강력하다는 것입니다. 본질적으로 Chrome 앱이기 때문에 Google 세이프 브라우징과 같은 기능이 세션을 보호하며 앱에서 임의의 스크립트를 페이지에 주입할 수 없습니다(특정 공격 방지).
단점은 사용자가 Chrome(또는 지원되는 브라우저)을 설치하고 최신 상태로 유지해야 한다는 것입니다. 대부분의 Android 사용자는 그렇지만 일부 지역의 일부 기기에서는 이 점이 문제가 될 수 있습니다. 전반적으로 Android에서 임베디드 웹 접근 방식을 사용하는 경우 통합과 보안 간의 균형이 잘 맞으므로 패스키 흐름에 Chrome 맞춤 탭을 사용하는 것이 좋습니다. 실제로 인증을 위해 기본 브라우저를 활용한다는 점에서 여러모로 iOS의 SFSafariViewController/ASWebAuthSession과 비슷합니다.
(참고: Apple의 WKWebView 대 SFSafariViewController 및 Android의 WebView 대 CCT는 유사점이 많습니다. Safari VC 및 맞춤 탭은 브라우저 상태를 공유하고 더 나은 보안을 제공하는 반면, WKWebView/Android WebView는 더 많은 제어 권한을 제공하지만 웹 콘텐츠를 격리합니다. 패스키의 경우 패스키에 원활하게 액세스하고 생성할 수 있도록 상태(쿠키, 자격 증명 저장소)를 공유하는 것이 일반적으로 바람직합니다.)
| 기능 | WebView | Chrome 맞춤 탭 |
|---|---|---|
| 사용자 경험 | - 유연성: JavaScript 대화 상자 및 권한 요청 처리를 포함하여 웹 콘텐츠와 상호 작용하고 사용자 상호 작용을 관리하기 위한 풍부한 API 세트를 제공합니다. - 일관성: 특히 웹 콘텐츠가 다양한 경우 일관된 UX를 관리하기 어려울 수 있습니다. | - 브라우저 기능: 기기 간에 데이터 세이버 및 동기화된 자동 완성 기능 등의 기능을 공유합니다. - 뒤로 가기 버튼: 통합된 뒤로 가기 버튼으로 사용자가 쉽게 앱으로 돌아갈 수 있습니다. - 의존성: Chrome 앱에 의존하므로 일부 사용자 기기에서는 사용할 수 없거나 업데이트되지 않을 수 있습니다. - 브라우저로 리디렉션: 특정 기능이 사용자를 Chrome 앱으로 리디렉션하여 사용자 경험을 방해할 가능성이 있습니다. - 부분적 맞춤 탭: 화면의 일부만 Chrome 맞춤 탭에 사용할 수 있고 나머지 부분은 네이티브 앱을 표시합니다. - 사이드 시트: 가로 모드와 큰 화면 기기에서는 Chrome 맞춤 탭이 화면 한쪽에만 표시되고 나머지 부분은 네이티브 앱을 표시합니다. |
| 개발자 경험 | - 매우 높은 사용자 정의성: 광범위한 사용자 정의 옵션/필요 사항을 제공합니다. - 상호 작용성: 웹 콘텐츠와 상호 작용하고 사용자 상호 작용을 관리하기 위한 수많은 API를 제공합니다. | - 사용자 정의 가능: 툴바 색상, 작업 버튼, 하단 툴바, 맞춤 메뉴 항목, 인/아웃 애니메이션을 사용자 정의할 수 있습니다. - 콜백: 외부 탐색 시 애플리케이션에 콜백을 전달합니다. - 보안 기능: 즉시 사용 가능한 기능을 제공하여 요청, 권한 부여 또는 쿠키 저장소를 관리할 필요를 없애 줍니다. |
| 성능 | - 평범한 성능: Chrome 맞춤 탭(CCT)과 동일한 수준의 성능을 제공하지 못할 수 있습니다. | - 사전 준비(Pre-Warming): 페이지 로드 시간을 향상시키기 위해 백그라운드 브라우저 사전 준비 및 URL 추측적 로딩(speculative loading)을 포함합니다. - 우선순위: 맞춤 탭을 실행하는 앱의 중요도를 "포그라운드(foreground)" 수준으로 높여 사용 중에 해당 앱이 닫히지 않도록 방지합니다. |
| 신뢰와 인지 | - URL 및 SSL 표시 안 됨: WebView에서는 기본적으로 URL 및 SSL 정보가 표시되지 않습니다. 앱 개발자가 해당 기능을 구현하지 않는 한 사용자는 올바른 웹사이트에 있는지 피싱 사이트인지 알 수 없습니다. | - URL 및 SSL 표시: 실제 Chrome 브라우저를 사용하여 페이지를 렌더링합니다. 사용자는 URL과 SSL 인증서(연결이 안전한지 표시)를 볼 수 있습니다. 이로 인해 피싱 사이트에 있지 않다는 확신을 사용자에게 줄 수 있습니다. |
| 격리 | - 앱의 프로세스 내에서 실행: 악의적 코드 실행을 허용하는 취약성이 앱에 있는 경우 WebView가 손상될 위험이 있습니다. WebView도 업데이트를 수신하지만 해당 동작과 보안은 이를 사용하는 앱에 더 많이 의존할 수 있습니다. - 쿠키 / 세션 공유 없음: 기기의 메인 브라우저와 쿠키 또는 세션을 공유하지 않아 격리는 되지만 사용자가 다시 로그인해야 할 수 있습니다. | - Chrome의 프로세스 내에서 실행: Chrome의 일부로서 맞춤 탭은 동일한 프로세스에서 실행되고 Chrome과 동일한 보안 업데이트 및 기능을 가집니다. - 공유 쿠키 병 및 권한 모델: 사용자가 사이트에 다시 로그인하거나 권한을 다시 부여할 필요가 없습니다. - Chrome 설정 및 기본 설정: Chrome의 설정 및 기본 설정을 활용합니다. |
| 취약점 | - 자격 증명을 훔치기 위한 콜백: 잠재적 취약점에는 사용자 이름과 비밀번호 가로채기를 시도하는 콜백 등록과 같이 때때로 악의적 코드를 실행할 수 있는 다른 앱을 위한 문을 열어두는 JavaScript가 요구된다는 점이 포함됩니다. - 피싱: 또한 악성 앱이 피싱 시도로 링크 흐름을 모방하는 다른 웹 페이지를 열 수 있습니다. | - Google 세이프 브라우징: Google의 세이프 브라우징을 사용하여 사용자 및 기기를 위험한 사이트로부터 보호합니다. - 안전한 브라우저 장식(Secure Browser Decoration): 사용자가 항상 상호 작용하는 정확한 URL을 확인하고 웹사이트 인증서 정보를 볼 수 있도록 하여 피싱 위험을 줄입니다. 게다가 맞춤 탭은 JavaScript 주입을 허용하지 않습니다. |
| 기타 | - Google은 Google 계정에 로그인하는 사용자를 위해 WebView를 금지했습니다. |
선택한 구현 접근 방식에 관계없이 패스키 기능을 활성화하려면 특정 기술적 요구 사항을 충족해야 합니다. 이 섹션에서는 잘 알려진 연결 파일, iOS 권한 부여 및 Android WebView 구성에 대한 종합적인 가이드를 제공합니다.
관리 기기에 대한 참고 사항: 모바일 기기 관리(MDM) 정책이 자격 증명 스토리지를 제어하는 관리 기기에서는 패스키 동작이 크게 달라집니다. 관리 기기에서의 패스키 테스트에 대해서는 관리되는 iOS 및 Android 기기의 패스키를 참조하세요.
네이티브 및 임베디드 WebView 흐름에는 앱과 웹 도메인 간의 암호화 신뢰를 확립하기 위해 연결 파일이 필요합니다. 시스템 WebView(ASWebAuthenticationSession) 및 Chrome 맞춤 탭은 앱-사이트 연결이 필요하지 않습니다.
AASA 파일은 iOS 앱과 웹 도메인 간의 연결을 확립하여 두 플랫폼 모두에서 패스키가 작동할 수 있도록 지원합니다.
파일 위치: https://yourdomain.com/.well-known/apple-app-site-association
구성 요구 사항:
/.well-known/apple-app-site-association에 호스팅application/json.well-known 경로에 리디렉션 없음AASA 파일 예시:
{ "webcredentials": { "apps": ["TEAMID123.com.example.app"] } }
AASA 캐싱 및 테스트:
Apple은 CDN을 사용하여 AASA 파일을 매우 공격적으로 캐시(최대 24-48시간)하므로 개발 및 테스트를 방해할 수 있습니다. 개발 중 캐싱을 우회하는 방법은 다음과 같습니다.
?mode=developer를 추가합니다.⚠️ 중요: 프로덕션 릴리스에서는 ?mode=developer를 사용하지 마십시오. 이 매개변수는
개발 전용이며 프로덕션에서 사용하면 iOS가 AASA 파일을 제대로 감지하지 못해 패스키 기능이
손상됩니다.
확인: 구성을 확인하려면 Apple의 AASA Validator를 사용하세요.
Android는 Digital Asset Links를 사용하여 앱과 웹사이트 간의 관계를 확인합니다.
파일 위치: https://yourdomain.com/.well-known/assetlinks.json
구성 요구 사항:
/.well-known/assetlinks.json에 호스팅application/jsonassetlinks.json 파일 예시:
[ { "relation": [ "delegate_permission/common.handle_all_urls", "delegate_permission/common.get_login_creds" ], "target": { "namespace": "android_app", "package_name": "com.example.app", "sha256_cert_fingerprints": [ "AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99" ] } } ]
확인: 구성을 생성하고 확인하려면 Google의 Digital Asset Links Generator를 사용하세요.
iOS 앱이 패스키 기능에 액세스하려면 적절한 권한(Entitlements)이 필요합니다. 요구 사항은 구현 접근 방식에 따라 약간 다릅니다.
권한 파일(Flutter 앱의 경우 Runner.entitlements, 네이티브 iOS 프로젝트의 경우
YourApp.entitlements로 종종 명명됨)은 Apple의 시스템이 부여하는 특별 권한 및 기능을
정의합니다. 패스키의 경우 이 파일은 관련 도메인(Associated Domains)을 구성합니다.
파일 위치: 일반적으로 Xcode 프로젝트의 ios/Runner/Runner.entitlements에 있습니다.
네이티브 구현 및 임베디드 WebView에는 앱과 웹 도메인을 연결하기 위한 Associated Domains 기능이 필요합니다. 시스템 WebView(ASWebAuthenticationSession)는 Safari 컨텍스트에서 실행되므로 이 기능이 필요하지 않습니다.
Xcode에서의 설정:
webcredentials: 접두사가 있는 도메인을 추가합니다.구성 예시:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>com.apple.developer.associated-domains</key> <array> <string>webcredentials:yourdomain.com</string> <string>webcredentials:subdomain.yourdomain.com</string> </array> </dict> </plist>
| 접근 방식 | Associated Domains 필요 | 추가 구성 |
|---|---|---|
| 네이티브 구현 | 예 | 전용 구현 |
| 시스템 WebView | 필요 없음 | 기본 웹 설정으로 작동 |
| 임베디드 WebView | 예 | AndroidX WebKit 1.12.1+ 구성 필요 |
여러 도메인: 앱이 여러 도메인에서 작동해야 하는 경우 관련 출처 요청(ROR, Related Origin Requests)이 필요할 수 있습니다.
Android 임베디드 WebView는 WebKit 기반의 최신 접근 방식(섹션 5.3.1)과 기존 JavaScript 브릿지 접근 방식(섹션 5.3.2)이라는 두 가지 뚜렷한 방식을 통해 패스키를 지원합니다. 시스템 WebView(Chrome 맞춤 탭)는 별도 구성이 필요하지 않으며 자격 증명이 자동으로 작동합니다.
Android는 두 가지 구현 접근 방식을 모두 보여주는 공식 WebView 패스키 샘플을 제공합니다.
네이티브 패스키 처리가 포함된 최신 WebKit 통합입니다. 이 접근 방식은 사용자 정의 브릿지 코드 없이 네이티브 WebAuthn 지원을 제공합니다.
공식 샘플: Webkit WebView MainActivity
요구 사항:
구현:
import androidx.webkit.WebSettingsCompat import androidx.webkit.WebViewFeature // Check if Web Authentication is supported if (WebViewFeature.isFeatureSupported(WebViewFeature.WEB_AUTHENTICATION)) { // Enable Web Authentication WebSettingsCompat.setWebAuthenticationSupport( webView.settings, WebSettingsCompat.WEB_AUTHENTICATION_SUPPORT_FOR_APP ) // Enable JavaScript webView.settings.javaScriptEnabled = true }
핵심 사항:
WebViewFeature.WEB_AUTHENTICATION을 확인하세요.mediation:"conditional"(입력 필드의 패스키 자동 완성)은 임베디드
WebView에서 작동하지 않습니다.버전 참고 사항:
AndroidX WebKit 1.12.0 이전에는 임베디드 WebView에 네이티브 WebAuthn 지원이 존재하지 않았습니다. 이 기존 접근 방식은 네이티브 WebView WebAuthn을 지원하지 않는 기기의 패스키를 처리하기 위해 Web-to-Native 브릿지를 사용합니다.
공식 샘플:
사용 시기: 구형 Android 버전 또는 기존 WebView 구현이 있는 기기를 지원할 때.
팀에서는 다음 중 하나를 수행해야 했습니다.
자세한 구현 내용은 Android의 자격 증명 관리자 WebView 통합 가이드를 참조하세요. 그러나 최신 앱의 경우 네이티브 WebKit 1.12.1+ 접근 방식을 적극 권장합니다.
권장 사항: AndroidX WebKit 1.12.1+에서 네이티브 WebAuthn 지원을 사용하세요. 런타임에 사용할 수 없는 경우 공유 자격 증명과 함께 훌륭한 패스키 지원을 제공하는 Chrome 맞춤 탭으로 폴백하세요.
네이티브 앱에서 패스키를 구현할 때 앱과 웹 도메인 간의 신뢰를 구축해야 합니다. 이 섹션에서는 단일 도메인, 여러 관련 도메인(ROR)을 처리하는 방법과 잘 알려진 연결 파일이 제대로 구성되었는지 확인하는 방법을 다룹니다.
단일 도메인(예: kayak.com)을 사용하는 앱의 경우 다음이 필요합니다.
webcredentials:kayak.com으로 구성된 Associated Domains 권한관련 출처(ROR, Related Origins)는
단일 패스키 세트가 여러 관련 도메인(예: kayak.com, kayak.de, kayak.co.uk)에서 작동할
수 있도록 하는 WebAuthn 기능입니다.
ROR은 AASA나 assetlinks 파일이
아닌 각 사이트의 /.well-known/webauthn 엔드포인트를 사용하여 관련 출처를 정의합니다.
핵심 사항:
/.well-known/webauthn을 호스팅합니다.구성 예시:
앱이 kayak.com과 kayak.de 모두에서 작동하는 경우 두 도메인은 다음 조건을 충족해야
합니다.
배포하기 전에 잘 알려진 파일이 제대로 구성되었고 액세스 가능한지 확인하세요. Apple과 Google은 파일 가용성을 확인할 수 있는 CDN 기반 테스트 URL을 제공합니다.
| 도메인 | Apple AASA 확인 | Google Digital Asset Links 확인 |
|---|---|---|
| kayak.com | 테스트 AASA 파일 Apple CDN이 귀하의 파일을 가져올 수 있는지 확인 | 테스트 assetlinks.json Google이 귀하의 자산 링크에 액세스할 수 있는지 확인 |
| kayak.de | 테스트 AASA 파일 Apple CDN이 귀하의 파일을 가져올 수 있는지 확인 | 테스트 assetlinks.json Google이 귀하의 자산 링크에 액세스할 수 있는지 확인 |
이 테스트 URL 사용하기:
?nocache=1 매개변수는 CDN 캐시를 우회하여 강제로 최신 버전을 가져옵니다.kayak.com 또는 kayak.de를 자신의 도메인으로 교체하세요.테스트 시 주의 사항: 모든 도메인이 잘 알려진 파일을 올바르게 구성했는지 확인하세요. 도메인의 파일이 누락되거나 잘못 구성되면 해당 도메인의 패스키 기능이 손상될 수 있습니다.
추가 정보: 네이티브 앱의 WebAuthn RP ID
올바른 구현 접근 방식을 선택하는 것은 앱의 인증 아키텍처, OAuth 요구 사항 및 세션 제어 필요성에 따라 다릅니다. 이 의사 결정 트리를 사용하여 최선의 방법을 결정하세요.
다음 순서도는 앱의 요구 사항에 따라 올바른 구현 접근 방식을 선택하는 과정을 안내합니다.
각 경로에 대한 빠른 참조:
핵심 측면 전반에 걸친 각 접근 방식의 성과는 다음과 같습니다.
| 접근 방식 | 패스키 생성 | 패스키 사용 | 패스키 관리 | 기술적 복잡성 | OAuth 지원 | 설정 기간 |
|---|---|---|---|---|---|---|
| 네이티브 구현 | 높은 채택률 원활한 생체 인식, 최고의 UX | 즉각적이고 조용함preferImmediatelyAvailableCredentials가 앱 시작 시 자동 오버레이를 활성화합니다. | 완전한 네이티브 제어 앱 설정과 통합 | 중간-높음 플랫폼별 API | 별도의 OAuth 흐름 구현 필요 | 수 주 ~ 수 개월 |
| 시스템 WebView | 우수한 채택률 친숙하고 브라우저와 유사한 경험 | 표준 브라우저 UX 입력 필드의 조건부 UI, 공유 키체인 | 브라우저 기반 사용자가 브라우저를 통해 관리 | 낮음 최소한의 네이티브 코드 | 우수함 OAuth를 위해 특별히 제작됨 | 수 일 ~ 수 주 |
| 임베디드 WebView | 낮은 채택률 구성 필요 | 네이티브 WebAuthn 지원 WebKit 1.12.1+, 조건부 UI 없음 | 제한된 제어 네이티브 통합 안 됨 | 중간-높음 WebView 구성 + 권한 | 구성 필요 | 1~2주 |
항목 설명:
권장 사항: 시스템 WebView
앱이 OAuth2, OIDC 또는 소셜 로그인 공급자(Google, GitHub, Microsoft 등)를 통해 인증하는 경우, 시스템 WebView가 최적의 선택입니다.
ASWebAuthenticationSession은 OAuth 흐름을 위해 특별히 제작되었습니다.예: kayak.com 및 kayak.de와 같은 여행 앱은 인증에 OAuth를 사용합니다. 시스템 WebView를 사용하면 웹 인증 페이지를 통해 패스키 지원을 추가하면서 기존 OAuth 인프라를 유지할 수 있습니다.
권장 사항: 하이브리드 접근 방식
초기 OAuth 인증에는 시스템 WebView를 사용하고, 인증 후 세션에는 임베디드 WebView를 사용합니다.
사용 시기: OAuth를 통해 인증하지만, 이후 직접적인 세션 조작이 필요한 인증된 웹 콘텐츠를 표시해야 하는 앱.
권장 사항: 네이티브 구현
처음부터 새로 구축하거나 네이티브 화면이 있나요? 완전한 네이티브로 가세요.
preferImmediatelyAvailableCredentials를 사용하여
앱 시작 시 자동 패스키 오버레이를 표시하세요.
이는 네이티브 구현에서만 가능하며 가장 높은 전환율을 제공합니다.새로운 앱의 경우: 첫날부터 네이티브 로그인을 구축하는 것을 강력히 권장합니다. 이는 최적의 UX를 위한 기반을 마련하고 향후 WebView에서 네이티브로 마이그레이션하는 번거로움을 피하게 해 줍니다.
권장 사항: 단계적 마이그레이션
다음 다이어그램은 점진적인 마이그레이션 경로를 보여줍니다.
각 단계는 이전 단계를 기반으로 구축되므로 기존 사용자를 방해하지 않고 점진적인 개선이 가능합니다.
| 요구 사항 | 네이티브 | 시스템 WebView | 임베디드 WebView |
|---|---|---|---|
| 잘 알려진 파일 (AASA/assetlinks) | 필수 | 필요 없음 | 필수 |
| iOS Associated Domains | 필수 | 필요 없음 | 필수 |
| Android WebKit 라이브러리 | 해당 없음 | 필요 없음 | 필수 (1.12.1+) |
| RP ID (Relying Party ID) | 도메인과 일치해야 함 | 도메인과 일치해야 함 | 도메인과 일치해야 함 |
자세한 구성 지침은 섹션 5를 참조하세요.
네이티브 앱에서 패스키를 테스트하려면 체계적이고 다층적인 접근 방식이 필요합니다. 테스트 피라미드를 따르세요: 단위 테스트(분리된 로직), 통합 테스트(시뮬레이터/에뮬레이터에서의 WebAuthn 단계), 시스템 테스트(물리적 기기에서의 End-to-End).
필수 테스트 범주:
자동화 전략, 플랫폼별 주의 사항, 완전한 사전 실행 체크리스트를 포함한 포괄적인 테스트 지침은 네이티브 iOS 및 Android 앱에서 패스키 흐름 테스트 전용 가이드를 참조하세요.
기존 로그인(비밀번호, OAuth)에 성공한 후에 사용자에게 패스키 생성을 유도하는 것을 고려해 보세요. 이 점진적 전환 접근 방식은 다음을 제공합니다.
예시: 시스템 WebView를 통한 OAuth 로그인 후, "Face ID로 더 빠르게 로그인하시겠습니까?"라는 네이티브 메시지를 표시합니다. 수락하면 시스템 WebView에 로드된 웹 페이지를 통해 패스키를 생성합니다.
패스키를 네이티브 구현, 시스템 WebView 또는 임베디드 WebView 중 어떤 방식으로 구현할지 결정하는 것은 보안, 사용자 경험 및 개발 복잡성에 영향을 미치는 중요한 설계 선택입니다. 모든 상황에 맞는 단일 솔루션은 없습니다.
OAuth 기반 앱의 경우: 시스템 WebView(ASWebAuthenticationSession, Chrome 맞춤 탭)가 권장되는 시작점입니다. 우수한 OAuth 지원을 제공하고, 최소한의 노력으로 구현할 수 있으며, 자동으로 자격 증명을 공유합니다.
네이티브 중심 앱의 경우: 가급적 빨리 네이티브로 가세요. 네이티브 패스키 로그인은
WebView 구현이 제공할 수 없는 기능인
앱 시작 시 자동 패스키 오버레이를
가능하게 하는 preferImmediatelyAvailableCredentials와 같은 독점 기능과 함께 가장 원활한
UX를 제공합니다. iOS와 Android가 패스키에 대한 최고 수준의 지원을 제공함에 따라 실제 성공
사례는 높은 채택률을 보여주고 있습니다. 네이티브 통합을 적절한 기간 내에 달성할 수 있도록
도구(오픈 소스 SDK 및 플랫폼 라이브러리 포함)도 성숙해졌습니다. 기기 관리 정책, 기기 간
동기화, 타사 공급자 등의 문제에 유의해야 하지만, 신중한 엔지니어링과 테스트로 관리할 수
있습니다. 그 결과로 보안을 대폭 향상시키면서도 쉽고 빠른 인앱 로그인으로 사용자에게 기쁨을
줍니다.
임베디드 WebView 프레임 요구 사항이 있는 경우: 임베디드 WebView는 두 가지 실제 시나리오에서 자주 사용됩니다. 첫째, OAuth 기반 앱은 초기 로그인 흐름에 시스템 WebView를 사용한 다음, 세션 제어가 필요한 설정 화면에서 패스키 관리 옵션을 렌더링하기 위해 임베디드 WebView로 전환하는 경우가 많습니다. 물론 일부 앱은 이 두 흐름을 모두 시스템 WebView로 단순하게 유지합니다. 둘째, 패스키를 도입하기 전에 이미 인증 흐름을 WebView 프레임에 내장한 앱은 일관성을 위해 이 패턴을 계속 사용합니다. 네이티브 WebAuthn 지원이 포함된 임베디드 WebView(AndroidX WebKit 1.12.1+)는 구성 및 설정(권한, 자격 증명, WebView 설정)이 필요하지만, 더 이상 사용자 지정 JavaScript 브릿지 코드가 필요하지 않습니다. 조건부 UI는 임베디드 WebView에서 지원되지 않습니다. 기존 임베디드 인증 패턴을 유지하거나 인증 후 화면을 위한 세션/쿠키 제어가 필요할 때 이 접근 방식을 선택하세요.
궁극적으로 네이티브 앱의 패스키는 사용자 편의성과 보안 측면에서 엄청난 발전을 의미합니다. 네이티브, 시스템 WebView, 임베디드 WebView 등 어떤 방식을 통해 구현하든 패스키는 사용자의 피싱 위험과 비밀번호 관리 부담을 없애 줍니다. VicRoads의 네이티브 앱 패스키 통합과 같은 실제 구현 사례는 네이티브 중심 접근 방식이 자동 패스키 오버레이와 같은 기능과 함께 적절히 실행될 때 사용자 채택과 만족도가 가장 높음을 보여줍니다. 사용자 친화적인 인증을 위한 모범 사례를 따르고 앱의 아키텍처(새로운 앱을 위한 네이티브 중심, OAuth 흐름을 위한 시스템 WebView, 또는 기존 임베디드 패턴을 위한 임베디드 WebView)에 맞는 구현 방식을 선택하면, 모든 사람을 위한 간단하고 안전하며 즐거운 인증이라는 패스키의 비전을 진정으로 실현하는 비밀번호 없는 생체 로그인을 제공할 수 있습니다.
네이티브 앱에서 패스키가 작동하지 않는 경우 구현 방식에 따라 다음과 같은 일반적인 문제를 확인하세요.
application/json.well-known 경로에 리디렉션 없음https://your-domain.com (app:// 아님)webcredentials:yourdomain.com으로 Associated Domains 기능 활성화ASWebAuthenticationSession(권장) 또는 SFSafariViewController 사용?mode=developer로 테스트(프로덕션에서는 제거)WebViewFeature.WEB_AUTHENTICATION에 대한 런타임 기능 확인WEB_AUTHENTICATION_SUPPORT_FOR_APP과 함께 setWebAuthenticationSupport()
호출"NotAllowedError: The request is not allowed by the user agent or the platform in the current context"
setWebAuthenticationSupport() 호출패스키 메시지가 표시되지 않음
?mode=developer 사용, WebView 유형 확인세부적인 디버깅에 대해서는 네이티브 앱의 RP ID에 관한 기사를 참조하세요.
흔히 하는 실수: 제한된 액세스(IP 화이트리스트, VPN 전용)를 사용하는 스테이징 환경은 실패하게 됩니다. Apple 및 Google CDN은 연결 파일을 가져올 수 있어야 합니다.
https://app-site-association.cdn-apple.com/a/v1/your-staging-domain.com?nocache=1https://digitalassetlinks.googleapis.com/v1/statements:list/?source.web.site=https://your-staging-domain.com&relation=delegate_permission/common.handle_all_urls프로덕션 rpID를 사용하는 스테이징 하위 도메인:
스테이징 환경(예: stg.login.example.com)이 프로덕션 도메인을 rpID(예: example.com)로
사용하는 경우 AASA 조회는 스테이징 하위 도메인이 아닌 rpID 도메인에서 발생합니다.
의미:
예 (하나의 AASA를 공유하는 여러 환경):
{ "webcredentials": { "apps": [ "TEAMID123.com.example.app", "TEAMID123.com.example.app.dev", "TEAMID123.com.example.app.stg", "TEAMID123.com.example.app.pre" ] } }
권장 사항: 스테이징 도메인과 일치하는 별도의 스테이징 rpID를 사용하여 환경 간 자격 증명 중첩을 방지하세요. 이를 위해서는 스테이징 도메인에서 대중이 접근 가능한 AASA 파일이 필요합니다.
?mode=developer 관련 설명:
Associated Domains의 ?mode=developer 매개변수는 Apple의 CDN 캐시를 우회하지만 접근
가능 요구 사항을 우회하는 것은 아닙니다. AASA 파일은 여전히 기기에서 접근할 수 있어야
합니다(Apple의 CDN을 통해서가 아니라 직접). 이는 AASA 변경 사항을 적용할 때 개발 중에는
도움이 되지만 스테이징 서버가 IP 화이트리스트에 있는 경우에는 도움이 되지 않습니다.
Corbado 네이티브 SDK:
플랫폼 공식 문서:
검증 도구:
Corbado는 대규모로 consumer authentication을 운영하는 CIAM 팀을 위한 Passkey Intelligence Platform입니다. IDP 로그와 일반 analytics 도구가 보여주지 못하는 것을 볼 수 있게 해드립니다: 어떤 디바이스, OS 버전, 브라우저, credential manager가 passkey를 지원하는지, 왜 등록이 로그인으로 이어지지 않는지, WebAuthn 플로우가 어디서 실패하는지, OS나 브라우저 업데이트가 언제 조용히 로그인을 망가뜨리는지 — Okta, Auth0, Ping, Cognito 또는 자체 IDP를 교체하지 않고도 전부 파악할 수 있습니다. 두 가지 제품: Corbado Observe는 passkey 및 다른 모든 로그인 방식에 대한 observability를 더합니다. Corbado Connect는 analytics가 내장된 managed passkey를 제공합니다 (기존 IDP와 함께). VicRoads는 Corbado로 500만+ 사용자에게 passkey를 운영하고 있습니다 (passkey 활성화율 +80%). Passkey 전문가와 상담하기 →
선택은 앱의 인증 아키텍처에 따라 달라집니다. 앱이 OAuth2 또는 OIDC를 사용하는 경우 시스템 WebView(iOS의 ASWebAuthenticationSession 또는 Android의 Chrome 맞춤 탭)는 구현 노력이 가장 적게 들고 연결 파일 설정이 필요 없습니다. 새로운 네이티브 중심 앱의 경우 네이티브 구현이 우수한 UX를 제공하며, 임베디드 WebView는 인증을 WebView 프레임에 이미 내장했고 로그인 후 세션 또는 쿠키 제어가 필요한 앱에 적합합니다.
SFSafariViewController는 Safari 엔진을 활용하고 SSL 표시기와 함께 URL 표시줄을 보여주며 피싱 보호를 제공하므로 인증 흐름에서 신뢰도를 높여줍니다. WKWebView는 더 많은 UI 사용자 지정 기능을 제공하지만 Safari와 분리된 쿠키 저장소를 갖고 있고, 패스키를 활성화하기 위해 Associated Domains 권한과 AASA 파일이 필요하며 URL 표시줄을 표시하지 않아 사용자의 신뢰 신호를 감소시킵니다.
Chrome 맞춤 탭은 사용자의 Chrome 브라우저와 쿠키 및 저장된 자격 증명을 공유합니다. 즉, 인증 과정 중 Google 비밀번호 관리자에 저장된 패스키에 접근할 수 있습니다. 반면 표준 Android WebView는 독립된 쿠키 저장소를 가지고 URL이나 SSL 표시기를 보여주지 않으며 피싱 위험으로 인해 Google이 Google 계정 로그인에 사용하지 못하도록 명시적으로 금지했습니다.
사용자가 1Password와 같은 타사 자격 증명 관리자를 활성 공급자로 설정한 경우 이 공급자가 패스키의 생성 및 저장을 가로채며 플랫폼의 기본 자격 증명 관리자(iCloud 키체인 또는 Google 비밀번호 관리자)보다 우선순위를 갖는 경우가 많습니다. 즉 패스키가 플랫폼 키체인 대신 타사 앱에 저장되어 기기 간 동기화와 패스키 관리 동작에 영향을 줄 수 있습니다.
MDM 정책이 자격 증명 동기화를 비활성화하면 일반적인 소비자 상황과 달리 패스키가 기기에 묶이게 되며 새 기기로 이동할 수 없게 됩니다. 기업 환경을 타겟팅하는 앱은 사용자가 새로운 관리 기기를 받을 경우를 대비해 비밀번호나 매직 링크 로그인과 같은 대체 인증 메커니즘을 계획해야 합니다.
관련 글
목차