게시일: 2024년 11월 12일, 최종 업데이트: 2024년 11월 29일
WebAuthn Signal API를 사용하면 신뢰 당사자가 연결된 패스키 제공업체에 기존 사용자 인증 정보를 전달할 수 있습니다. 이를 통해 지원 패스키 제공업체는 더 이상 사용자에게 제공되지 않도록 잘못되거나 취소된 패스키를 저장소에서 업데이트하거나 삭제할 수 있습니다.
호환성
데스크톱에서 실행되는 Chrome은 Chrome 132부터 Signal API를 지원합니다. Google 비밀번호 관리자는 신호를 반영하여 패스키를 업데이트할 수 있습니다. Chrome 확장 프로그램 기반 패스키 제공업체의 경우 신호를 반영할지 여부는 제공업체에 달려 있습니다.
Android용 Chrome 지원은 나중에 제공될 예정입니다.
Safari는 지원하지만 아직 구현되지 않았습니다. Firefox는 아직 의견을 공유하지 않았습니다.
배경
패스키 (검색 가능한 사용자 인증 정보)가 생성되면 사용자 이름 및 표시 이름과 같은 메타데이터가 비공개 키와 함께 패스키 제공업체 (예: 비밀번호 관리자)에 저장되고 공개 키 사용자 인증 정보는 신뢰 당사자 (RP)의 서버에 저장됩니다. 사용자 이름과 표시 이름을 저장하면 사용자에게 메시지가 표시될 때 로그인할 제공된 패스키를 식별하는 데 도움이 됩니다. 이는 특히 서로 다른 패스키 제공업체의 패스키가 두 개 이상 있는 경우에 유용합니다.
하지만 비밀번호 제공업체의 비밀번호 목록과 서버의 사용자 인증 정보 목록 간 불일치로 인해 혼란이 발생할 수 있는 몇 가지 사례가 있습니다.
첫 번째 사례는 사용자가 서버에서 사용자 인증 정보를 삭제하여 패스키 공급자의 패스키를 그대로 두는 경우입니다. 다음에 사용자가 패스키로 로그인하려고 하면 패스키 제공업체에서 해당 패스키를 사용자에게 계속 표시합니다. 하지만 서버에서 삭제된 공개 키로 확인할 수 없으므로 로그인 시도가 실패합니다.
두 번째 경우는 사용자가 서버에서 사용자 이름 또는 표시 이름을 업데이트하는 경우입니다. 사용자가 다음에 로그인하려고 하면 서버에서 업데이트되었음에도 불구하고 패스키 제공업체의 패스키에 이전 사용자 이름과 표시 이름이 계속 표시됩니다. 이상적으로는 동기화되어야 합니다.
Signal API
Signal API는 RP가 패스키 제공업체에 변경사항을 알릴 수 있도록 하여 이러한 혼란을 해결하는 WebAuthn API입니다. 다음 세 가지 방법이 있습니다.
PublicKeyCredential.signalUnknownCredential
: 사용자 인증 정보가 존재하지 않음을 알림PublicKeyCredential.signalAllAcceptedCredentials
: 저장된 사용자 인증 정보 목록을 알림PublicKeyCredential.signalCurrentUserDetails
: 업데이트된 사용자 이름 또는 표시 이름 신호
사용자 인증 정보가 없음을 알림
const credential = await navigator.credentials.get({ ... });
const payload = credential.toJSON();
const result = await fetch('/login', { ... });
// Detect authentication failure due to lack of the credential
if (result.status === 404) {
// Feature detection
if (PublicKeyCredential.signalUnknownCredential) {
await PublicKeyCredential.signalUnknownCredential({
rpId: "example.com",
credentialId: "vI0qOggiE3OT01ZRWBYz5l4MEgU0c7PmAA" // base64url encoded credential ID
});
} else {
// Encourage the user to delete the passkey from the password manager nevertheless.
...
}
}
RP는 RP ID와 사용자 인증 정보 ID를 사용하여 PublicKeyCredential.signalUnknownCredential()
를 호출하여 지정된 사용자 인증 정보가 삭제되었거나 존재하지 않음을 패스키 제공업체에 알릴 수 있습니다. 이 신호를 처리하는 방법은 패스키 제공업체에 달려 있지만, 연결된 사용자 인증 정보가 존재하지 않으므로 사용자가 패스키로 로그인하지 않도록 연결된 패스키가 삭제될 것으로 예상됩니다.
이 API는 사용자 인증 정보가 없어 패스키 기반 로그인이 실패한 경우 호출할 수 있습니다. 이렇게 하면 RP가 연결된 사용자 인증 정보가 없는 패스키로 로그인하려는 사용자를 방지할 수 있습니다. signalAllAcceptedCredentials
과 달리 이 메서드는 전체 사용자 인증 정보 ID 목록을 전달하지 않아도 되므로 사용자가 인증되지 않은 경우 특정 사용자의 패스키 수를 공개하지 않도록 이 메서드를 사용해야 합니다.

저장된 사용자 인증 정보 목록을 시그널링합니다.
// After a user deletes a passkey or a user is signed in.
// Feature detection
if (PublicKeyCredential.signalAllAcceptedCredentials) {
await PublicKeyCredential.signalAllAcceptedCredentials({
rpId: "example.com",
userId: "M2YPl-KGnA8", // base64url encoded user ID
allAcceptedCredentialIds: [ // A list of base64url encoded credential IDs
"vI0qOggiE3OT01ZRWBYz5l4MEgU0c7PmAA",
...
]
});
}
RP는 RP ID, 사용자 ID, 저장된 사용자 인증 정보의 사용자 인증 정보 ID 목록을 사용하여 PublicKeyCredential.signalAllAcceptedCredentials()
를 호출하여 저장소에 남아 있는 사용자 인증 정보를 패스키 제공업체에 알릴 수 있습니다. 이 신호를 처리하는 방법은 패스키 제공업체에 달려 있지만 이 목록과 일치하지 않는 패스키는 삭제되어 사용자가 연결된 사용자 인증 정보가 없는 로그인 시 패스키를 보지 않도록 해야 합니다.
이 API는 RP에서 사용자가 패스키를 삭제할 때와 모든 로그인 시 호출되어야 패스키 제공업체가 패스키 목록을 동기화된 상태로 유지할 수 있습니다.
업데이트된 사용자 이름 및 표시 이름 신호
// After a user updated their username and/or display name
// or a user is signed in.
// Feature detection
if (PublicKeyCredential.signalCurrentUserDetails) {
await PublicKeyCredential.signalCurrentUserDetails({
rpId: "example.com",
userId: "M2YPl-KGnA8", // base64url encoded user ID
name: "a.new.email.address@example.com", // username
displayName: "J. Doe"
});
} else {
}
RP는 RP ID, 사용자 ID, 사용자 이름, 표시 이름으로 PublicKeyCredential.signalCurrentUserDetails()
를 호출하여 업데이트된 사용자 정보를 패스키 제공자에게 알릴 수 있습니다. 이 신호를 처리하는 방법은 패스키 제공업체에 달려 있지만 사용자가 소유한 패스키는 새 사용자 정보로 업데이트되어야 합니다.
이 API는 사용자의 사용자 이름 또는 표시 이름이 업데이트될 때와 로그인할 때마다 호출될 수 있으므로 패스키 제공업체가 이 정보를 서버와 동기화할 수 있습니다.

요약
신호 API는 예기치 않은 로그인 실패 가능성을 없애 더 나은 패스키 환경을 구축하는 데 도움이 됩니다. 신호 API를 사용하면 신뢰 당사자가 기존 사용자 인증 정보 목록과 메타데이터를 전달하여 패스키 제공업체의 패스키를 동기화할 수 있습니다.
패스키에 대해 자세히 알아보려면 패스키를 사용한 패스워드리스 로그인을 참고하세요.