Copyright © 2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
이 문서는 사용자 에이전트가 제시 및 발급을 중개할 수 있도록 하는 API를 명세하며, 대상은 디지털 자격 증명으로, 예를 들면 운전면허증, 정부 발급 신분증 또는 기타 유형의 디지털 자격 증명이 있다. 이 API는 자격 증명 관리 레벨 1을 기반으로 하며 특정 자격 증명 형식에 종속되지 않도록 설계되었다.
이 절에서는 이 문서가 발행된 시점의 상태를 설명한다. 현재 W3C 발행물 목록과 이 기술 보고서의 최신 개정판은 W3C 표준 및 초안 색인에서 확인할 수 있다.
이 문서는 연합 신원 작업 그룹이 권고안 트랙을 사용하여 작업 초안으로 발행했다.
작업 초안으로 발행되었다고 해서 W3C 및 그 회원이 이를 승인한다는 의미는 아니다.
이 문서는 초안이며 언제든 다른 문서에 의해 갱신, 대체 또는 폐기될 수 있다. 이 문서를 진행 중인 작업 이외의 것으로 인용하는 것은 적절하지 않다.
이 문서는 W3C 특허 정책에 따라 운영되는 그룹이 작성했다. W3C는 이 그룹의 산출물과 관련하여 이루어진 모든 특허 공개의 공개 목록을 유지하며, 해당 페이지에는 특허를 공개하기 위한 지침도 포함되어 있다. 자신이 알고 있는 특허에 필수 청구항이 포함되어 있다고 판단하는 개인은 W3C 특허 정책의 제6절에 따라 해당 정보를 공개해야 한다.
이 문서는 2025년 8월 18일 W3C 프로세스 문서의 적용을 받는다.
이 절은 비규범적이다.
이 문서는 웹사이트가 디지털 자격 증명의 제시 및 발급을 요청할 수 있도록 하는 API를 정의한다.
이 API는 자격 증명 형식에 종속되지 않으며 여러 제시 프로토콜 및 발급 프로토콜로 확장할 수 있도록 설계되었다. 5. 프로토콜을 참조하라.
이 API는 다음 목표를 지원하도록 설계되었다:
여러 유형의 디지털 자격 증명을 이 API를 사용하여 제시하고 발급할 수 있다. 이러한 유형의 예에는 다음이 포함된다:
이 절은 비규범적이다.
다음 예는 API를 사용하여 디지털 자격 증명을 요청하고 발급하는 방법을 보여준다.
API를 사용하기 전에 사용자 에이전트가 필요한 기능을 지원하는지 확인하는 것이 중요하다. 이는 다음 코드를 사용하여 수행할 수 있다:
if (typeof DigitalCredential !== "undefined") {
// API가 지원된다
} else {
// API가 지원되지 않는다
}
userAgentAllowsProtocol()
정적 메서드는 사용자 에이전트가 디지털 자격 증명의 발급 또는 제시에 대해 특정 프로토콜을 허용하는지
확인하는 데 사용할 수 있다. 이는 API 호출을 수행하기 전에
사용자의 브라우저에서 어떤 프로토콜이 허용되는지 확인하는 데 유용하다. DigitalCredential을 구현하는 브라우저에서는
(위에 표시된 typeof 검사로 감지할 수 있음), 프로토콜 식별자가
DigitalCredentialProtocol에
사용자 에이전트가 이에 대한 지원을 채택함에 따라 점진적으로 추가되므로,
알 수 없는 프로토콜 식별자로 이 메서드를 호출하면
예외를 던지지 않고 안전하게 false를 반환한다. 예외. 단,
DigitalCredential이 정의되지 않은 브라우저에서 이
메서드를 호출하면 ReferenceError가 발생하므로, 위에 표시된
typeof DigitalCredential !==
"undefined" 가드는 이
메서드를 사용하기 전에 여전히 필요하다.
if (DigitalCredential.userAgentAllowsProtocol("example-protocol")) {
// DC API가 지원된다. 발급 또는 제시를 계속 진행한다.
} else {
// DC API가 지원되지 않는다. 예를 들어
// 기존 HTML 폼 기반 방식으로 대체한다.
showHTMLForm();
}
또는 여러 프로토콜에 대한 지원을 확인하면서 지원되지 않는 프로토콜을 걸러낼 수 있다:
const protocols = [
"example-issuance-protocol",
"another-issuance-protocol"
];
const supportedProtocols = protocols.filter(DigitalCredential.userAgentAllowsProtocol);
if (supportedProtocols.length > 0) {
// 하나 이상의 프로토콜이 지원된다. 발급을 계속 진행한다.
} else {
// 지원되는 프로토콜이 없다. 다른 발급 방법으로 대체한다.
}
프로토콜 식별자는 DigitalCredentialProtocol에
점진적으로 추가되므로, 이 메서드를 사용하여 최신 프로토콜을 우선하면서
레거시 브라우저에서는 이전 프로토콜로 자연스럽게 대체할 수 있다:
// 선호도 순으로 정렬됨. DigitalCredential을 구현하는 브라우저에서는
// 알 수 없는 프로토콜이 예외를 던지는 대신 false를 반환한다.
const protocol = [
"example-new-protocol",
"example-legacy-protocol",
].find(DigitalCredential.userAgentAllowsProtocol);
if (protocol) {
// 이 브라우저가 지원하는 최선의 프로토콜을 사용한다.
} else {
// 지원되는 프로토콜을 찾지 못했다. 다른 방식으로 대체한다.
}
다음 예는
API를 사용하여 디지털 자격 증명을 요청하는 방법을 보여준다. API의
진입점은
navigator.credentials.get() 메서드이며,
이 메서드는
사용자 에이전트로부터 디지털 자격 증명을 요청하는 데
사용된다. 사용자
에이전트가 제시를
지원하는 경우, 사용자가 디지털 자격 증명 선택기를 통해 디지털
자격 증명을 선택할 수 있도록 한다:
<button>신원 확인</button>
<script>
const button = document.querySelector("button");
button.addEventListener("click", async () => {
const protocol = "example-request-protocol";
// DC API 및 프로토콜 지원을 확인한다
if (!DigitalCredential.userAgentAllowsProtocol(protocol)) {
// 브라우저가 이 프로토콜의 사용을 허용하지 않는다.
// 다른 검증 방법으로 대체한다.
showTraditionalVerificationForm();
return;
}
try {
const credential = await navigator.credentials.get({
digital: {
requests: [{
protocol,
data: { /* 제시 요청 데이터 */ }
}]
}
});
// 복호화 및 검증을 위해 검증자 서버로 다시 전송한다
const response = await fetch("/verify-credential", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(credential)
});
// 응답을 확인한다
if (!response.ok) {
throw new Error("Failed to verify credential");
}
// 검증 결과를 렌더링한다
displayVerificationResult(await response.json());
} catch (error) {
console.error("Error requesting digital credential:", error);
}
});
</script>
마찬가지로 사이트에서 디지털 자격 증명을 발급해야 하는 경우, 디지털 자격 증명 API는 사이트, 사용자 에이전트, 그리고 보유자의 자격 증명 관리자 간의 디지털 자격 증명 발급을 자격 증명 관리자 선택기를 통해 중개합니다.
다음 예는 디지털
자격 증명 API를 사용하여 디지털
자격 증명의 발급을 요청하는 방법을 보여준다. 디지털 자격 증명을 발급하려면 사이트가
navigator.credentials.create()
메서드를 호출하며,
사용자 에이전트가 발급을 지원하는 경우 이 메서드는 발급
흐름을 시작한다:
<button>디지털 자격 증명 발급 요청</button>
<script>
const button = document.querySelector("button");
button.addEventListener("click", async () => {
const protocol = "example-issuance-protocol";
// DC API 및 프로토콜 지원을 확인한다
if (!DigitalCredential.userAgentAllowsProtocol(protocol)) {
// 브라우저가 이 프로토콜의 사용을 허용하지 않는다.
// 다른 발급 방법으로 대체한다.
showTraditionalIssuanceForm();
return;
}
try {
const credential = await navigator.credentials.create({
digital: {
requests: [{
protocol,
data: { /* 발급 요청 데이터 */ }
}]
}
});
} catch (error) {
console.error("Error issuing digital credential:", error);
}
});
</script>
이 명세는 "digital-credentials-get" 정책 제어 기능을 통해 원격/서드파티 오리진에서 자격 증명을 제시하기 위해 API를 사용하는 것을 허용한다. 이는 웹사이트가 다른 오리진에서 호스팅되는 검증 서비스로부터 디지털 자격 증명을 요청하려는 시나리오에 유용하다. API를 사용하려는 웹사이트를 삽입하는 iframe에 권한 정책을 설정할 수 있다. 다음은 iframe에 권한 정책을 설정하는 방법의 예이다:
<iframe src="https://verifier-service.example.com"
allow="digital-credentials-get">
</iframe>
마찬가지로 이 명세는 "digital-credentials-create" 정책 제어 기능을 통해 원격/서드파티 오리진에서 자격 증명을 발급하기 위해 API를 사용하는 것을 허용한다. 이는 웹사이트가 다른 오리진의 발급 서비스를 사용하여 디지털 자격 증명 발급을 요청하려는 시나리오에 유용하다. 발급자의 인터페이스를 삽입하는 iframe에 권한 정책을 설정할 수 있다. 다음은 예이다:
<iframe src="https://issuer.example.com"
allow="digital-credentials-create">
</iframe>
이 절은 비규범적이다.
다음 항목은 이 명세의 범위에 포함된다:
다음 항목은 범위에 포함되지 않는다:
이 절의 정의가 목표로 하는 것은 다양한 디지털 자격 증명 형식과 프로토콜에 공통으로 적용되는 용어를 재사용하거나 확립하는 것이다. 이러한 정의는 현재 적극적으로 발전하고 있다.
이 명세는 현재 사람과 관련된 디지털 자격 증명에 중점을 두고 있습니다.
다음 제시 프로토콜 및 발급 프로토콜의 사용은 이 명세에서 정의한다.
사용자 에이전트는 지원되는 제시 및 발급 프로토콜 표에 나열된 모든 제시 프로토콜을 반드시 지원해야 한다. 지원되는 제시 및 발급 프로토콜 표에 나열된 모든 발급 프로토콜도 사용자 에이전트가 지원하는 것이 권고된다. 해당 프로토콜은 그 표에 나열되어 있다.
| 식별자 | 명세 |
|---|---|
| 제시 프로토콜 | |
openid4vp-v1-unsigned
|
검증 가능한 제시를 위한 OpenID 1.0 § A.3.1. 서명되지 않은 요청 |
openid4vp-v1-signed
|
검증 가능한 제시를 위한 OpenID 1.0 § A.3.2. 서명된 요청 |
openid4vp-v1-multisigned
|
검증 가능한 제시를 위한 OpenID 1.0 § A.3.2.2. JWS JSON 직렬화 (다중 서명 요청) |
org-iso-mdoc
|
ISO/IEC 18013-7:2025 ISO 준수 운전면허증, 제7부: 모바일 운전면허증(mDL) 추가 기능 § 부속서 C |
| 발급 프로토콜 | |
openid4vci-v1
|
검증 가능한
자격 증명 발급을 위한 OpenID 1.0 § 추후 제공 예정
이슈:
API 통합
|
DigitalCredentialGetRequest 또는 DigitalCredentialCreateRequest
request가 주어졌을 때 요청 프로토콜을 변환하려면:
DigitalCredentialGetRequest:
protocol로
둔다.
DigitalCredentialPresentationProtocol의
어떤 열거형 값과도 같지 않으면
실패를 반환한다.
DigitalCredentialPresentationProtocol
열거형 값을
반환한다.
DigitalCredentialCreateRequest:
protocol로
둔다.
DigitalCredentialIssuanceProtocol의
어떤 열거형 값과도 같지 않으면
실패를 반환한다.
DigitalCredentialIssuanceProtocol
열거형 값을
반환한다.
자격 증명 요청 코디네이터는 최상위 탐색 가능 객체를 통해 디지털 자격 증명 상호작용을 중개하는 사용자 에이전트 정의 구성 요소이다. 각 최상위 탐색 가능 객체에는 정확히 하나의 연결된 코디네이터가 있다. 코디네이터는 모든 하위 탐색 가능 객체 전체에서 최대 하나의 상호작용만 활성화되도록 보장하고, 제시 또는 발급의 종단 간 흐름을 조율하며 상호작용 상태 간 전환을 관리한다.
자격 증명 요청 코디네이터는 활성 프로미스를 유지하며, 사용자
에이전트는 이를 null로 초기화한다. 이 Promise를 통해
코디네이터는 비동기
자격 증명 요청 워크플로의 상태를 스크립트에 반영하며, 상호작용이
성공적으로 완료되면 자격 증명
응답으로 이행하거나, 처리가 실패하거나
사용자가 UI를 통해 요청을 취소하거나 스크립트가
AbortSignal을 통해 작업을 중단하면 거부한다.
자격 증명 요청 코디네이터는 중단 신호를 유지하며, 사용자 에이전트는
이를 null로 초기화한다.
자격 증명 요청 코디네이터는 중단 알고리즘을 유지하며, 사용자
에이전트는 이를 null로 초기화한다.
자격 증명 요청 코디네이터는 다음을 수행한다:
사용자 에이전트는 사용자 또는 플랫폼 정책에 따라 코디네이터 책임의 일부 또는 전부를 외부 자격 증명 관리자, 플랫폼 구성 요소 또는 기타 신뢰할 수 있는 엔터티에 위임할 수 있다.
자격 증명 요청 코디네이터에는 자격 증명 요청의 수명 주기를 관리하는 데 사용되는 유한한 상호작용 상태 집합이 있다:
Window global, 오리진 origin,
DigitalCredentialGetRequest 값의 시퀀스
또는 DigitalCredentialCreateRequest
값의 시퀀스
requests, 그리고 선택적
AbortSignal signal이 주어졌을 때 자격 증명
요청을 준비하려면:
Document로 설정합니다.
InvalidStateError" DOMException으로 거부된 프로미스를 반환합니다.
NotAllowedError" DOMException으로 거부된 프로미스를 반환합니다.
NotAllowedError" DOMException으로 거부된 프로미스를 반환합니다.
NotAllowedError"
DOMException으로
promise를 거부합니다.
null입니다.
TypeError와
promise로 자격 증명
요청을 거부합니다.
미리 중단된 signal은
이 알고리즘이 호출되기 전에 Credential을
요청하고 Credential을
생성하는 과정에서 처리됩니다.
AbortError" DOMException으로 자격 증명 요청을 중단합니다.
true이면, promise를 반환합니다.
DigitalCredentialGetRequest 또는
DigitalCredentialCreateRequest
객체의 시퀀스 requests가 주어졌을 때 자격 증명
요청을 필터링하려면:
false이면 계속한다.
프로토콜이 모두 지원되지 않는 요청이 사용자 활성화를 소비하지 않고
TypeError로 거부되도록 하기 위해
필터링은 사용자 활성화를 소비하기 전에 수행된다.
이후 자격 증명 요청 검증에서는 남은 모든 요청이
지원되는 프로토콜을 사용한다고 안전하게
가정할 수 있다.
DigitalCredentialGetRequest 또는
DigitalCredentialCreateRequest
객체의 시퀀스 requests가 주어졌을 때 자격 증명
요청을 검증하려면:
DigitalCredentialGetRequest이면
data를 request의 data로 두고,
request가
DigitalCredentialCreateRequest이면
request의
data로 둔다.
프로토콜에서 정의한 요구 사항 외에도 사용자 에이전트는 로컬 정책, 구성 또는 사용자의 선택을 기반으로 검증 기준을 적용할 수 있다. 예를 들어 사용자 에이전트는 특정 자격 증명 속성을 요구하는 요청을 거부할 수 있다.
무엇이 검증 실패를 구성하는지는 프로토콜별로 다르지만, 그러한 실패를 예외 유형으로 분류하는 방법은 아래에서 정의한다:
NotAllowedError"
DOMException.
"NotAllowedError"는
사용자가 작업을 취소했을 때 반환되는 오류와 의도적으로
구별할 수 없게 되어 있으므로, 웹사이트는
요청이 사용자에 의해 거부되었는지
사용자 에이전트에 의해
거부되었는지
판단할 수 없으며 사용자의 구성이나
자격 증명에 관한 어떤 정보도 추론할 수 없다.
SecurityError"
DOMException.
TypeError.
OperationError"
DOMException.
JavaScript 값 error가 주어졌을 때 자격 증명 요청을 중단하려면:
null이면
반환한다.
닫기에 실패할 수 있지만(예: 디지털 자격 증명 선택기가 메모리 부족으로 인해 제거된 경우), 조정자는 그와 관계없이 자격 증명 요청을 계속 완료합니다.
(JavaScript Value) error 및
Promise promise가 주어졌을 때 자격 증명
요청을 거부하려면:
null이 아니고 abortAlgorithm도
null이 아니면:
null로 설정한다.
null로 설정한다.
null로 설정한다.
Document
document, 검증된 자격 증명 요청 validatedRequests의 리스트,
Promise
promise, 그리고 선택적 AbortSignal signal이 주어졌을
때 자격 증명
요청을 시작하려면:
사용자 에이전트가 다른 기기에 있는 자격 증명 관리자와 통신할 때는 사용자 에이전트가 클라이언트 대 인증자 프로토콜(CTAP)을 사용하는 것이 권고된다.
자격 증명 요청 준비 단계에서 signal에 추가된 중단 알고리즘이 디지털 자격 증명 선택기를 종료하는 작업을 처리한다.
NotAllowedError"
DOMException으로
둔다.
NotAllowedError"
DOMException.
TypeError.
InvalidStateError"
DOMException.
OperationError"
DOMException.
디지털 자격 증명 선택기 또는 기반 플랫폼은 validatedRequests의 어떤 항목을 소지자에게 전달할지 결정하고 해당 교환의 프로토콜 식별자를 반환한다. 사용자 에이전트는 어떤 특정 항목이 선택되었는지 반드시 알 필요는 없다.
null이 아니고
abortAlgorithm도
null이 아니면, abortAlgorithm을
abortSignal에서 제거한다.
null로 설정한다.
null로 설정한다.
DigitalCredential
인스턴스로 두고,
그 data는
parsedResponseDataOrError로 초기화하고
protocol은
protocol로 초기화한다.
null로 설정한다.
디지털 자격 증명 API는 자격 증명 관리 레벨 1 명세를 활용하여 사용자 에이전트가 발급 및 제시를 디지털 자격 증명에 대해 중개할 수 있도록 합니다.
이 API를 사용하면 사용자 에이전트에
요청하여
디지털 자격 증명을 받을 수 있으며, 그러면 사용자 에이전트는
사용자에게
디지털 자격 증명 선택기를 제시하여, 사용자가
요청을 충족할 수 있는
디지털 자격 증명을 선택할 수 있도록 합니다. 이는
웹사이트에서
navigator.credentials.get() 메서드를 호출하여
수행하며, 이 메서드는
자격 증명 관리 레벨 1의
Credential 요청 알고리즘을
실행합니다.
그러면 해당 알고리즘은 이 명세의
DigitalCredential 인터페이스의
[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)
내부 메서드를 다시 호출합니다.
또한 이 API를 사용하면 발급을
요청하여 디지털 자격 증명을 받을 수도 있으며, 그러면 사용자에게
자격 증명 관리자 선택기를 제시하여, 사용자가
자격 증명 관리자를 선택하여 디지털 자격 증명을
저장할 수 있도록 합니다. 이는
navigator.credentials.create() 메서드를
호출하여 수행하며, 이 메서드는
자격 증명 관리 레벨 1의
자격 증명 생성 알고리즘을
실행합니다. 그러면 해당
알고리즘은 이 명세의 DigitalCredential 인터페이스의
[[Create]](origin, options, sameOriginWithAncestors)
내부 메서드를 다시 호출합니다.
이 API를 통한 디지털 자격 증명 발급은 디지털 자격 증명 제시와 약간 다릅니다. 응답 데이터에는 발급 프로토콜에서 정의한 보유자의 자격 증명 관리자가 반환한 프로토콜별 응답이 포함되며, 실제로 발급된 디지털 자격 증명 자체를 나타내지는 않습니다.
자격 증명 관리 레벨 1 명세와 통합하는 방법에 대한 전체 세부 정보는 자격 증명 관리 통합을 참조하십시오.
WebIDLpartial dictionary CredentialRequestOptions {
DigitalCredentialRequestOptions digital;
};
digital 멤버를 사용하면
디지털 자격 증명 요청을 구성하는 옵션을 지정할 수 있다.
WebIDLdictionary DigitalCredentialRequestOptions {
required sequence<DigitalCredentialGetRequest> requests;
};
requests는
제시 프로토콜과 제시 요청 데이터를 지정하며, 사용자 에이전트는 이를
디지털 지갑과 같은 자격 증명 관리자와 일치시킬 수 있다.
DigitalCredentialGetRequest
딕셔너리는 제시 요청을 나타낸다. 이 딕셔너리는
제시 프로토콜 및 일부 제시 요청 데이터를 지정하는 데 사용되며, 사용자 에이전트는 이를
디지털 지갑과 같은 자격 증명 관리자와 일치시킬 수 있다.
WebIDLdictionary DigitalCredentialGetRequest {
required DOMString protocol;
required object data;
};
protocol 멤버는
제시 프로토콜을 나타낸다.
protocol 멤버의 값은
DigitalCredentialPresentationProtocol에
정의된
프로토콜 식별자 중 하나이다.
WebIDLpartial dictionary CredentialCreationOptions {
DigitalCredentialCreationOptions digital;
};
digital 멤버를 사용하면
디지털 자격 증명 발급을 구성하는 옵션을 지정할 수 있다.
WebIDLdictionary DigitalCredentialCreationOptions {
required sequence<DigitalCredentialCreateRequest> requests;
};
requests는
발급 프로토콜 및 발급 요청 데이터를 지정하며, 사용자 에이전트는 이를
소지자에게 전달할 수 있다.
DigitalCredentialCreateRequest
딕셔너리는 발급 요청을 나타낸다. 이는
발급 프로토콜과 일부 발급 요청
데이터를 지정하여
발급자와 소지자 사이에 발급 요청을 전달하는 데 사용된다.
WebIDLdictionary DigitalCredentialCreateRequest {
required DOMString protocol;
required object data;
};
protocol
멤버는 발급 프로토콜을 나타낸다.
protocol 멤버의
값은 DigitalCredentialIssuanceProtocol에
정의된
프로토콜 식별자 중 하나이다.
DigitalCredential 인터페이스는 개념적인
디지털 자격 증명을 나타낸다.
DigitalCredential
인터페이스는 사용자의 제어와 동의를 보장하기 위해 모든
작업에 사용자 중개를 요구한다.
DigitalCredential과 관련된
get()
호출에서 개발자 경험을 단순화하기 위해, 사용자 에이전트는
mediation 멤버가
없거나 그 값이 "required"가
아니더라도
오류를 던져서는 안 된다.
마찬가지로
DigitalCredential과 관련된 create()
호출에서도 사용자
에이전트는
mediation 멤버가
없거나 그 값이
"required"가
아니더라도 오류를
던져서는 안 된다.
이로써
"required"
중개는 API의 암시적이며
재정의할 수 없는 동작이 된다.
WebIDLtypedef (DigitalCredentialPresentationProtocol or DigitalCredentialIssuanceProtocol) DigitalCredentialProtocol;
[Exposed=Window, SecureContext]
interface DigitalCredential : Credential {
[Default] object toJSON();
readonly attribute DigitalCredentialProtocol protocol;
[SameObject] readonly attribute object data;
static boolean userAgentAllowsProtocol(DOMString protocol);
};
DigitalCredential 인스턴스는 출처에 바인딩되어 있습니다.
protocol 멤버는
디지털 자격 증명을 요청하는 데 사용된
제시 프로토콜 또는
디지털 자격 증명을 발급하는 데 사용된 발급 프로토콜이다.
data 멤버는
자격 증명의 응답 데이터이다. 여기에는 JSON으로 파싱할 수 있는
객체 유형의 하위 집합이 포함된다.
userAgentAllowsProtocol()
메서드를 사용하면 디지털
자격 증명 검증자가 사용자 에이전트가 어떤 제시 프로토콜 및 발급
프로토콜을 허용하는지 확인할 수 있다.
사용자 에이전트는 하드웨어 가용성, 소프트웨어의 존재 또는 구성, 자격 증명 관리자 또는 디지털 자격 증명, 사용자 구성이나 기본 설정에 관한 정보에 따라 응답 값을 변경해서는 안 된다. 응답 값이 달라진다면 사용자 에이전트는 지문 채취와 사용자 행동 또는 구성에 관한 다른 세부 정보를 은밀하게 드러낼 위험을 모두 초래하게 된다. 응답 값은 사용자 에이전트의 주요 버전에 따라서만 달라지는 것이 권고되며, 브라우저가 해당 프로토콜을 사용하는 요청을 기반 플랫폼 또는 공급자에 배포할 수 있는지를 나타내야 한다.
DOMString protocol이
주어졌을 때
사용자
에이전트가 프로토콜을 허용하는지 확인하려면
다음 단계를 수행한다:
DigitalCredentialProtocol의 열거형 값이 아니면
false를 반환한다.
true를 반환하고, 그렇지 않으면
false를 반환한다.
이 메서드가 호출되면 사용자 에이전트는 protocol이 주어졌을 때 사용자 에이전트가 프로토콜을 허용하는지의 결과를 반드시 반환해야 한다.
이 명세에서
DigitalCredential을 지원하는 열거형 등의 데이터 구조.
DigitalCredentialPresentationProtocol
열거형
이 열거형의 값은 5. 프로토콜에 나열된 지원되는 제시 프로토콜에 대응한다.
WebIDLenum DigitalCredentialPresentationProtocol {
"openid4vp-v1-unsigned",
"openid4vp-v1-signed",
"openid4vp-v1-multisigned",
"org-iso-mdoc"
};
DigitalCredentialIssuanceProtocol
열거형
이 열거형의 값은 5. 프로토콜에 나열된 지원되는 발급 프로토콜에 대응한다.
WebIDLenum DigitalCredentialIssuanceProtocol {
"openid4vci-v1",
};
호출되었을 때, [[DiscoverFromExternalSource]](origin, options,
sameOriginWithAncestors) 내부 메서드는 사용자 에이전트가
제시 요청을 지원하지 않는 경우(예: 플랫폼이
디지털 자격 증명 선택기를 제공할 수 없는 경우),
동일한 인수로 Credential의
[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)
내부 메서드의 기본
구현을 호출한다.
그 밖의 경우:
digital의
requests 멤버로 둔다.
TypeError로 거부된 프로미스를 반환한다.
signal로 두되,
존재하는 경우에만 그렇게 한다.
호출되었을 때 [[Store]](credential, sameOriginWithAncestors)는
동일한 인수로 Credential의
[[Store]](credential, sameOriginWithAncestors)
내부
메서드의 기본 구현을 반드시 호출해야 한다.
호출되었을 때 [[Create]](origin, options,
sameOriginWithAncestors) 내부 메서드는 사용자 에이전트가
발급 요청을 지원하지 않는 경우, 동일한
인수로 Credential의 [[Create]](origin, options, sameOriginWithAncestors)
내부 메서드의 기본 구현을
호출한다. 그 밖의 경우:
digital의
requests 멤버로 둔다.
TypeError로 거부된 프로미스를 반환한다.
signal로 두되,
존재하는 경우에만 그렇게 한다.
DigitalCredential 인터페이스 객체에는
[[type]]이라는 내부 슬롯이 있으며
그 값은 "digital"이다.
DigitalCredential 인터페이스 객체에는
[[discovery]]라는 내부 슬롯이
있으며
그 값은 "remote"이다.
이 절은 비규범적이다.
디지털 자격 증명
API는 최종 사용자의 명시적 권한을 요구하는 강력한 기능이다. 이
요구 사항은
CredentialsContainer의
get() 메서드를 호출할
때 규범적으로 적용된다.
이 명세는 두 가지 정책 제어 기능을 정의한다:
Credential 요청
알고리즘이 정책 적용 지점 역할을 한다.
Credential 생성 알고리즘이
정책 적용 지점 역할을
한다.
이 절은 비규범적이다.
다음 절에서는 API의 보안 속성, 범위에 포함되는 위협, 보안이 의존하는 가정, 그리고 완화책이 적용된 후에도 남아 있는 잔여 위협을 설명한다. 이 명세는 자격 증명 응답을 중개할 때의 사용자 에이전트 동작에 대해서만 요구 사항을 정의한다.
프로토콜, 자격 증명 관리자 구현, 운영 체제 또는 전송 보안에 의존하는 기타 보안 고려 사항은 기대 사항 또는 전제 조건으로 설명되지만, 이미 규범적으로 명시되어 있지 않는 한 이 명세에서 규범적으로 요구하지 않는다.
이 명세의 위협 모델에는 이 API와 생태계의 인접 표준에 대한 위협이 포함된다.
이 명세에서 위협은 두 범주로 나뉜다: 범위 내 위협과 범위 외 위협.
범위 내 위협은 DC API 자체가 도입하거나 다루는 위협이다. 다음은 이 명세의 범위 내 위협이다:
DigitalCredentialGetRequest
또는 DigitalCredentialCreateRequest를
변경하려고 시도한다.
iframe과
같은
삽입된 서드파티 콘텐츠를 통해 삽입 사이트의 명시적 허가 없이
디지털 자격 증명을 요청하거나 발급하려고 시도하여,
자격 증명 수집 또는 민감한 사용자 데이터에 대한 승인되지 않은 접근을
가능하게 할 수 있다.
범위 밖 위협은 프로토콜, 자격 증명 관리자, OS 플랫폼 보안 또는 전송 계층에서 처리되는 위협이다. "범위 밖"이라 하더라도 자격 증명 제시 및 발급의 종단 간 보안에 영향을 미치므로 관련성이 있다. 다음은 이 명세의 범위 밖 위협을 정의한다:
다음 완화 조치는 명세의 규범적 요구사항을 통해 범위 내 위협에 대응합니다.
Digital Credential API의 WebIDL 인터페이스는 보안 컨텍스트에서만 노출되어, 변조가 안전하지 않은 컨텍스트를 통해 발생할 위험을 줄입니다(예: 악성 스크립트가 네트워크를 통해 삽입되는 경우). 자세한 내용은 § 5 보안 고려사항 절의 보안 컨텍스트 명세를 참조하십시오.
기반 플랫폼에 대한 악성 페이로드의 위험을 완화하기 위해, 사용자 에이전트는 요청 매개변수를 자격 증명 관리자에 JSON 직렬화를 사용하여 전달합니다(자격 증명 요청 검증 참조). 기반 플랫폼과 자격 증명 관리자는 이러한 프로토콜별 JSON 페이로드에 따라 동작하기 전에 이를 견고하게 파싱하고 검증할 책임이 있습니다.
Digital Credentials API는 다음 두 가지 메커니즘을 통해 API 플러딩을 줄입니다:
[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)
및 [[Create]](origin, options, sameOriginWithAncestors)
메서드는 사용자 활성화를 소비하여, 사용자
상호작용 없이 자동화되거나 반복되는 요청을 방지합니다.
required"
로 설정하며(DigitalCredential
인터페이스 참조), 모든 자격 증명
작업에 대해 플랫폼의 자격 증명 선택기 인터페이스를 통해 사용자 권한을 얻도록
보장합니다.
자격 증명 요청의 남용을 방지하는 추가 지침은 자격 증명 관리 레벨 1 명세의 § 7 개인정보 보호 고려사항 절을 참조하십시오. 다만 사이트가 여전히 다크 패턴을 사용하여 자격 증명 요청을 트리거하는 불필요한 사용자 상호작용을 유도할 수 있으므로, 이러한 보호에는 한계가 있다는 점에 유의하십시오.
Digital Credentials API는
권한 정책과의 통합을 통해(권한 정책
통합 참조) 교차 출처 남용을
줄입니다. Credential 요청 및 Credential 생성 알고리즘은 각각
"digital-credentials-get" 및
"digital-credentials-create" 정책 제어 기능의 정책 시행
지점 역할을 합니다. 두 기능은 의도적으로 분리되어 있습니다. 사이트는
"digital-credentials-get"을 활성화하면서
"digital-credentials-create"은 활성화하지 않을 수 있으며, 그
반대도 가능하여
각 임베디드 컨텍스트를 필요한 기능으로만
제한합니다. 이 통합이 제공하는 추가 보안
속성은
권한 정책 명세의
권한 정책 절을
참조하십시오.
또한 불투명 출처에서 발생한 요청은 거부됩니다.
DigitalCredential 인스턴스는 출처에 바인딩되어 있으므로, 불투명 출처에서 디지털 자격 증명을 요청하거나 생성하는 호출(예:
data: 문서 또는
allow-same-origin 없이 샌드박스된 문서)은 자격 증명 관리 레벨 1에 의해 거부되어,
신뢰할 수 없는 환경에서 악의적으로 추출하거나 스푸핑할
위험을 줄입니다.
제시 프로토콜이 요청에 서명하는 방법을 제공하는 경우, 검증자는 이를 사용할 것을 강력히 권장한다.
서명되지 않은 요청은 검증자 자신의 페이지에서 실행되는 스크립트에 의해 변경될 수 있으며, 악성 브라우저 확장 프로그램에 의해 삽입된 스크립트가 그 예이다. 이러한 스크립트는 요청되는 내용을 변경하여, 제한적인 요청을 훨씬 더 많은 것을 요구하는 요청으로 바꿀 수 있으며, 응답을 암호화하는 데 사용되는 매개변수를 바꿔 응답이 검증자가 아니라 공격자에게 암호화되도록 할 수도 있다. API를 보안 컨텍스트에서 사용하도록 요구해도 이를 막을 수 없다. 공격자가 이미 그 안에 있기 때문이다. 서명되지 않은 요청의 경우, 자격 증명 관리자는 검증자가 자신의 페이지에 그러한 스크립트가 없도록 유지했다고 신뢰해야 한다. 반면 서명된 요청은 자격 증명 관리자가 확인할 수 있는 정보를 제공하므로, 변경 사항이 감지되지 않은 채 넘어가는 대신 이를 감지할 수 있다.
그렇더라도 서명은 자격 증명 관리자가 해당 서명이 요청을 수행하는 검증자의 것임을 확인할 수 있는 경우에만 도움이 된다. 페이지 내부의 스크립트는 자신이 보유한 키로 변경된 요청에 다시 서명할 수 있으므로, 해당 서명을 이미 검증자의 것으로 인식된 서명 키와 대조하여 확인할 수 없다면 서명은 이러한 공격자로부터 아무런 보호도 제공하지 않는다. 어떤 서명 키를 허용할지와 그러한 키를 어떻게 설정할지는 이 명세가 아니라 자격 증명이 속한 생태계에서 결정하며, 서명된 요청이 실제로 제공하는 보호 수준은 그 결정에 따라 달라진다. 동일 기기 내 페이지 변조로부터 보호하는 것 외에도, 요청 서명은 여러 기기에 걸쳐 자격 증명을 제시할 때 중요한 심층 방어 기능도 제공한다(다음 참조: 10.4 기기 간 보안 및 근접성).
Digital Credentials API는 사용자가 보조 기기에서 디지털 자격 증명을 제시하는 기기 간 경험을 지원한다. 예를 들어 자격 증명 관리자 역할을 하는 스마트폰에서 주 기기인 노트북으로 제시할 수 있다. 구체적인 데이터 교환 프로토콜(예: 암호화 형식 및 전송 방식)은 이 API의 범위를 벗어나지만, 이러한 기기 간 상호작용은 일반적으로 Client to Authenticator Protocol (CTAP)과 같은 확립된 프로토콜에 의존한다(클라이언트 대 인증자 프로토콜(CTAP)).
이러한 프로토콜은 암호학적으로 안전한 채널을 설정하고 물리적 근접성(예: Bluetooth Low Energy를 통한)을 강제하여 원격 릴레이 공격을 완화함으로써 보안을 보장한다. 특히 기기 간 흐름에서는 자격 증명 관리자가 주 기기에서 전달된 출처 문자열을 본질적으로 신뢰할 수 없다. 주 기기 또는 그 브라우저가 침해되었을 수 있기 때문이다. 따라서 검증자가 자신의 신원을 암호학적으로 증명하는 서명된 요청을 사용하는 프로토콜은 브라우저가 주장한 출처에만 의존하는 것보다 훨씬 더 강력한 보안 보장을 제공한다.
이 절은 비규범적이다.
이 절은 이 문서가 발전함에 따라 계속 작업 중이다.
Digital Credentials API는 여러 기술 계층과 다양한 참여자가 있는 복잡한 생태계에 통합된다(여기에는 검증자, 소지자, 발급자 등이 포함되지만 이에 한정되지 않는다). 각 참여자는 사용자 개인정보 보호의 서로 다른 측면을 고려해야 한다. 이 명세는 서로 다른 참여자에 대한 모든 고려 사항을 빠짐없이 나열하려고 하지 않는다. 대신 이러한 당사자에게 디지털 자격 증명의 위협 모델을 보다 전체적으로 다루는 여러 다른 자료를 참조하도록 한다:
대신 이러한 고려 사항은 Digital Credentials API 자체에 초점을 맞추고, 사용자 에이전트가 API 구현에서 상호작용하는 생태계의 관련 개인정보 보호 속성을 고려하면서 사용자 에이전트의 의무를 어떻게 충족할 수 있는지 설명한다.
디지털 자격 증명에 대한 개인정보 보호 고려 사항은 고정되어 있지 않다. 생태계가 성숙함에 따라 시간이 지나면서 발전할 것이며, 생태계의 다른 행위자들의 행동, 스택의 다른 계층에서의 개선, 사용자 개인정보에 대한 새로운 위협, 그리고 변화하는 사회적 규범과 규제의 영향을 받을 수 있다.
Digital Credentials API의 설계 및 구현에 참여하는 여러 그룹은 변화하는 개인정보 보호 환경을 적극적으로 모니터링하고 이에 대응하는 API의 발전에 참여할 것으로 기대된다.
Digital Credentials API는 웹사이트의 디지털 자격 증명 요청을 중개하도록 설계되었으며, 자격 증명 형식과 그 안에 포함된 정보뿐 아니라 이를 교환하는 데 사용되는 프로토콜에도 종속되지 않는다. 이와 다른 주요 설계 선택은 기존 대안(예: [custom-schemes])보다 사용자에게 더 안전하고 개인정보 보호에 유리한 자격 증명 교환 경험을 제공하면서도, 도입이 쉽도록 일반적인 교환 프로토콜과 계속 호환되게 한다는 목표에서 비롯되었다.
이 API는 검증자와 보유자 사이의 연결 인터페이스를 제공한다. 즉, 자격 증명 제시 프로토콜이 시작되고 사용자가 자격 증명을 선택하기 위해 보유자 애플리케이션으로 전환하는 수단을 제공한다. 과거에 이 목적으로 사용된 해결책에는 QR 코드와 사용자 지정 URL 스킴이 포함된다. 웹에서 자격 증명 제시 및 ID 제시에 사용자 지정 스킴을 사용하는 것에 대한 우려 사항에 문서화된 것처럼, 이러한 해결책에는 보안, 프라이버시 및 접근성 관련 우려 사항이 있다.
생태계의 요구와 규제 의무에 의해 디지털 자격 증명 기술의 도입이 추진됨에 따라, Web 플랫폼은 개발자가 쉽게 사용할 수 있고 기존 자격 증명 제시 프로토콜과 호환되며, 가장 중요하게는 앞서 언급한 대안보다 사용자에게 더 나은 프라이버시, 보안 및 접근성 특성을 제공하는 덜 바람직한 기술에 대한 대안을 제공한다.
디지털 자격 증명 API는 사용자 에이전트가 사용자를 대신하여 중개할 수 있는 기능을 제공합니다(예: 디지털 자격 증명 선택기 또는 자격 증명 관리자 선택기 형태로). 이를 통해 요청에 맥락을 부여하고 보유자 애플리케이션에 즉시 노출되는 것을 방지할 수 있습니다. 또한 지원되는 프로토콜에 대해 응답 암호화와 같은 특정 최소 요구 사항도 적용합니다.
Digital Credentials API는 서로 다른 수준의 데이터 공개를 요구하는 다양한 사용 사례와, 자신이 처한 컨텍스트에 따라 서로 다른 선호를 가진 개별 사용자를 지원한다. 특히 이 API가 중개하는 자격 증명 교환의 개인정보 보호 속성은 개별 사용자의 법률 및 규제 환경에 의해 의무화될 수도 있다.
이는 일부 사용자가 자격 증명 정보를 교환하는 가장 개인정보 보호 친화적인 수단을 원하지 않거나 사용할 수 없을 수도 있음을 의미한다. 그럼에도 사용자 에이전트는 기본적으로 개인정보를 보호하는 경험을 사용자에게 제공하고 피해로부터 보호해야 한다.
이러한 선호와 사용 사례의 스펙트럼 때문에 사용자 에이전트가 사용자가 자신의 개인 정보를 노출하려는 것인지 아니면 그렇게 하도록 속고 있는지 구별하기 어려울 수 있다. 따라서 교환이 시작되기 전에 모든 사용자가 어떤 데이터를 공유하며 정보 교환에 누가 참여하는지 이해하도록 보장하는 것은 사용자 에이전트의 책임이다.
Digital Credentials API는 여러 독립적인 당사자가 참여하는 교환의 중심에 위치하므로, 이들 당사자가 사용자 정보를 교환하는 데 사용하는 제시 프로토콜과 자격 증명 형식은 사용자 개인정보 보호라는 사용자 에이전트의 목표에 매우 중요하다.
추가 설명이 필요하다고 생각하는 프로토콜 요구 사항은 두 가지이다:
개인정보 보호 검토를 거쳤어야 한다 [...]
그리고
보안 검토를 거쳤어야 한다 [...]
기술적으로는 "이 프로토콜은 모든 면에서 형편없다"라는 검토도 이러한 기준을 충족한다.
프로토콜이 충족해야 하는 구체적인 개인정보 보호 및 보안 요구 사항 집합이 있다면 더 유용할 것이다. 그러면 검토에서 표준이 달성되었는지 여부를 판단할 수 있다. 검토에 주관적인 요소가 있을 수도 있지만, 각 프로토콜이 넘어야 할 최소 기준도 있어야 한다.
이는 현재 포함 기준에 있는 기존 요구 사항 집합을 넘어선다. 지금 당장 포괄적인 목록을 가지고 있지는 않지만, 하나를 개발하는 것은 가능할 것이다. 그리고 일단 개발되면 그 목록은 명세에 포함되어야 한다. 예를 들어 프로토콜은 본거지에 연락하기에 의존하는가? 프로토콜(또는 프로토콜이 전달하는 형식)은 제시의 연결 불가능성을 보장하는가? 아니면 연결 불가능성이 일부 사용 사례에는 의미가 없다는 점을 고려할 때, 어떤 조건에서 API가 프로토콜에 연결 불가능성 제공을 요구하는가? 프로토콜은 어떤 종류의 투명성 기능을 포함하는가? 어떤 종류의 은밀 채널이 허용 가능한가?
선택적 공개는 데이터 최소화를 위한 기본적인 기술로, 보유자가 검증자가 요청한 최소한의 필수 정보만 공유할 수 있도록 한다. 프로토콜은 검증자가 필요한 정확한 클레임을 지정할 수 있도록 하여 선택적 공개를 지원할 것으로 예상된다.
연결 불가능성은 사용자가 자격 증명의 속성을 여러 번 제시하는 경우, 검증자가 이러한 별도의 제시를 연결하여 동일한 사용자에 관한 것이라고 결론 내릴 수 없도록 보장하는 속성이다 (검증자-검증자 연결 가능성). 또는 검증자가 발급자와 공모하여 자격 증명 관리자에서 발급자로 자격 증명이 교환되었다는 사실을 보고할 수 없도록 하는 속성이다 (검증자-발급자 연결 가능성). 전자는 보유자와 발급자가 유지할 수 있는 속성이다. 예를 들어 개별 검증자를 위해 새로운 자격 증명을 발급하는 방식으로 유지할 수 있다.
후자는 예를 들어 영지식 증명을 통해 달성할 수 있지만, 암호화된 응답과 같은 API의 설계 선택으로 인해 사용자 에이전트가 실제 환경에서 검증자-발급자 연결 불가능성이 달성되었음을 증명하는 것은 불가능하다. 그럼에도 불구하고 프로토콜은 가능한 경우 연결 가능성을 제한하도록 요청된다.
연결 불가능성은 특정 사용자 신원과 연결될 수 없는 속성에 대해서만 고려된다는 점에 유의해야 한다. 이름, 운전면허 번호 또는 전화번호와 같이 본질적으로 연결 가능한 속성은 연결 불가능성의 혜택을 받지 못한다.
Digital Credentials API를 통해 사용자 에이전트는 검증자와 자격 증명 관리자가 연결 불가능한 속성을 교환하도록 지원할 수 있지만, 응답 암호화로 인해 검증자와 자격 증명 관리자 사이에 연결 가능한 정보가 전달되지 않는다고 보장할 수는 없다. 사용자 에이전트는 사용자 권한 경험에서 이 사실을 고려할 것을 권장한다.
이 API가 목표로 하는 연결 불가능성의 수준은 무엇인가? 특정 연결 불가능성 기능에 대한 지원을 규범적으로 강제할 수 있는가?
"본거지로 연락하기"는 디지털 자격 증명의 제시 또는 검증으로 인해 발급자 또는 다른 중앙 엔터티에 다시 알림이나 통신이 이루어져 개인의 추적 및 프로파일링으로 이어질 수 있는 시나리오를 의미한다.
연결 불가능성과 마찬가지로, 사용자 에이전트가 사용자가 자격 증명 요청을 계속 진행하도록 권한을 부여한 후 발급자가 자격 증명 제시의 생성 또는 검증에 적극적으로 관여하지 않는다고 보장하는 것은 불가능하다. 그 시점부터 이 결정은 자격 증명 관리자에게 달려 있다. 일부 자격 증명 관리자는 사용자 에이전트로 간주될 수 있지만, 일반적으로 사용자 에이전트가 Digital Credentials API를 구현할 때 그 권한 경험을 사용자 확인 전에 자격 증명 관리자에 요청이 노출되는 것을 방지하도록 설계할 것을 권장한다 (여러 협력 사용자 에이전트를 통합할 때의 고려 사항을 염두에 두어야 한다).
프로토콜은 발급자, 자격 증명 관리자 및 검증자가 "본거지로 연락하기" 메커니즘에 대한 의존성을 피하거나 줄일 수 있는 메커니즘을 지원해야 한다.
이 API의 목표는 어느 수준의 연결 불가능성인가? 명세는 어느 정도까지 발급자의 관여를 제한하도록 요구할 수 있는가?
자격 증명 교환에서 발급자가 관여하는 일반적인 사례는 자격 증명 철회 검사이다. 이는 특히 제시가 검증자-발급자 간 연결 불가능성을 갖도록 의도된 경우 어려운 문제이다. 예를 들어 영지식 증명을 사용해 자격 증명 제시를 연결 불가능하게 만드는 경우, 프로토콜에서 사용하는 자격 증명 형식은 암호학적 누산기와 같은 오프라인 철회 방법을 지원할 것으로 기대된다. 또한 프로토콜 설계와 명세는 가능한 경우 철회 목적으로 검증자가 관여하는 것을 억제할 것으로 기대된다.
연결 불가능한 철회 기법이 규범적으로 요구할 만큼 실용적인지 논의해야 한다.
사용자의 이해와 참여는 자격 증명 제시에서 양보할 수 없는 속성이다. 프로토콜은 충분한 정보에 기반한 권한 및/또는 동의에 필수적인 정보를 제공함으로써 모든 관련 당사자가 사용자의 참여를 가능하게 하도록 도울 것으로 기대된다.
"전송" 중에 사용자 정보가 다른 당사자에게 노출되는 것을 방지하기 위해, 예를 들어 검증자 페이지에 로드된 브라우저 확장 프로그램으로부터 보호하고, 검증자가 사용자 자격 증명을 안전하게 저장하도록 장려하기 위해, 프로토콜은 자격 증명 교환에서 암호화된 응답을 지원하고 의무화해야 한다.
#49 및 지금까지 있었던 여러 다른 논의와 관련됨: 응답이 항상 암호화되어야 한다고 할 것인가 (그렇다면 어떤 알고리즘을 사용할 것인가), 아니면 이를 선택 사항으로 두어도 괜찮은가?
불필요한 자격 증명 요청은 전체 디지털 자격 증명 생태계의 주요 개인정보 보호 위험이다. 이는 다양한 방식과 다양한 동기로 나타날 수 있다:
여기서 한 가지 어려움은 무엇이 "유효한" 목적을 구성하며 따라서 어떤 요청이 "불필요한"지 판단하는 것으로, 자격 증명 교환에 참여하는 모든 당사자의 참여가 필요하다.
불필요한 사용을 판단하고 대응하는 방법을 더 자세히 살펴보려면 정부가 발급한 자격 증명과 그 밖의 자격 증명을 별도로 고려하는 것이 타당하다. 이들은 데이터의 민감도와 오용으로 인해 발생할 수 있는 피해뿐 아니라 법적 및 규제상 고려 사항에서도 잠재적으로 차이가 있기 때문이다.
두 유형의 자격 증명 모두에 적용되는 위험 완화와 사용자 통제 보장의 핵심 요소는 사용자 에이전트가 자격 증명 요청 메타데이터를 검사하고 이를 바탕으로 결정하거나 UI 표시를 구성할 수 있는 능력이다. 이 명세는 요청을 암호화하지 않은 상태로 전송하고 관련 정보를 포함하도록 하는 프로토콜 요구 사항을 통해 이러한 사용자 에이전트의 접근을 보장한다(다음 참조: 5. 프로토콜 및 6.2 자격 증명 요청 준비).
정부 발급 디지털 자격 증명에는 여행 문서, 개인 면허, 복지 및 공중 보건 프로그램 증명, 차량 등록증, 그리고 정부 기관이 발급한 기타 문서 또는 이러한 정보를 나타내는 다른 문서가 포함된다. 이러한 문서는 개인의 신원과 필수 공공 서비스와 상호작용할 수 있는 능력의 핵심이 되는 영구적이고 취소할 수 없으며 고유한 식별자를 포함할 수 있기 때문에 매우 민감하다.
이러한 자격 증명이 사용자와 공격자에게 높은 가치를 지니므로 도난 위험이 크고 승인되지 않은 서드파티에 유출될 경우 잠재적인 피해도 상당하다. 여기에는 추적 및 개인화를 목적으로 정부 신원을 요청하는 것도 포함된다.
온라인에서 정부 자격 증명을 더 쉽게 이용할 수 있게 되면서 발생하는 주요 우려 중 하나는 제번스의 역설이다. 즉, 접근 마찰이 줄어들면서 자격 증명에 대한 수요가 증가할 가능성이다. 이러한 효과는 본질적으로 Digital Credentials API 자체가 유발하는 것이 아니라 생태계 전체에서 디지털 자격 증명의 채택이 증가하면서 발생하는 것이다. 다만 사용자 에이전트가 Digital Credentials API를 구현하면 이러한 추세가 더 가속될 가능성이 있다. 따라서 API를 구현하는 사용자 에이전트는 이 효과를 고려해야 한다. 사용자에게 해로운 결과를 초래할 수 있기 때문이다:
위에서 설명한 정부 발급 디지털 자격 증명의 위험은 생태계의 단일 참여자만으로 해결할 수 없는 문제이며, 현실 세계의 자격 증명을 통해 온라인 서비스에 접근하는 것의 위험과 이점에 관해 각 주권 국가 내에서 더 폭넓은 정책 논의가 필요하다.
디지털 자격 증명을 발급하는 정부가 그 자격 증명을 어떤 방식과 어떤 목적으로 사용할 수 있는지 명확하게 정의하는 법률과 규정도 제정하는 것이 바람직하다. 교환에 참여하는 모든 당사자는 법적으로 의무가 있든 없든 간에, 존재하는 경우 정부의 검증자 인증 체계를 지원하는 것이 권고된다. 검증자 인증 체계(예: EUDI 접근 및 등록 인증서)를 지원하고 통합하면 불필요한 자격 증명 요청 확산의 위험을 완화할 수 있다. 그러나 이러한 체계가 항상 존재하는 것은 아니므로 자격 증명 교환의 위험이 크게 증가한다.
Digital Credentials API를 구현하는 사용자 에이전트가 위험을 줄이고 사용자의 이해를 높이며 특정 유형의 피해를 방지하기 위해 취할 수 있는 다른 실질적인 조치도 있다:
또한 사용자 에이전트가 이러한 완화책의 부재를 고려한 권한 경험을 설계하는 것이 매우 중요하다. 예를 들어 어떠한 검증자 인증 체계도 없는 상태에서 정부 자격 증명의 개인 정보를 교환하는 경우이다. 이러한 유형의 교환에는 더 높은 수준의 마찰과 관련 위험을 강조하는 명확한 사용자 메시지를 적용하는 것이 권고된다.
비정부 발급 자격 증명에는 정부가 발급하지 않았으며 정부 발급 문서를 나타내지도 않는 모든 기타 디지털 문서, 인증서 및 증명이 포함된다. 여기에는 재직 증명, (비정부) 교육 자격 증명 또는 영화 티켓 등이 포함될 수 있다. 특히 이러한 자격 증명의 교환은 법률과 규제에 의해 제한되는 정도가 더 낮을 가능성이 있다. 이러한 문서는 흔히 정부 발급 자격 증명과 동일한 위험을 보이지는 않지만, 식별 가능하거나 민감한 정보를 포함할 수도 있다.
비정부 자격 증명의 도난과 유출이 미치는 영향과 실현 가능성은 각 자격 증명 유형의 콘텐츠에 크게 좌우된다. 일반적으로 이는 민감한 개인 정보에 대한 통제권 상실과 노출뿐만 아니라 사칭과 데이터 도난으로 이어져 영향을 받은 개인에 대한 추가 공격 가능성을 높일 수 있다.
비정부 자격 증명의 유연성과 규제 부족은 이메일 주소나 전화번호와 같은 장기 식별자를 통한 교차 사이트 추적 및 신원 연결 목적으로 악용될 가능성을 갖는다. 디지털 자격 증명 기반 추적 체계에 참여하는 검증자는 사용자가 자신의 개인정보에 미치는 영향을 충분히 이해하지 못한 채 여러 사이트에서 식별자 자격 증명을 공유하도록 유도하는 인센티브("웹용 로열티 카드")를 만들 수 있다.
이러한 체계에서 자신의 정보를 공유하고 싶지 않은 사용자조차 프롬프트 피로의 영향을 받고 해당 서비스 이용에서 배제될 위험이 있을 수 있다.
비정부 발급 자격 증명의 경우 사용자 에이전트가 요청된 자격 증명 형식과 개인정보 보호 속성을 이해하고, 사용자에게 표시되는 맥락과 각 자격 증명 유형에 적합한 마찰 수준을 결정하는 위험 프레임워크를 구축하는 것이 권고된다. 이러한 자격 증명의 교환에 사용되는 프로토콜과 형식은 일반적으로 선택적 공개와 연결 불가능성 같은 기능을 지원할 것으로 기대되지만, 특히 영화 티켓과 같이 위험이 낮은 자격 증명의 정보를 교환할 때는 이러한 기능이 항상 적절하거나 필요하지 않을 수 있다.
요청 중인 자격 증명 유형을 인식하는 사용자 에이전트는 해당 자격 증명에 가장 적합하도록 권한 경험을 맞춤화하고, 사용자가 이를 공유했을 때의 결과를 이해할 수 있도록 돕는 것이 권장된다.
사용자 에이전트가 모든 자격 증명 요청을 이해할 수 있을 것으로 기대해서는 안 된다. 요청 중인 자격 증명의 유형을 인식하지 못하는 사용자 에이전트는 권한 경험에서 사용자의 마찰을 크게 늘리고, 알 수 없는 자격 증명을 웹사이트와 공유할 때의 위험을 사용자에게 명확하게 전달하는 것이 권고된다. 적절한 수준의 마찰과 투명성을 적용하려면 서로 다른 사용자 에이전트 간 통합이 필요할 수 있다는 점에 유의하라. 예를 들어 브라우저는 자격 증명 요청에 대한 지식을 운영 체제에 위임할 수 있으며, 운영 체제는 자격 증명 관리자가 알려진 자격 증명 유형을 등록하도록 요구하고 알 수 없는 자격 증명 유형의 교환 요청을 거부하도록 할 수 있다.
사용자에게 적절한 투명성을 제공해야 한다는 필요는 명시적인 사용자 에이전트의 동의 없이도 생태계가 새로운 자격 증명 형식을 개발할 수 있게 하려는 바람과 충돌한다.
불필요하고 악의적인 요청을 하는 검증자를 위한 상호운용 가능한 악용 신고 시스템을 고려한다.
API는 권한 프롬프트 없이 사용자 데이터가 절대로 공유되지 않도록 보장하지만([[[#user-permission-and-transparency|사용자 권한 및 투명성]] 절 참조), Digital Credentials API가 반환할 가능성이 높은 현실 세계 식별자의 수명과 고유성 때문에 추적자와 지문 채취자의 잠재적 대상이 될 수 있다.
선택적 공개를 사용하더라도 공격자는 디지털 자격 증명의 데이터(예: 사용자의 연령 또는 자격 증명 발급자, 타임스탬프; [[[#leaking-incidental-data|부수적 데이터 유출]] 절 참조)를 결합하여 사용자를 다시 식별하거나 지문을 채취할 수 있다.
이 공격은 서드파티 공격자(예: 검증자의 페이지에 삽입되었지만 추적 목적으로 적극적으로 협력하지는 않는 스크립트)에게는 더 어려울 수 있다. 응답 암호화가 필수이고 응답은 검증자의 서버에서 복호화되어야 하기 때문이다. 따라서 검증자는 복호화된 정보를 클라이언트 측 JavaScript에 다시 반영하지 않도록 할 수 있다. 그러나 모든 검증자가 그렇게 하기로 선택하는 것은 아니다.
자격 증명의 진위를 보장하기 위해, 이를 검증자에게 제시할 때는 일반적으로 검증자가 접근을 요청하는 콘텐츠보다 더 많은 정보가 포함된다. 일반적으로 최소한 발급자와 자격 증명 관리자의 서명과, 잠재적으로 다른 메타데이터도 포함된다.
이러한 추가 정보는 사용자를 재식별하고 핑거프린팅하는 데 사용될 수 있으며, 이는 그 밖의 경우에는 연결 불가능한 제시가 이루어질 때 특히 중요하다.
Digital Credentials API는 자격 증명 응답의 콘텐츠를 제어하지 않지만, 사용자 에이전트는 요청된 것 이외에 어떤 정보가 검증자와 공유될 가능성이 있는지를 명확하게 강조하고, 더 광범위하게는 검증자가 API를 통해 수행하는 핑거프린팅을 식별하고 차단함으로써 이러한 유형의 추적으로부터 사용자를 보호하는 데 도움을 줄 수 있다.
Digital Credentials API는 어떤 제시 및 발급 프로토콜이
사용자 에이전트에서 지원되는지에 관한 정보를
userAgentAllowsProtocol()을
통해 노출한다.
이는 예를 들어 사용자의 기기에 어떤
자격 증명 관리자 애플리케이션이 설치되어 있는지에 따라
응답을 맞춤화하지 않음으로써 브라우저
핑거프린팅과 사용자 기기 구성에 관한 정보의 노출을 완화한다.
따라서 반환되는 정보는 기껏해야
사용자 에이전트 버전과 동등한 수준이다.
Digital Credentials API는 사이트가 먼저 사용자 권한 흐름을 거치지 않고 자격 증명의 사용 가능 여부를 알아낼 수 있게 하지 않는다. 자격 증명의 존재를 노출하면 사용자 개인정보 보호에 위험이 된다. 자격 증명의 존재 자체가 사용자가 사이트와 공유하고 싶지 않았을 수 있는 개인 정보이며, 다른 신호와 결합하면 사용자 허가 없이 사용자를 식별하는 데 사용될 수 있기 때문이다. 또한 웹사이트가 서비스 접근을 위해 사용자에게 이러한 자격 증명의 제시를 점점 더 요구하기 시작하여 자격 증명을 제시하고 싶지 않은 개인을 배제할 수 있으므로 표현의 자유에도 위험이 된다.
이 보호가 견고하게 유지되도록 하기 위해, API가 반환하는 오류는 서로 다른 오류 유형이나 타이밍 공격과 같은 관찰 가능한 차이를 통해 사용자가 이용할 수 있는 자격 증명에 관한 정보를 유출하지 않습니다. 예를 들어, 사용자에게 일치하는 자격 증명이 없기 때문에 요청을 거부하는 경우에도, 사용자가 프롬프트를 취소했기 때문에 요청을 거부하는 경우와 동일한 일반 오류를 반환합니다. 또한 인위적인 지연에 의존하지 않고 타이밍 공격을 방지하기 위해, 사용자 에이전트는 일치하는 자격 증명이 없는 경우 사용자에게 표시되는 대화상자(예: 빈 선택기 또는 알림)를 표시하여, 프롬프트 닫기 지연 시간이 사용자의 취소와 구별되지 않도록 합니다.
Digital Credentials API는 자격 증명을 통해 매우 개인적이고, 민감하며, 위험에 노출될 수 있는 사용자 정보를 웹사이트와 공유할 수 있게 하며, 영구적이고 고유하며 취소할 수 없는 컨텍스트 간 식별자를 통해 온라인과 오프라인에서 사용자를 추적할 수 있는 가능성을 제공한다. 또한 사용자의 브라우징 활동 일부와 특정 웹사이트 및/또는 자격 증명 관리자에 자신을 식별하려는 의도도 드러낸다. 자격 증명 요청에서 사용자 에이전트의 중요한 책임 중 하나는 정보 교환을 진행하기 위한 사용자의 권한을 얻는 것이다.
사용자가 자격 증명 교환을 진행할지에 대해 충분한 정보를 바탕으로 결정을 내리는 데 필요한 중요한 컨텍스트 세부 정보에는 다음이 포함된다:
사용자 에이전트는 구현 시 사용자와 관련된 어떠한 정보도 교환되기 전에 나열된 세부 정보를 사용자에게 완전히 공개하도록 하는 것이 권장된다.
이들을 명세에서 규범적으로 정의해야 하는가?
사이트가 컨텍스트에 맞는 설명을 제공할 수 있도록 API를 설계해야 하는가?
자격 증명 제시에서 여러 요청과 응답을 처리하는 것의 우려 사항, 절충점 및 가능한 완화책을 설명해야 한다.
사용자 시스템의 기술적 아키텍처에 따라 "사용자 에이전트"의 정의에는 브라우저와 운영 체제처럼 소프트웨어 스택의 여러 협력 계층이 포함될 가능성이 높다. 이러한 계층에서 가장 중요한 우선순위는 안전하고 충분한 정보에 기반한 사용자 권한 경험이어야 한다. 따라서 통합은 사용자 안전에 매우 중요할 수 있다. 일부 계층은 사용자의 자격 증명 가용성과 같이 다른 계층에서 접근할 수 없는 정보를 보유할 수 있다. 과도한 프롬프트 또는 충분한 맥락이 없는 프롬프트는 (악용 가능한) 혼란과 프롬프트 무시에 이어질 수 있다.
이러한 이유로 권한을 요청하는 사용자 에이전트는 안전하다고 판단되는 경우 이상적인 사용자 경험을 위해 소프트웨어 계층을 통합하는 것이 권장된다. 예를 들어 브라우저가 운영 체제의 API 계약을 신뢰하여 적절한 프롬프트를 표시한다고 보고 자체적으로 프롬프트를 표시하지 않는 방식이 가능하다.
사용자 권한 흐름의 일부로 사용자 에이전트는 사용자가 자격 증명 요청을 자격 증명 관리자에게 전달할지 여부와 어떤 자격 증명 관리자를 선택할지 결정할 권한을 유지하도록 보장해야 한다. 이는 요청의 일부로 정보 공개가 발생하고, 자격 증명 관리자가 요청 시점에 이 정보를 보존하거나 공유할 수 있기 때문이다.
사용자 에이전트가 중재하는 권한은 동의가 아니며, 동의에는 서로 다른 법적 및 규제 환경에 따라 달라질 수 있는 구체적인 법적 정의가 있고, 정보를 자격 증명 관리자가 검증자와 공유하기 전에 수집해야 할 수도 있으며, 또는 검증자 자체가 요청을 시작하기 전에 수집해야 할 수도 있다. 동의를 얻기 위한 프레임워크와 규정이 아직 개발 중인 가운데, 이 API는 필요한 정보의 교환을 가능하게 하는 것을 목표로 하며, 여기에는 다음이 포함될 수 있다:
이러한 정보가 구조화된 형식으로 더 많이 제공됨에 따라, 사용자 에이전트와 이 명세도 이를 활용하여 사용자 권한 경험을 개선할 것으로 예상한다.
Digital Credentials API 자체는 새로운 브라우저 관리형 지속 상태나 로컬 저장소 메커니즘을 도입하지 않습니다. 이 API를 통해 요청된 자격 증명은 외부 자격 증명 관리자 또는 운영 체제에서 저장하고 관리합니다. 따라서 사용자가 특정 출처 또는 전체에 대해 브라우징 데이터(예: 쿠키 또는 로컬 저장소)를 삭제하더라도, 일반적으로 이러한 외부 관리자에 보관된 자격 증명은 삭제되거나 영향을 받지 않습니다.
디지털 자격 증명을 선택하고 승인하기 위한 사용자 인터페이스는 플랫폼에서 제공되며 대부분 이 명세의 범위를 벗어납니다. 그러나 해당 경험의 접근성은 범위에 포함됩니다(3. 범위 참조). 다음 지침은 사용자 에이전트 및 디지털 자격 증명 선택기, 자격 증명 관리자 선택기와 그 주변 흐름을 구현하는 플랫폼에 적용되며, [WCAG22]의 관련 성공 기준을 참조합니다. 어느 선택기든 비웹 사용자 인터페이스인 경우에는 해당 기준이 [WCAG2ICT-22]에 설명된 대로 적용됩니다.
발급 또는 제시 중 표시되는 모달 대화 상자의 내용은 텍스트, QR 코드 및 기타 시각적 미디어를 포함할 수 있으며, 적절한 이름, 역할 및 값을 사용하여 레이블을 지정하고 보조 기술에 노출해야 합니다(§ 성공 기준 4.1.2 이름, 역할, 값 참조). 또한 SHOULD 텍스트가 아닌 콘텐츠에 대한 텍스트 대체 수단을 제공해야 합니다(§ 성공 기준 1.1.1 비텍스트 콘텐츠 참조).
다른 기기를 기다리는 경우, 성공적인 응답, 오류 또는 취소와 같은 상호작용 상태의 변경은 프로그래밍 방식으로 확인할 수 있어야 하며, 포커스를 변경하지 않고 보조 기술에 전달되어야 합니다(§ 성공 기준 4.1.3 상태 메시지 참조).
작업이 실패하면 사용자 에이전트는 여러 가지
서로 다른 오류 중 하나로 거부합니다. 예를 들어 "NotAllowedError",
"InvalidStateError" 또는 "OperationError" DOMException, 또는
TypeError가 있습니다. 플랫폼이
이러한 실패를 사용자에게 표시하는 경우,
단순히 오류가 발생했다는 사실만 알리는 대신 무엇이 잘못되었는지와, 해당하는 경우 어떻게
복구할 수 있는지를 텍스트로 식별해야 합니다(§ 성공 기준 3.3.1
오류 식별 참조).
상호작용 요소, 특히 사용자가 발급 또는 제시 요청을 계속하거나 중단할 수 있도록 하는 요소는 기기에 독립적인 방식으로 조작할 수 MUST 있습니다(예: 키보드를 통해서. § 성공 기준 2.1.1 키보드 참조). 특히 활성화는 유일한 조작 수단으로 다중 지점 또는 경로 기반 제스처를 요구해서는 MUST NOT 됩니다(§ 성공 기준 2.5.1 포인터 제스처 참조). 또한 기기 움직임을 유일한 조작 수단으로 요구해서도 안 됩니다(§ 성공 기준 2.5.4 움직임 작동 참조). 디지털 자격 증명 선택기와 자격 증명 관리자 선택기는 의미 있는 포커스 순서로 컨트롤을 표시해야 하며(§ 성공 기준 2.4.3 포커스 순서 참조), 선택기가 열릴 때 포커스를 선택기 내부로 이동하고, 표시되는 동안 포커스를 그 안에 유지하며, 닫힐 때 이전에 포커스된 요소 또는 다른 적절한 위치로 포커스를 복원해야 합니다.
디지털 자격 증명을 제공하기 위해 보유자가 인증해야 하는 경우, 접근 가능한 인증 방법을 사용할 수 있어야 합니다. 어떤 단계가 비밀번호 기억과 같은 인지 기능 테스트에 의존하는 경우, 그러한 테스트가 필요하지 않은 대안을 제공해야 합니다(§ 성공 기준 3.3.8 접근 가능한 인증(최소) 참조). 또한 인증은 일부 사용자가 제공할 수 없는 생체 정보와 같은 단일 신체적 특성에만 의존해서는 안 됩니다. 이 단계는 일반적으로 플랫폼 또는 자격 증명 관리자가 수행하며, 그 밖의 측면은 이 명세의 범위를 벗어납니다.
일부 플랫폼은 제시 요청을 여러 기기에 걸쳐 수행합니다. 예를 들어 사용자가 별도의 기기로 스캔할 수 있도록 QR 코드를 표시합니다. 이러한 흐름은 시각 능력, 카메라 또는 두 번째 기기의 사용에 의존할 수 있으므로, 플랫폼은 단일 감각 능력이나 입력 방식에 의존하지 않고 상호작용을 완료할 수 있는 동등하고 접근 가능한 수단을 제공해야 합니다. QR 코드와 같은 시각적 산출물을 통해서만 전달되는 기기 간 요청에 접근 가능한 대안이 없다면, 해당 방식을 사용할 수 없는 사용자를 배제하게 됩니다.
하나의 상호작용에는 둘 이상의 출처에서 시간 제한이 적용될 수 있습니다. 이러한 제한은 더 많은 시간이 필요한 사용자가 배제되지 않도록 처리해야 합니다(§ 성공 기준 2.2.1 시간 조절 가능 참조):
AbortSignal을
signal로 전달하여 상호작용 시간을
제한할 수 있습니다. 예를 들어
AbortSignal.timeout()으로 생성한 것을 사용할 수 있습니다. 사이트는 충분한 시간을 허용해야 하며, 사용자를
재촉하는 짧은 제한을 두어서는 안 됩니다.
디지털 자격 증명을 검토하고 공개하기 위한 결정에는 주변 사이트 흐름에서 비롯된 시간 압박을 포함하여 강제적인 카운트다운이 적용되어서는 안 됩니다.
상호작용 중 표시되는 사람이 읽을 수 있는 자격 증명 콘텐츠와, 이미지의 텍스트 대체 수단과 같은 접근 가능한 대체 수단은 자격 증명 페이로드 내에 포함되며, 관련 자격 증명 형식 및 프로토콜에서 책임집니다. 이러한 형식과 프로토콜은 해당 콘텐츠의 언어와 방향도 결정합니다.
이 절은 비규범적이다.
이 API는 자격 증명 형식과 교환 프로토콜에 종속되지 않으며,
요청 페이로드(DigitalCredentialGetRequest의
data 및
DigitalCredentialCreateRequest의
data)와 응답 페이로드
(DigitalCredential의 data)를 불투명한 것으로 취급한다. 그
결과, API는 사람이 읽을 수 있는 자연어 콘텐츠를 전달하는
문자열 타입 값을 정의하지 않는다:
JSON.stringify 연산을 호출한다. 응답은 JSON 문자열을
JavaScript 값으로 파싱을 사용하여 파싱된다. JSON.stringify는
단독(짝이 없는) 서로게이트 코드 포인트를 \uXXXX 이스케이프 시퀀스로 출력하므로,
직렬화된 요청은 항상 올바른 형식이며 UTF-8로 인코딩 가능한 JSON이다.
따라서 이 명세는 언어 또는 방향 메타데이터가 필요한 자연어 텍스트를 새로 도입하지 않는다. 향후 개정판에서 API 계층에 사이트 작성자가 작성한 사람이 읽을 수 있는 텍스트, 규범적으로 정의된 권한 프롬프트 텍스트 또는 사용자 에이전트가 그리는 제시 요소를 도입한다면, 해당 텍스트에는 적절한 언어 및 방향 메타데이터가 포함되거나 연결되어야 한다.
사용자 에이전트 자동화 및 애플리케이션 테스트를 위해 이 문서는 WebDriver BiDi 명세의 확장 모듈을 정의한다. 사용자 에이전트가 이를 지원하는 것은 선택 사항이다.
digitalCredentials 모듈에는
[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)
및 [[Create]](origin, options, sameOriginWithAncestors)
호출 중 자격 증명 관리자의 원격 엔드 동작을 관리하고
시뮬레이션하기 위한 명령이 포함된다.
CDDLdigitalCredentials.VirtualWalletAction = "decline" / "respond" / "wait" / "clear"
digitalCredentials.SetVirtualWalletBehaviorParameters = {
action: digitalCredentials.VirtualWalletAction,
? context: text,
? protocol: text,
? response: { * text => any },
}
digitalCredentials.VirtualWalletAction
타입은 서로 다른 유형의
가상 지갑 동작을 나타낸다.
"decline"
"respond"
"wait"
"clear"
CDDLdigitalCredentials.SetVirtualWalletBehavior = (
method: "digitalCredentials.setVirtualWalletBehavior",
params: digitalCredentials.SetVirtualWalletBehaviorParameters
)
CDDLdigitalCredentials.SetVirtualWalletBehaviorResult = EmptyResult
session 및 command parameters가 주어졌을 때
digitalCredentials.setVirtualWalletBehavior 명령의
원격 엔드 단계는 다음과 같다:
action"]으로 둔다.
context"]로 두되, 존재하는 경우에만
그렇게 하고, 그렇지 않으면
null로 둔다.
protocol"]로 두되,
존재하는 경우에만
그렇게 하고, 그렇지 않으면 null로 둔다.
response"]로 두되,
존재하는 경우에만
그렇게 하고, 그렇지 않으면 null로 둔다.
"respond"인 경우:
"clear"인 경우:
null이 아니면,
WebDriver 세션의 활성
가상 지갑 동작에서
context에 대한 항목을 제거한다.
null로 설정한다.
null이 아니면 WebDriver 세션의
탐색 컨텍스트 ID context에 대한
활성 가상 지갑 동작을
behavior로 설정한다.
null과 함께 성공을 반환한다.
자동화 테스트를 작성하는 개발자는 AbortSignal을 signal로
(get()의
경우)
또는 signal로
(create()의
경우)
전달한 다음, 원하는 중단 이유로 이를 중단하여
지갑 오류를 시뮬레이션할 수 있다. 이는 요청 알고리즘에서 사용하는 것과
동일한 중단 경로를 실행한다.
(async () => {
const controller = new AbortController();
const credentialPromise = navigator.credentials.get({
digital: {
requests: [{
protocol: "example-request-protocol",
data: { /* 제시 요청 데이터 */ }
}]
},
signal: controller.signal
});
controller.abort(
new DOMException("Simulated wallet failure", "OperationError")
);
try {
await credentialPromise;
} catch (error) {
console.assert(error.name === "OperationError");
}
})();
Promise
promise와 전역 객체 global이 주어졌을 때
가상
지갑 동작을 처리하려면 다음 단계를 실행한다:
false를 반환한다.
null이면 behavior를 현재 WebDriver
세션의 기본 활성 가상 지갑 동작으로 설정한다.
null이면 false를 반환한다.
"wait"이면 true를 반환한다.
"decline"인 경우:
NotAllowedError"
DOMException으로
거부한다.
true를 반환한다.
"respond"인 경우:
DigitalCredential 인스턴스로 둔다.
protocol 속성을
protocol로 설정한다.
data
속성을 JS
object로 설정한다.
true를 반환한다.
action
§14.1.1
"clear"
§14.1.1
context
§14.1.1
[[Create]](origin, options, sameOriginWithAncestors)
DigitalCredential의 내부 슬롯
§8.3
DigitalCredentialGetRequest의 멤버
§7.3.2
DigitalCredentialCreateRequest의 멤버
§7.6.2
DigitalCredential의 속성
§7.7.2
"decline"
§14.1.1
CredentialRequestOptions의 멤버
§7.1.1
CredentialCreationOptions의 멤버
§7.4.1
DigitalCredential 인터페이스
§7.7
DigitalCredentialCreateRequest
딕셔너리
§7.6
DigitalCredentialCreationOptions
딕셔너리
§7.5
DigitalCredentialGetRequest 딕셔너리
§7.3
DigitalCredentialIssuanceProtocol
열거형
§7.8.3
DigitalCredentialPresentationProtocol
열거형
§7.8.2
DigitalCredentialProtocol
§7.7
DigitalCredentialRequestOptions
딕셔너리
§7.2
digitalCredentials.SetVirtualWalletBehavior
§14.1.2.1
"digitalCredentials.setVirtualWalletBehavior"
§14.1.2.1
digitalCredentials.SetVirtualWalletBehaviorParameters
§14.1.1
digitalCredentials.SetVirtualWalletBehaviorResult
§14.1.2.1
digitalCredentials.VirtualWalletAction
§14.1.1
[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)
DigitalCredential의 내부 슬롯
§8.1
[[discovery]]
DigitalCredential의
내부 슬롯
§8.5
method
§14.1.2.1
"openid4vci-v1"
DigitalCredentialIssuanceProtocol의 열거형 값
§5.
"openid4vp-v1-multisigned"
DigitalCredentialPresentationProtocol의 열거형 값
§5.
"openid4vp-v1-signed"
DigitalCredentialPresentationProtocol의 열거형 값
§5.
"openid4vp-v1-unsigned"
DigitalCredentialPresentationProtocol의 열거형 값
§5.
"org-iso-mdoc"
DigitalCredentialPresentationProtocol의 열거형 값
§5.
params
§14.1.2.1
DigitalCredentialGetRequest의 멤버
§7.3.1
DigitalCredentialCreateRequest의 멤버
§7.6.1
DigitalCredential의 속성
§7.7.1
DigitalCredentialRequestOptions의 멤버
§7.2.1
DigitalCredentialCreationOptions의 멤버
§7.5.1
"respond"
§14.1.1
response
§14.1.1
[[Store]](credential, sameOriginWithAncestors)
DigitalCredential의 내부 슬롯
§8.2
text
§14.1.1
[[type]] DigitalCredential의
내부 슬롯
§8.4
userAgentAllowsProtocol()
DigitalCredential의 메서드
§7.7.3
"wait"
§14.1.1
[[Create]](origin, options, sameOriginWithAncestors)
(Credential용)
[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)
(Credential용)
[[Store]](credential, sameOriginWithAncestors)
(Credential용)
create()
(CredentialsContainer용)
Credential 인터페이스
CredentialCreationOptions
CredentialRequestOptions
CredentialsContainer 인터페이스
get() (CredentialsContainer용)
mediation
(CredentialRequestOptions용)
mediation
(CredentialCreationOptions용)
Credential용)
required
(CredentialMediationRequirement용)
signal
(CredentialRequestOptions용)
signal
(CredentialCreationOptions용)
AbortSignal용)
AbortSignal용)
AbortSignal 인터페이스
AbortSignal용)
AbortSignal용)
AbortController용)
AbortController용)
Document용)
Document용)
iframe
요소
object
타입
Window
인터페이스
list용)
iteration용)
list용)
list용)
struct용)
AbortError 예외
boolean
타입
exception용)
[Default] 확장 속성
DOMException 인터페이스
DOMString 인터페이스
[Exposed] 확장 속성
InvalidStateError 예외
NotAllowedError 예외
object
타입
OperationError 예외
Promise 인터페이스
ReferenceError 예외
[SameObject] 확장 속성
[SecureContext] 확장 속성
SecurityError 예외
exception용)
TypeError 예외
WebIDLpartial dictionary CredentialRequestOptions {
DigitalCredentialRequestOptions digital;
};
dictionary DigitalCredentialRequestOptions {
required sequence<DigitalCredentialGetRequest> requests;
};
dictionary DigitalCredentialGetRequest {
required DOMString protocol;
required object data;
};
partial dictionary CredentialCreationOptions {
DigitalCredentialCreationOptions digital;
};
dictionary DigitalCredentialCreationOptions {
required sequence<DigitalCredentialCreateRequest> requests;
};
dictionary DigitalCredentialCreateRequest {
required DOMString protocol;
required object data;
};
typedef (DigitalCredentialPresentationProtocol or DigitalCredentialIssuanceProtocol) DigitalCredentialProtocol;
[Exposed=Window, SecureContext]
interface DigitalCredential : Credential {
[Default] object toJSON();
readonly attribute DigitalCredentialProtocol protocol;
[SameObject] readonly attribute object data;
static boolean userAgentAllowsProtocol(DOMString protocol);
};
enum DigitalCredentialPresentationProtocol {
"openid4vp-v1-unsigned",
"openid4vp-v1-signed",
"openid4vp-v1-multisigned",
"org-iso-mdoc"
};
enum DigitalCredentialIssuanceProtocol {
"openid4vci-v1",
};
digitalCredentials.VirtualWalletAction = "decline" / "respond" / "wait" / "clear"
digitalCredentials.SetVirtualWalletBehaviorParameters = {
action: digitalCredentials.VirtualWalletAction,
? context: text,
? protocol: text,
? response: { * text => any },
}
digitalCredentials.SetVirtualWalletBehavior = (
method: "digitalCredentials.setVirtualWalletBehavior",
params: digitalCredentials.SetVirtualWalletBehaviorParameters
)
digitalCredentials.SetVirtualWalletBehaviorResult = EmptyResult
비규범적이라고 표시된 절뿐만 아니라 이 명세의 모든 작성 지침, 다이어그램, 예제 및 참고 사항은 비규범적이다. 이 명세의 그 밖의 모든 내용은 규범적이다.
이 문서에서 핵심 단어 할 수 있다, 반드시 해야 한다, 해서는 안 된다, 선택 사항, 권고된다, 하는 것이 좋다, 및 하지 않는 것이 좋다는 여기에서와 같이 모두 대문자로 나타날 때, 그리고 오직 그 경우에만 BCP 14 [RFC2119] [RFC8174]에 설명된 대로 해석해야 한다.
일부 편집자는 이 명세에 대한 피드백과 기여를 제공한 다음 분들께 감사드린다: Christian Bormann (SPRIND), John Bradley (Yubico), Rick Byers (Google), Brian Campbell (Ping Identity), Lee Campbell (Google), Nick Doty (CDT), Heather Flanagan (Spherical Cow Consulting), Ryan Galluzzo (NIST), Joseph Heenan (Authlete), Dominique Hazael-Massieux (W3C), Bjorn Hjelm (Yubico), Johann Hofmann (Google), Mike Jones (Self-Issued Consulting), Tobias Looker (MATTR), Matthew Miller (Cisco), Theresa O'Connor (Apple Inc.), Simone Onofri (W3C), Helen Qin (Google), Wendy Seltzer (초청 전문가), Manu Sporny (Digital Bazaar), Orie Steele (Transmute), Ted Thibodeau Jr (OpenLink Software), David Waite (Ping Identity), 그리고 Kristina Yasuda (SPRIND).
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: