Signal API를 사용하여 패스키를 서버의 사용자 인증 정보와 일치시키기

게시일: 2024년 11월 12일, 최종 업데이트: 2024년 11월 29일

WebAuthn Signal API를 사용하면 신뢰 당사자가 연결된 패스키 제공업체에 기존 사용자 인증 정보를 전달할 수 있습니다. 이를 통해 지원 패스키 제공업체는 더 이상 사용자에게 제공되지 않도록 잘못되거나 취소된 패스키를 저장소에서 업데이트하거나 삭제할 수 있습니다.

호환성

Chrome은 모든 데스크톱 플랫폼과 Android에서 Signal API를 지원합니다.

Safari는 지원하지만 아직 구현되지 않았습니다. Firefox는 아직 의견을 공유하지 않았습니다.

Google 비밀번호 관리자는 신호를 반영하도록 패스키를 업데이트할 수 있습니다. 데스크톱의 Chrome 확장 프로그램 기반 패스키 제공업체는 신호를 반영할지 여부를 결정합니다.

배경

패스키 (검색 가능한 사용자 인증 정보)가 생성되면 사용자 이름 및 표시 이름과 같은 메타데이터가 비공개 키와 함께 패스키 제공업체 (예: 비밀번호 관리자)에 저장되고 공개 키 사용자 인증 정보는 신뢰 당사자 (RP)의 서버에 저장됩니다. 사용자 이름과 표시 이름을 저장하면 사용자에게 메시지가 표시될 때 로그인에 사용할 패스키를 식별하는 데 도움이 됩니다. 이 기능은 사용자가 서로 다른 패스키 제공업체의 패스키를 3개 이상 보유한 경우에 특히 유용합니다.

하지만 비밀번호 제공업체의 비밀번호 목록과 서버의 사용자 인증 정보 목록 간의 불일치로 인해 혼동이 발생할 수 있는 몇 가지 사례가 있습니다.

첫 번째 사례는 사용자가 서버에서 사용자 인증 정보를 삭제하는 경우입니다. 이렇게 하면 패스키 제공업체의 패스키가 그대로 유지됩니다. 다음에 사용자가 패스키로 로그인하려고 하면 패스키 제공업체는 여전히 해당 패스키를 사용자에게 표시합니다. 하지만 서버에서 삭제된 공개 키를 확인할 수 없으므로 로그인 시도가 실패합니다.

두 번째 경우는 사용자가 서버에서 사용자 이름 또는 표시 이름을 업데이트하는 경우입니다. 사용자가 다음에 로그인하려고 하면 서버에서 업데이트되었더라도 패스키 제공업체의 패스키에 이전 사용자 이름과 표시 이름이 계속 표시됩니다. 이상적으로는 동기화되어야 합니다.

Signal API

Signal API는 RP가 패스키 제공업체에 변경사항을 알릴 수 있도록 하여 이러한 불일치를 해결하는 WebAuthn API입니다. 다음 세 가지 방법이 있습니다.

사용자 인증 정보가 없음을 알림

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()를 호출하여 지정된 사용자 인증 정보가 삭제되었거나 존재하지 않음을 패스키 제공업체에 알릴 수 있습니다. 패스키 제공업체는 이 신호를 처리하는 방법을 결정하지만, 사용자가 연결된 사용자 인증 정보가 없는 패스키로 로그인하려고 하지 않도록 연결된 패스키를 삭제해야 합니다.

Browser Support

  • Chrome: 132.
  • Edge: 132.
  • Firefox: not supported.
  • Safari: 26.

Source

이 API는 사용자 인증 정보가 없어 패스키 기반 로그인이 실패한 경우 호출할 수 있습니다. 이렇게 하면 RP가 연결된 사용자 인증 정보가 없는 패스키로 로그인하려는 사용자를 방지할 수 있습니다. signalAllAcceptedCredentials과 달리 이 메서드는 전체 사용자 인증 정보 ID 목록을 전달하지 않아도 되므로 사용자가 인증되지 않은 경우 특정 사용자의 패스키 수를 공개하지 않으려면 이 메서드를 사용하세요.

Chrome의 Google 비밀번호 관리자에서 패스키가 삭제될 때 표시되는 대화상자
Chrome의 Google 비밀번호 관리자에서 패스키가 삭제될 때 표시되는 대화상자

저장된 사용자 인증 정보 목록을 시그널링합니다.

// 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",
      ...
    ]
  });
}

사용자가 로그인하거나 계정 설정을 관리한 후 PublicKeyCredential.signalAllAcceptedCredentials()를 사용합니다. 해당 사용자의 모든 유효한 사용자 인증 정보 ID 목록을 제공합니다. 패스키 제공업체는 이 목록을 해당 신뢰 당사자의 로컬 저장소와 비교합니다. 비밀번호 제공업체는 스토리지에서 allAcceptedCredentialIds 목록에 포함되지 않은 비밀번호를 '숨김'으로 표시합니다. 시스템에서는 더 이상 로그인 또는 자동 완성을 위해 이러한 숨겨진 패스키를 제공하지 않지만 즉시 영구적으로 삭제되지는 않으므로 필요한 경우 복원할 수 있습니다. 반대로 패스키 제공자는 '숨김'으로 표시된 allAcceptedCredentialIds에 있는 패스키를 복원합니다. 이렇게 하면 웹사이트에서 실수로 숨겨진 패스키를 복원할 수 있습니다.

Browser Support

  • Chrome: 132.
  • Edge: 132.
  • Firefox: not supported.
  • Safari: 26.

Source

패스키 제공자가 동기화된 패스키 목록을 유지할 수 있도록 RP에서 사용자가 패스키를 삭제할 때로그인할 때마다 이 API를 호출하세요.

업데이트된 사용자 이름 및 표시 이름 신호

// 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()를 호출하여 업데이트된 사용자 정보를 패스키 제공자에게 알릴 수 있습니다. 패스키 제공업체는 이 신호를 처리하는 방법을 결정하지만 사용자가 소유한 패스키를 새 사용자 정보로 업데이트해야 합니다.

Browser Support

  • Chrome: 132.
  • Edge: 132.
  • Firefox: not supported.
  • Safari: 26.

Source

이 API는 사용자의 사용자 이름 또는 표시 이름이 업데이트될 때로그인할 때마다 호출될 수 있으므로 패스키 제공업체가 이 정보를 서버와 동기화된 상태로 유지할 수 있습니다.

Chrome의 Google 비밀번호 관리자에서 패스키 메타데이터가 업데이트될 때 표시되는 대화상자
Chrome의 Google 비밀번호 관리자에서 패스키 메타데이터가 업데이트될 때 표시되는 대화상자

요약

신호 API는 예기치 않은 로그인 실패를 없애 더 나은 패스키 환경을 구축하는 데 도움이 됩니다. 신호 API를 사용하면 신뢰 당사자가 기존 사용자 인증 정보 목록과 메타데이터를 전달하여 패스키 제공업체의 패스키를 동기화할 수 있습니다.

패스키에 관해 자세히 알아보려면 패스키를 사용한 패스워드리스 로그인을 참고하세요.