이 문서에서는 WebAuthn에 있는 userVerification
와 패스키 생성 또는 인증 중에 userVerification
가 지정되면 발생하는 브라우저 동작을 설명합니다.
WebAuthn에서 '사용자 확인'이란 무엇인가요?
패스키는 공개 키 암호화를 기반으로 합니다. 패스키를 만들면 공개 키/비공개 키 쌍이 생성되고, 패스키 제공업체가 비공개 키를 저장하고, 공개 키가 신뢰 당사자 (RP) 서버에 반환되어 저장됩니다. 서버는 페어링된 공개 키를 사용하여 동일한 패스키로 서명된 서명을 확인하여 사용자를 인증할 수 있습니다. 공개 키 사용자 인증 정보의 '사용자가 있음' (UP) 플래그는 인증 중에 누군가 기기와 상호작용했음을 나타냅니다.
사용자 확인은 선택적인 보안 계층으로, 사용자 접속 상�� 어설션에서처럼 인증 과정에서 특정 사람이 아닌 올바른 사람이 존재했는지를 어설션하려고 시도합니다. 스마트폰에서 보통 화면 잠금 메커니즘(생체 ������이든 PIN이나 비밀번호든)을 사용하여 이 작업을 수행합니다. 사용자 확인 수행 여부는 패스키 등록 및 인증 중에 인증자 데이터에 반환되는 'UV' 플래그에 보고됩니다.
![macOS의 iCloud 키체인에 있는 사용자 확인 대화상자의 스크린샷 대화상자에는 Touch ID를 사용하여 로그인하라는 메시지가 사용자에게 표시되며 인증을 요청하는 출처와 사용자 이름이 표시됩니다. 대화상자의 오른쪽 상단에는 '취소'라는 버튼이 있습니다.](https://cdn.statically.io/img/web.dev/static/articles/webauthn-user-verification/image/fig-1.png?hl=ko)
![Android용 Chrome의 사용자 확인 대화상자 스크린샷. 대화상자에는 사용자에게 얼굴 인식 또는 지문 인식을 사용하여 신원을 확인하라는 메시지가 표시되고 인증을 요청하는 출처가 표시됩니다. 왼쪽 하단에 PIN을 사용하여 인증하는 옵션이 있습니다.](https://cdn.statically.io/img/web.dev/static/articles/webauthn-user-verification/image/fig-2.png?hl=ko)
서버에서 UP 및 UV를 검증하는 방법
사용자 정보 (UP) 및 사용자 확인 (UV) 부울 플래그는 인증자 데이터 필드를 통해 서버에 신호를 보냅니다. 인증하는 동안 저장된 공개 키로 서명을 확인하여 인증자 데이터 필드의 내용을 검증할 수 있습니다. 서명이 유효하면 서버에서 플래그를 진짜라고 간주할 수 있습니다.
![인증 데이터 구조의 이미지. 데이터 구조의 각 섹션은 왼쪽에서 오른쪽으로 'RP ID HASH' (32바이트), 'FLAGS' (1바이트), 'COUNTER' (4바이트, big-endian uint32), 'ATTESTE CRED로 표시됩니다. DATA' (있는 경우 가변 길이) 및 'EXTENSIONS' (있는 경우 가변 길이 (CBOR))입니다. 'FLAGS' 섹션이 확장되어 왼쪽에서 오른쪽으로 'ED', 'AT', '0', 'BS', 'BE', 'UV', '0' 및 'UP'으로 라벨이 지정된 잠재적 플래그 목록을 표시합니다.](https://cdn.statically.io/img/web.dev/static/articles/webauthn-user-verification/image/fig-3.png?hl=ko)
패스키 등록 및 인증 시 서버는 요구사항에 따라 UP 플래그가 true
인지, UV 플래그가 true
인지 false
인지 검사해야 합니다.
userVerification
매개변수 지정
WebAuthn 사양에 따라 RP는 사용자 인증 정보 생성 및 어설션 모두에서 userVerification
매개변수를 사용하여 사용자 인증을 요청할 수 있습니다. 각각 다음을 의미하는 'preferred'
, 'required'
또는 'discouraged'
를 허용합니다.
'preferred'
(기본값): 기기에서 사용자 확인 방법을 사용하는 것이 좋지만 사용할 수 없는 경우 건너뛰어도 됩니다. 응답 사용자 인증 정보에는 사용자 확인이 실행된 경우 UV 플래그 값true
, UV가 실행되지 않은 경우false
가 포함됩니다.'required'
: 기기에서 사용할 수 있는 사용자 확인 방법을 호출해야 합니다. 이를 사용할 수 없으면 로컬에서 요청이 실패합니다. 즉, 응답 사용자 인증 정보가 항상 UV 플래그가true
로 설정된 상태로 반환됩니다.'discouraged'
: 사용자 확인 방법을 사용하지 않는 것이 좋습니다. 하지만 기기에 따라 사용자 확인이 어차피 실행될 수 있으며 UV 플래그에는true
또는false
가 포함될 수 있습니다.
패스키 생성을 위한 샘플 코드:
const publicKeyCredentialCreationOptions = {
// ...
authenticatorSelection: {
authenticatorAttachment: 'platform',
residentKey: 'required',
requireResidentKey: true,
userVerification: 'preferred'
}
};
const credential = await navigator.credentials.create({
publicKey: publicKeyCredentialCreationOptions
});
패스키 인증을 위한 샘플 코드:
const publicKeyCredentialRequestOptions = {
challenge: /* Omitted challenge data... */,
rpId: 'example.com',
userVerification: 'preferred'
};
const credential = await navigator.credentials.get({
publicKey: publicKeyCredentialRequestOptions
});
userVerification
에 어떤 옵션을 선택해야 할까요?
사용해야 하는 userVerification
값은 애플리케이션 요구사항과 사용자 환경 요구사항에 따라 다릅니다.
userVerification='preferred'
사용 시점
보호보다 사용자 환경을 우선시하는 경우 userVerification='preferred'
를 사용하세요.
사용자 확인이 보호보다 더 불편한 환경이 있습니다. 예를 들어, macOS에서 Touch ID를 지원하지 않는 경우 (기기가 지원하지 않거나 사용 중지되었거나 기기가 폴더형 모드이므로) 사용자에게 시스템 비밀번호를 입��하라는 메시지가 표시됩니다. 이로 인해 문제가 발생하고 사용자가 인증을 완전히 포기할 수 있습니다. 불편함을 없애는 것이 더 중요하다면 userVerification='preferred'
를 사용하세요.
![Touch ID를 사용할 수 없을 때 표시되는 macOS의 패스키 대화상자 스크린샷 대화상자에는 사용자 이름뿐 아니라 인증을 요청하는 출처와 같은 정보가 포함됩니다. 대화상자의 오른쪽 상단에는 '취소'라는 버튼이 있습니다.](https://cdn.statically.io/img/web.dev/static/articles/webauthn-user-verification/image/fig-4.png?hl=ko)
userVerification='preferred'
를 사용하는 경우 UV 플래그는 사용자 확인이 완료되면 true
이고, 사용자 확인을 건너뛰면 false
입니다. 예를 들어 Touch ID를 사용할 수 없는 macOS에서는 사용자에게 사용자 확인을 건너뛰려면 버튼을 클릭하도록 요청하고 공개 키 사용자 인증 정보에 false
UV 플래그가 포함됩니다.
그러면 UV 플래그는 위험 분석에서 신호가 될 수 있습니다. 다른 요인으로 인해 로그인 시도가 위험해 보이는 경우 사용자 인증을 수행하지 않은 경우 사용자에게 추가 로그인 질문을 제시할 수 있습니다.
userVerification='required'
사용 시점
UP과 UV가 모두 꼭 필요하다고 생각된다면 userVerification='required'
를 사용하세요.
이 옵션의 단점은 사용자가 로그인할 때 더 많은 마찰을 경험할 수 있다는 것입니다. 예를 들어 Touch ID를 사용할 수 없는 macOS에서는 사용자에게 시스템 비밀번호를 입력하라는 메시지가 표시됩니다.
userVerification='required'
를 사용하면 기기에서 사용자 인증이 실행되도록 할 수 있습니다. 서버에서 UV 플래그가 true
인지 확인해야 합니다.
결론
패스키를 사용하는 업체는 사용자 인증을 활용하여 기기 소유자가 로그인할 가능성을 측정할 수 있습니다. 사용자 확인을 요구할지 아니면 대체 로그인 메커니즘이 사용자 플로우에 미치는 영향의 중요도에 따라 선택적으로 설정할 수 있습니다. 서버에서 패스키 사용자 인증을 위해 UP 플래그와 UV 플래그를 확인해야 합니다.