조직과 개발자는 사용자를 비밀번호에서 패스키로 이동할 때 상당한 장애물에 직면합니다. 패스키는 중요한 보안 업그레이드를 제공하지만 수동 생성 프로세스는 마찰을 일으키는 경우가 많습니다. 거래량이 많은 전자상거래 환경에서는 모든 망설임이 중요합니다. 지연이 발생하면 구매 경로가 중단되고 장바구니가 포기될 수 있기 때문입니다. 또한 서버와 사용자의 기기 간에 사용자 인증 정보 상태를 동기화하는 것은 로그인 오류와 사용자 불만을 방지하는 데 필수적입니다.
adidas는 이러한 문제를 정확히 겪었습니다. Google의 기본 목표는 로그인 프로세스에서 불편함을 없애고 웹, 앱 플랫폼, 기기 전반에서 환경을 간소화하는 것이었습니다. 보안이 최우선 순위로 유지되는 가운데 제품팀은 패스키를 사용하여 가입 및 로그인 흐름을 최대한 원활하게 만드는 데 집중했습니다.
이러한 문제를 해결하기 위해 adidas는 조건부 생성을 구현하여 비밀번호 사용자를 패스키로 자동 업그레이드하고 신호 API를 사용하여 사용자 인증 정보를 일관되게 유지했습니다. 또한 필요한 경우 교차 도메인 사용을 지원하기 위해 관련 출처 요청을 배포했습니다.
결과
패스키 생성을 자동화하고 사용자 인증 정보 상태를 유지하는 adidas의 전략은 채택률과 로그인 안정성 모두에서 즉각적이고 측정 가능한 결과를 가져왔습니다.
- 높은 채택률: 패스키 로그인 프로세스를 출시한 이후 adidas는 전체 패스키 생성률 47%를 달성했습니다. 여기에는 가입 또는 로그인 흐름 중에 메시지가 표시될 때 자동 조건부 생성과 사용자 시작 선택이 모두 포함됩니다. 이러한 채택은 특히 모바일 기기에서 높았으며, 모바일 기기의 전환율은 52% 였습니다 (데스크톱의 전환율은 34%).
- 조건부 생성을 사용한 업그레이드 가속화: 명시적 메시지 외에도 adidas는 수동 사용자 작업이 필요 없이 백그라운드에서 기존 비밀번호 사용자를 원활하게 업그레이드하여 패스키 생성을 8% 늘렸습니다.
- 거의 완벽한 로그인 안정성: 로그인 시작 후 패스키의 성공률은 99% 이상입니다. 이는 adidas의 기존 비밀번호 성공률인 70%에 비해 크게 향상된 보안 수준입니다. 기존에는 오타나 잊어버린 사용자 인증 정보와 같은 인적 오류로 인해 성공률이 종종 낮아졌습니다.
- 마찰 및 오류 최소화: adidas는 신호 API를 배포하여 기기와 서버 사용자 인증 정보를 자동으로 동기화함으로써
PASSKEY_NOT_FOUND오류를 로그인 시도의 0.3% 미만으로 유지했습니다. 이를 통해 고아 패스키로 인한 사용자 불편이 효과적으로 해소되었습니다.
47 %
패스키 생성률
8 %
조건부 생성을 사용한 패스키 생성 증가
>99 %
시작된 후의 패스키 로그인 성공률
<0.3 %
고아 패스키 오류율
adidas가 문제를 해결한 방법
adidas는 이러한 문제를 다음과 같이 해결했습니다.
1. 조건부 만들기로 도입 가속화
사용자가 원활하게 패스키를 채택할 수 있도록 adidas는 조건부 생성을 구현했습니다. 이 기능을 사용하면 사용자가 비밀번호 관리자에 저장된 비밀번호로 로그인할 때 웹사이트에서 패스키를 자동으로 생성할 수 있습니다. 성공률을 최대한 높이기 위해 시스템은 로그인이 성공한 직후에 API를 호출하여 시스템이 비밀번호 사용을 최근으로 인식하도록 합니다.
const cred = await navigator.credentials.create({
publicKey: options,
mediation: 'conditional' // Enables automatic passkey creation
});
adidas는 먼저 사용자의 환경을 검증하는 맞춤 로직과 이 기능을 통합했습니다. 특히 시스템은 조건부 생성 기능이 브라우저에서 지원되는지 확인합니다. 또한 사용자가 지난 6개월 동안 패스키 생성을 세 번 이미 건너뛴 경우 시스템에서 프롬프트를 표시하지 않아 사용자 환경설정을 존중합니다.
환경이 호환되면 시스템은 사용자 인증이 성공한 직후 백그라운드에서 패스키를 생성하려고 시도합니다. 이 특정 시점은 기본 요건이 충족될 가능성을 높입니다. 중요한 점은 구현이 항상 사용자 액세스를 우선시하기 위해 '실패 시 열기' 철학으로 WebAuthn 예외를 처리한다는 것입니다. 브라우저에서 패스키가 이미 존재할 가능성이 있음을 나타내는 InvalidStateError를 보고하면 시스템은 백그라운드 생성을 중지하고 사용자를 즉시 로그인합니다. 반대로 NotAllowedError가 발생하면 자동 생성의 특정 조건이 충족되지 않았음을 의미하며, 시스템은 이 상태를 감지하고 사용자를 '패스키 수집기' 화면으로 안내하여 수동 설정 프로세스를 안내합니다. 이러한 기술적 제약과 사용자 행동을 구분함으로써 adidas는 패스키 업그레이드 추진이 로그인 환경을 방해하지 않고 개선하도록 보장합니다.
2. Signal API로 안정성 보장
사용자가 여러 기기에서 사용자 인증 정보를 관리할 때 불일치가 발생할 수 있습니다. 예를 들어 패스키가 서버에서 삭제되었지만 사용자의 기기에는 남아 있을 수 있습니다. 이러한 '팬텀' 사용자 인증 정보로 인한 로그인 실패를 방지하기 위해 adidas는 Signal API를 구현했습니다. 이 API를 사용하면 서버가 패스키 제공업체에 사용자 인증 정보의 상태를 알릴 수 있습니다.
adidas는 사용 가능한 세 가지 신호 API 메서드를 모두 사용하여 이러한 일관성을 유지합니다. 삭제할 사용자 인증 정보를 추측하는 대신 adidas는 특정 사용자 수명 주기 이벤트를 적절한 API 호출에 매핑합니다.
- 등록 실패: 클라이언트에서 패스키가 생성되었지만 백엔드에 등록되지 않은 경우 adidas는
signalUnknownCredential를 사용하여 고아 사용자 인증 정보를 즉시 삭제합니다. - 잘못된 로그인: 사용자가 취소되었거나 오래된 패스키로 로그인을 시도하면
signalUnknownCredential에서 제공자에게 이를 숨기라고 신호를 보냅니다. - 사용자 관리: 사용자가 계정 설정에서 패스키를 명시적으로 삭제하면
signalAllAcceptedCredentials에서 허용 목록을 동기화합니다. 이렇게 하면 삭제된 패스키가 더 이상 제공되지 않습니다. - 계정 업데이트: 사용자가 이메일이나 사용자 이름을 변경하면
signalCurrentUserDetails에서 서버와 일치하도록 기기의 메타데이터를 업데이트합니다.
// Detect authentication failure due to lack of the credential
if (result.status === 404) {
if (PublicKeyCredential.signalUnknownCredential) {
await PublicKeyCredential.signalUnknownCredential({
rpId: "adidas.com",
credentialId: "..." // base64url encoded credential ID
});
}
}
3. 관련 출처 요청 및 디지털 애셋 링크를 사용하여 액세스 통합
adidas는 멀티 마켓 아키텍처를 더욱 지원하기 위해 관련 출처 요청을 구현했습니다. 대부분의 사용자는 현지 시장 (예: adidas.nl)을 이용하지만 이 구성을 사용하면 지역 간에 이동하는 사용자가 단일 신뢰 당사자 ID (adidas.com)를 타겟팅하여 허용된 도메인에서 패스키를 재사용할 수 있습니다.
이를 사용 설정하기 위해 adidas는 기본 신뢰 당사자 ID (RP ID) 도메인에 webauthn 구성 파일을 호스팅합니다. 이 파일에는 패스키 등록 및 인증에 adidas.com를 사용할 수 있는 출처의 명시적 허용 목록이 포함되어 있습니다. 이러한 관계를 정의하면 브라우저가 한 지역 사이트에서 생성된 패스키가 다른 지역 사이트에서 사용하기에 유효한지 확인할 수 있으므로 전 세계 사용자에게 원활한 환경을 제공할 수 있습니다.
// https://www.adidas.com/.well-known/webauthn
{
"origins": [
"https://www.adidas.fi",
"https://www.adidas.nl",
// ... abridged (the full file lists 50+ regional domains)
]
}
중요한 점은 adidas가 디지털 애셋 링크를 사용하여 Android 모바일 앱 내에서 원활한 패스키 지원을 제공했다는 것입니다. 앱이 인증을 위해 idp.adidas.com에서 호스팅되는 WebView를 사용하므로 Android 앱과 신뢰 당사자 ID (adidas.com) 간의 신뢰 관계를 설정하기 위해 디지털 애셋 링크가 필요했습니다. 이 확인을 통해 앱은 웹에서 사용되는 동일한 패스키에 액세스하여 플랫폼 전반에서 원활하고 통합된 로그인 환경을 만들 수 있습니다.
이를 위해 adidas는 각 웹 도메인에 디지털 애셋 링크 (assetlinks.json) 파일을 호스팅합니다. 이 파일은 Android 애플리케이션과의 암호화 연결을 공개적으로 선언합니다. 마찬가지로 adidas는 iOS 생태계를 지원하기 위해 연결된 도메인을 사용합니다.
apple-app-site-association 파일을 호스팅하여 iOS 앱이 웹 뷰에서 패스키를 안전하게 사용할 수 있는 보안 연결을 설정합니다.
// https://www.adidas.fi/.well-known/assetlinks.json
[
{
"relation": [
"delegate_permission/common.handle_all_urls",
"delegate_permission/common.get_login_creds"
],
"target": {
"namespace": "android_app",
"package_name": "com.adidas.app",
"sha256_cert_fingerprints": [
"B2:55:43:78:89:F6:F6:FD:BB:16:5C:43:EE:66:14:18:D4:E8:33:6D:3A:1F:68:86:C3:A8:7C:89:2B:51:45:96",
"..."
]
}
},
// ... abridged
]
아디다스의 다음 단계는 무엇인가요?
adidas는 adidas.fi 및 adidas.nl에서 자동 업그레이드와 동기화된 사용자 인증 정보가 적용된 강력한 기반을 바탕으로 2026년 4월 말까지 다른 모든 글로벌 시장에 이 원활한 설정을 배포할 예정입니다. 또한 adidas는 즉각적인 미디에이션 출처 트라이얼을 테스트하여 더욱 원활한 로그인 환경을 모색하고 있습니다. 향후 계획에는 사용자가 패스키로 직접 계정을 만들 수 있도록 하는 것이 포함됩니다. 이렇게 하면 먼저 대체 방법으로 가입해야 하는 현재 요구사항이 삭제됩니다. 또한 팀은 로그인 2단계에서 시스템 패스키 대화상자를 직접 호출하기 위해 '스마트 트리거링'을 조사하고 있습니다. 이렇게 하면 사용자가 현재 기기에서 패스키를 사용할 수 있다고 확신하는 경우 추가 클릭이 필요하지 않습니다.
이번 이전이 중요한 이유
사용자 환경이 원활하게 유지되면 암호 없는 인증으로의 전환이 성공합니다. 조건부 생성을 구현하면 사용자의 습관을 방해하지 않고도 비밀번호에서 사용자를 손쉽게 이전할 수 있습니다. 관련 원본 요청을 사용하면 도메인 간에 패스키를 공유하여 사용자가 단일 패스키로 전체 생태계에 원활하게 액세스할 수 있습니다. 마지막으로 이를 Signal API와 페어링하면 통합된 비밀번호 없는 환경이 안정적이고 오류가 없는 상태로 유지됩니다.