디지털 자격 증명

W3C 작업 초안

이 문서에 대한 자세한 정보
이 버전:
https://www.w3.org/TR/2026/WD-digital-credentials-20260616/
최신 공개 버전:
https://www.w3.org/TR/digital-credentials/
최신 편집자 초안:
https://w3c-fedid.github.io/digital-credentials/
이력:
https://www.w3.org/standards/history/digital-credentials/
커밋 기록
편집자:
Marcos Caceres (Apple Inc.)
Tim Cappalli (Okta)
Mohamed Amir Yosef (Google Inc.)
전 편집자:
Sam Goto (Google Inc.) - 까지
피드백:
GitHub w3c-fedid/digital-credentials (풀 리퀘스트, 새 이슈, 미해결 이슈)

초록

이 문서는 사용자 에이전트제시발급을 중개할 수 있게 하는 API를 명시합니다. 이는 디지털 자격 증명, 예를 들어 운전면허증, 정부 발급 신분증 또는 기타 유형의 디지털 자격 증명에 적용됩니다. 이 API는 Credential Management Level 1을 기반으로 하며 자격 증명 형식에 구애받지 않도록 설계되었습니다.

이 문서의 상태

이 절은 이 문서가 발행된 시점의 상태를 설명합니다. 현재 W3C 발행물 목록과 이 기술 보고서의 최신 개정판은 W3C 표준 및 초안 색인에서 확인할 수 있습니다.

이 문서는 Federated Identity Working Group에서 Recommendation 트랙을 사용하여 작업 초안으로 발행했습니다.

작업 초안으로 발행되었다고 해서 W3C와 그 회원들의 지지를 의미하지는 않습니다.

이 문서는 초안 문서이며 언제든지 다른 문서로 갱신, 대체 또는 폐기될 수 있습니다. 이 문서를 진행 중인 작업 이외의 것으로 인용하는 것은 적절하지 않습니다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에서 작성했습니다. W3C는 해당 그룹의 산출물과 관련하여 이루어진 모든 특허 공개의 공개 목록을 유지합니다. 그 페이지에는 특허를 공개하는 방법에 대한 지침도 포함되어 있습니다. 개인이 필수 청구항을 포함한다고 믿는 특허에 대해 실제 지식을 가지고 있는 경우, W3C 특허 정책 제6절에 따라 해당 정보를 공개해야 합니다.

이 문서는 2025년 8월 18일 W3C Process Document의 적용을 받습니다.

1. 소개

이 절은 비규범적입니다.

이 문서는 웹 사이트가 디지털 자격 증명의 제시 및 발급을 요청할 수 있게 하는 API를 정의합니다.

이 API는 자격 증명 형식에 구애받지 않으며, 여러 제시 프로토콜발급 프로토콜로 확장할 수 있도록 설계되었습니다. 5. 프로토콜을 참조하십시오.

이 API는 다음 목표를 지원하도록 설계되었습니다.

많은 유형의 디지털 자격 증명을 이 API를 사용하여 제시하고 발급할 수 있습니다. 이러한 유형의 예에는 다음이 포함됩니다.

2. 사용 예

이 절은 비규범적입니다.

다음 예제들은 API를 사용하여 디지털 자격 증명을 요청하고 발급하는 방법을 보여준다.

2.1 기능 감지

API를 사용하기 전에, 사용자 에이전트가 필요한 기능을 지원하는지 확인하는 것이 중요하다. 이는 다음 코드를 사용하여 수행할 수 있다:

예제 1: API 지원 확인
if (typeof DigitalCredential !== "undefined") {
  // API가 지원됨
} else {
  // API가 지원되지 않음
}

2.2 프로토콜이 허용되는지 확인

userAgentAllowsProtocol() 정적 메서드는 사용자 에이전트가 디지털 자격 증명 발급 또는 제시에 대해 특정 프로토콜을 허용하는지 확인하는 데 사용할 수 있습니다. 이는 API 호출을 하기 전에 사용자의 브라우저에서 어떤 프로토콜이 허용되는지 확인하는 데 유용합니다. DigitalCredential을 구현하는 브라우저에서는 (위에 표시된 typeof 검사로 감지 가능), 프로토콜 식별자가 DigitalCredentialProtocol사용자 에이전트가 지원을 채택함에 따라 점진적으로 추가되므로, 알 수 없는 프로토콜 식별자로 이 메서드를 호출하면 throw하여 예외를 발생시키지 않고 안전하게 false를 반환합니다. DigitalCredential이 정의되지 않은 브라우저에서 이 메서드를 호출하면 ReferenceError가 발생하므로, 이 메서드를 사용하기 전에 위에 표시된 typeof DigitalCredential !== "undefined" 가드가 여전히 필요합니다.

예제 2: userAgentAllowsProtocol() 정적 메서드 사용
if (DigitalCredential.userAgentAllowsProtocol("example-protocol")) {
  // DC API가 지원됩니다. 발급 또는 제시를 진행합니다.
} else {
  // DC API가 지원되지 않습니다. 예를 들어
  // 기존 HTML 폼 기반 접근 방식으로 대체합니다.
  showHTMLForm();
}

또는 여러 프로토콜의 지원 여부를 확인하고, 지원되지 않는 프로토콜을 걸러낼 수 있습니다.

예제 3: userAgentAllowsProtocol()으로 여러 프로토콜 확인
const protocols = [
  "example-issuance-protocol",
  "another-issuance-protocol"
];
const supportedProtocols = protocols.filter(DigitalCredential.userAgentAllowsProtocol);
if (supportedProtocols.length > 0) {
  // 하나 이상의 프로토콜이 지원됩니다. 발급을 진행합니다.
} else {
  // 지원되는 프로토콜이 없습니다. 다른 발급 방법으로 대체합니다.
}

프로토콜 식별자는 DigitalCredentialProtocol에 점진적으로 추가되므로, 이 메서드를 사용하여 최신 프로토콜을 선호하면서 레거시 브라우저에서는 이전 프로토콜로 우아하게 대체할 수 있습니다.

예제 4: 최신 프로토콜을 선호하고 이전 프로토콜로 대체
// 선호도 순서입니다. DigitalCredential을 구현하는 브라우저에서는
// 알 수 없는 프로토콜이 throw하지 않고 false를 반환합니다.
const protocol = [
  "example-new-protocol",
  "example-legacy-protocol",
].find(DigitalCredential.userAgentAllowsProtocol);

if (protocol) {
  // 이 브라우저가 지원하는 최선의 프로토콜을 사용합니다.
} else {
  // 지원되는 프로토콜을 찾지 못했습니다. 다른 접근 방식으로 대체합니다.
}

2.3 디지털 자격 증명 요청

다음 예제는 API를 사용하여 디지털 자격 증명을 요청하는 방법을 보여준다. API의 진입점은 navigator.credentials.get() 메서드이며, 이는 사용자 에이전트로부터 디지털 자격 증명을 요청하는 데 사용된다. 사용자 에이전트가 프레젠테이션을 지원하는 경우, 사용자가 디지털 자격 증명 선택기를 통해 디지털 자격 증명을 선택할 수 있게 한다:

예제 5: 디지털 자격 증명 요청
<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>

마찬가지로, 사이트가 디지털 자격 증명을 발급해야 하는 경우, Digital Credentials API는 사이트, 사용자 에이전트, 그리고 보유자 사이에서 디지털 자격 증명의 발급을 중재한다.

2.4 디지털 자격 증명 발급

다음 예제는 Digital Credentials API를 사용하여 디지털 자격 증명의 발급을 요청하는 방법을 보여준다. 디지털 자격 증명을 발급하려면, 사이트는 navigator.credentials.create() 메서드를 호출하며, 이 메서드는 사용자 에이전트가 발급을 지원하는 경우 발급 흐름을 시작한다:

예제 6: 디지털 자격 증명 발급 요청
<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>

2.5 오리진 간 디지털 자격 증명 요청

이 명세는 "digital-credentials-get" 정책 제어 기능을 통해 원격/제3자 오리진에서 자격 증명을 제시하기 위해 API를 사용할 수 있도록 허용합니다. 이는 웹 사이트가 다른 오리진에서 호스팅되는 검증 서비스로부터 디지털 자격 증명을 요청하려는 시나리오에 유용합니다. Permissions Policy는 API를 사용하려는 웹 사이트를 임베드하는 iframe에 설정할 수 있습니다. 다음은 iframe에 Permissions Policy를 설정하는 방법의 예입니다.

예제 7: 오리진 간 디지털 자격 증명 요청
<iframe src="https://verifier-service.example.com"
        allow="digital-credentials-get">
</iframe>

2.6 오리진 간 디지털 자격 증명 발급

마찬가지로, 이 명세는 "digital-credentials-create" 정책 제어 기능을 통해 원격/제3자 오리진에서 자격 증명을 발급하기 위해 API를 사용할 수 있도록 허용합니다. 이는 웹 사이트가 다른 오리진의 발급 서비스를 사용하여 디지털 자격 증명 발급을 요청하려는 시나리오에 유용합니다. Permissions Policy는 발급자의 인터페이스를 임베드하는 iframe에 설정할 수 있습니다. 예는 다음과 같습니다.

예제 8: 오리진 간 디지털 자격 증명 발급
<iframe src="https://issuer.example.com"
        allow="digital-credentials-create">
</iframe>

3. 범위

이 절은 비규범적입니다.

다음 항목은 이 명세의 범위에 포함됩니다.

다음 항목은 범위에서 제외됩니다.

4. 용어

참고: 논의 중인 정의

이 절의 정의 목표는 다양한 디지털 자격 증명 형식과 프로토콜 전반에서 공통적으로 사용되는 용어를 재사용하거나 확립하는 것입니다. 이러한 정의는 활발히 발전 중입니다.

자격 증명 요청
제시 요청 또는 발급 요청.
자격 증명 응답
제시 응답 또는 발급 응답.
디지털 자격 증명
발급자가 하나 이상의 주체에 대해 한 하나 이상의 주장을 포함하는 암호화 방식으로 서명된 디지털 문서입니다.
참고: 사람에 관한 디지털 자격 증명에 초점

이 명세는 현재 사람과 관련된 디지털 자격 증명에 초점을 맞추고 있습니다.

디지털 자격 증명 선택기
하나 이상의 자격 증명 요청을 사용자에게 제시하여, 사용자가 요청을 충족할 수 있는 디지털 자격 증명 또는 보유자를 선택하거나 작업을 취소할 수 있게 하는 플랫폼 제공 사용자 인터페이스입니다.
참고: credential chooser와의 관계
발급 프로토콜
발급자보유자 사이에서 디지털 자격 증명의 발급 중 통신에 사용되는 표준화된 프로토콜입니다. 발급 프로토콜은 프로토콜 식별자로 식별됩니다. 5. 프로토콜을 참조하십시오.
발급 요청
발급 요청은 일부 발급 요청 데이터발급 프로토콜로 구성된, 디지털 자격 증명을 발급하기 위한 요청입니다.
발급 요청 데이터
발급자 또는 사용자 에이전트가, 발급 프로토콜을 통해, 디지털 자격 증명발급자에게 발급하도록 요청하는 데 사용하는 데이터 구조입니다.
발급 응답
보유자발급 프로토콜을 통해, 발급자발급 요청에 응답하는 데 사용하는 형식입니다.
제시 프로토콜
보유자검증자 사이에서 디지털 자격 증명을 제시하는 데 사용되는 표준화된 프로토콜입니다. 프로토콜은 프로토콜 식별자로 식별됩니다. 5. 프로토콜을 참조하십시오.
제시 요청
제시 요청은 제시 요청 데이터제시 프로토콜로 구성된, 디지털 자격 증명을 요청하기 위한 요청입니다.
제시 요청 데이터
검증자 소프트웨어 또는 사용자 에이전트가, 제시 프로토콜을 통해, 디지털 자격 증명보유자에게 요청하는 데 사용하는 형식입니다.
제시 응답
디지털 지갑과 같은 보유자credential manager가, 제시 프로토콜을 통해, 검증자제시 요청에 응답하는 데 사용하는 형식입니다.
프로토콜 식별자
하나 이상의 ASCII lower alpha code points, 0개 이상의 U+002D HYPHEN-MINUS code points, 그리고 0개 이상의 ASCII digit code points로 구성된 문자열입니다(순서는 임의). 예: "123a-protocol", "abc" 또는 단순히 "a".
요청 조정자
자격 증명 요청 조정자를 참조하십시오.

5. 프로토콜

다음 제시 프로토콜의 사용은 이 명세에서 정의합니다.

이슈 439: 사용자 에이전트는 어떤 프로토콜을 구현해야 하는가? specsubstantive

#401에서, 저는 다음을 추가하자고 제안했습니다.

    <p>
       [=user agent=]는 [=table of exchange protocols=]에 나열된 [=digital credential/exchange protocol=] 중 적어도 하나를 구현해야 합니다.
       [=user agent=]가 [=table of exchange protocols=]에 나열된 모든 [=digital credential/exchange protocols=]을 구현하는 것이 권장됩니다. 
    </p>
    <aside class="note" title="사용자 에이전트가 허용하는 교환 프로토콜 확인">
      <p>개발자는 `DigitalCredential.`{{DigitalCredential.userAgentAllowsProtocol()}} 정적 메서드를 호출하여
      사용자 에이전트가 허용하는 [=digital credential/exchange protocols=]를 확인할 수 있습니다.
      사용 예는 [[[#checking-if-protocol-is-allowed]]]를 참조하십시오.
      </p>
    </aside>

그 이유는 다음과 같습니다.

  1. 사용자 에이전트가 적어도 하나는 지원하도록 강제하므로, 개발자는 최소한 무엇을 얻게 될지 알 수 있습니다.
  2. 모두 구현하도록 강하게 권장하지만 강제하지는 않습니다(아래 3번 또는 플랫폼 제한 때문에 어차피 강제할 수 없습니다).
  3. 미래에 새 교환 프로토콜을 추가하는 경우에도 기존 및 "레거시" 사용자 에이전트가 적합성을 유지하게 합니다. 예를 들어 특정 플랫폼에서는 어떤 프로토콜을 구현하는 것이 불가능할 수 있지만, 다른 프로토콜은 구현 가능할 수 있습니다.
지원되는 제시발급 프로토콜 표
식별자 명세
제시 프로토콜
openid4vp-v1-unsigned OpenID for Verifiable Presentations 1.0 § A.3.1. Unsigned Request
openid4vp-v1-signed OpenID for Verifiable Presentations 1.0 § A.3.2. Signed Request
openid4vp-v1-multisigned OpenID for Verifiable Presentations 1.0 § A.3.2.2. JWS JSON Serialization (다중 서명 요청)
org-iso-mdoc ISO/IEC 18013-7:2025 ISO 준수 운전면허증, Part 7: 모바일 운전면허증(mDL) 부가 기능 § 부속서 C
발급 프로토콜
openid4vci-v1 OpenID for Verifiable Credential Issuance 1.0 § 곧 제공 예정
이슈: API 통합

5.1 요청 프로토콜 변환

DigitalCredentialGetRequest 또는 DigitalCredentialCreateRequest request가 주어졌을 때, 요청 프로토콜을 변환하려면:

  1. request가 다음 중 하나이면:
    DigitalCredentialGetRequest인 경우:
    1. protocolStringrequestprotocol로 둔다.
    2. protocolStringDigitalCredentialPresentationProtocol열거형 값 중 어느 것과도 같지 않으면, failure를 반환한다.
    3. 값이 protocolStringDigitalCredentialPresentationProtocol 열거형 값을 반환한다.
    DigitalCredentialCreateRequest인 경우:
    1. protocolStringrequestprotocol로 둔다.
    2. protocolStringDigitalCredentialIssuanceProtocol열거형 값 중 어느 것과도 같지 않으면, failure를 반환한다.
    3. 값이 protocolStringDigitalCredentialIssuanceProtocol 열거형 값을 반환한다.

6. Credential Request Coordinator

credential request coordinatortop-level traversable을 통해 디지털 자격 증명 상호작용을 중개하는, 사용자 에이전트가 정의한 구성요소입니다. 각 top-level traversable에는 정확히 하나의 관련 조정자가 있습니다. 이 조정자는 모든 child navigables 전반에서 동시에 최대 하나의 상호작용만 활성화되도록 보장하고, 제시 또는 발급의 종단 간 흐름을 조율하며, 상호작용 상태 간 전환을 관리합니다.

credential request coordinatoractive promise를 유지하며, 사용자 에이전트는 이를 null로 초기화합니다. 이 Promise를 통해, coordinator는 비동기 자격 증명 요청 워크플로의 상태를 스크립트에 반영하고, 상호작용이 성공적으로 완료되면 자격 증명 응답으로 resolve하거나, 처리가 실패하거나, 사용자가 UI를 통해 요청을 취소하거나, 스크립트가 AbortSignal을 통해 작업을 중단하면 reject합니다.

credential request coordinatorabort signal을 유지하며, 사용자 에이전트는 이를 null로 초기화합니다.

credential request coordinatorabort algorithm을 유지하며, 사용자 에이전트는 이를 null로 초기화합니다.

credential request coordinator는 다음을 수행합니다.

사용자 에이전트는 사용자 또는 플랫폼 정책에 따라 일부 또는 모든 조정자 책임을 외부 credential managers, 플랫폼 구성요소 또는 기타 신뢰할 수 있는 엔터티에 위임할 MAY 있습니다.

참고

6.1 상호작용 상태

credential request coordinator는 유한한 상호작용 상태 집합을 가지며, 이는 자격 증명 요청의 생명주기를 관리하는 데 사용됩니다.

"idle":
현재 진행 중인 자격 증명 요청이 없습니다.
"requesting":
자격 증명 요청이 진행 중이며 사용자 인터페이스가 제시됩니다.
"aborting":
오류, 사용자 작업 또는 signal abort로 인해 활성 상호작용이 취소되고 있으며, 조정자는 "idle"로 돌아가기 전에 정리 작업을 수행하고 있습니다.

조정자는 idle 상호작용 상태로 초기화됩니다.

6.2 자격 증명 요청 준비

Document document, sequence of DigitalCredentialGetRequest values 또는 sequence of DigitalCredentialCreateRequest values requests, Promise promise, 그리고 선택적 AbortSignal signal이 주어졌을 때 자격 증명 요청을 준비하려면 다음을 수행합니다.

  1. globaldocumentrelevant global object로 둡니다.
  2. credential request coordinator가 "idle" 상호작용 상태가 아니면:
    1. global이 주어졌을 때, DOM manipulation task source에서 전역 작업을 큐에 넣어, promise를 "NotAllowedError" DOMException으로 reject합니다.
    2. 반환합니다.
  3. Assert: credential request coordinatoractive promisenull입니다.
  4. credential request coordinator 상호작용 상태를 "requesting"으로 설정합니다.
  5. credential request coordinatoractive promisepromise로 설정합니다.
  6. validatedRequestsrequests가 주어졌을 때의 자격 증명 요청 검증 결과로 둡니다. 이 과정에서 throw예외 error가 있으면:
    1. errorpromise자격 증명 요청을 reject합니다.
    2. 반환합니다.
  7. validatedRequests비어 있으면:
    1. 새로 생성한 TypeErrorpromise자격 증명 요청을 reject합니다.
    2. 반환합니다.
  8. signal이 전달되었으면:
    1. Assert: signalaborted가 아닙니다.
      참고

      미리 중단된 signals는 이 알고리즘이 호출되기 전에 Credential 요청 Credential 생성에서 처리됩니다.

    2. credential request coordinatorabort signalsignal로 설정합니다.
    3. abortAlgorithm을 다음 알고리즘으로 둡니다:
      1. credential request coordinatoractive promisepromise가 아니면 반환합니다.
      2. signalabort reason이 주어졌을 때 자격 증명 요청을 중단합니다.
    4. credential request coordinatorabort algorithmabortAlgorithm으로 설정합니다.
    5. abortAlgorithmsignal추가합니다.
  9. handledpromiseglobal이 주어졌을 때 virtual wallet behavior 처리를 실행한 결과로 둡니다.
  10. handledtrue이면 반환합니다.
  11. document, validatedRequests, promise, 그리고 signal자격 증명 요청을 개시합니다.
  12. documentfully active가 아니게 되면, "AbortError" DOMException으로 자격 증명 요청을 중단합니다.

6.3 자격 증명 요청 검증

DigitalCredentialGetRequest 또는 DigitalCredentialCreateRequest 객체들의 시퀀스 requests가 주어졌을 때, 자격 증명 요청을 검증하려면:

  1. validatedRequests를 새로운 빈 목록으로 둔다.
  2. requests의 각 request에 대해 반복한다:
    1. protocolrequest가 주어진 상태에서 요청 프로토콜 변환을 실행한 결과로 둔다.
    2. protocol이 failure이면, continue한다.
    3. protocol이 주어진 상태에서 사용자 에이전트가 프로토콜을 허용한 결과가 false를 반환하면, continue한다.
    4. requestDigitalCredentialGetRequest인 경우 datarequestdata로 두고, requestDigitalCredentialCreateRequest인 경우 requestdata로 둔다.
    5. data를 JSON 문자열로 직렬화한다.
    6. 직렬화 결과가 예외이면, 그 예외throw한다.
    7. request프레젠테이션 요청 데이터 또는 발급 요청 데이터request프레젠테이션 프로토콜 또는 발급 프로토콜 또는 기타 기준에 따라 검증한다. 검증 요구사항은 프로토콜별로 다르며 이 명세의 범위를 벗어난다:
      참고: 검증 세부사항은 범위 밖임
      이슈 472: 사용자 에이전트 요청 검증 및 오류 specsubstantive

      준비 단계는 원래 다음과 같이 명시했다:

      프로토콜에서 정의한 요구사항 외에도, [=user agent=]는 로컬 정책, 구성 또는 변화하는 보안 고려사항에 기반한 추가 검증 기준을 적용할 수 있다. 예를 들어, [=user agent=]는 (a) 특정 자격 증명 속성을 요구하는 요청, (b) [=user agent=]가 수락하지 않도록 구성된 암호화 알고리즘을 사용하거나 요구하는 요청(예: 알고리즘 민첩성 또는 포스트 양자 체계로의 전환의 일부로서), 또는 (c) [=user agent=]의 구성된 신뢰 결정에서 수락되지 않는 인증서나 신뢰 앵커에 의존하는 요청을 거부할 수 있다.

      이러한 사항들을 더 확장해 설명하면 좋을 것이다.

      1. 검증에 실패하면, 적절한 예외throw한다.
      2. 그렇지 않으면, requestvalidatedRequests추가한다.
  3. validatedRequests를 반환한다.

6.4 자격 증명 요청 중단

JavaScript 값 또는 DOMException error가 주어졌을 때 자격 증명 요청을 중단하려면 다음을 수행합니다.

  1. credential request coordinatoractive promisenull이면, 반환합니다.
  2. activePromisecredential request coordinatoractive promise로 둡니다.
  3. credential request coordinator가 "requesting" 상호작용 상태에 있으면:
    1. credential request coordinator 상호작용 상태를 "aborting"으로 설정합니다.
    2. 디지털 자격 증명 선택기를 닫습니다.
      참고

      닫기에 실패할 수 있지만(예: 디지털 자격 증명 선택기가 메모리 압박으로 인해 파괴된 경우), coordinator는 그와 관계없이 자격 증명 요청 완료를 계속 진행합니다.

  4. erroractivePromise자격 증명 요청을 reject합니다.

6.5 자격 증명 요청 거부

(JavaScript Value) errorPromise promise가 주어졌을 때 자격 증명 요청을 reject하려면 다음을 수행합니다.

  1. Assert: credential request coordinatoractive promisepromise입니다.
  2. promiserelevant global object가 주어졌을 때, DOM manipulation task source에서 전역 작업을 큐에 넣어 다음 단계를 수행합니다.
    1. credential request coordinatoractive promisepromise가 아니면 반환합니다.
    2. signalcredential request coordinatorabort signal로 둡니다.
    3. abortAlgorithmcredential request coordinatorabort algorithm으로 둡니다.
    4. signalnull이 아니고 abortAlgorithmnull이 아니면:
      1. abortAlgorithmsignal에서 제거합니다.
    5. credential request coordinatorabort signalnull로 설정합니다.
    6. credential request coordinatorabort algorithmnull로 설정합니다.
    7. promiseerrorReject합니다.
    8. credential request coordinatoractive promisenull로 설정합니다.
    9. credential request coordinator 상호작용 상태를 "idle"로 설정합니다.

6.6 자격 증명 요청 개시

Document document, 검증된 자격 증명 요청의 list validatedRequests, Promise promise, 그리고 선택적 AbortSignal signal이 주어졌을 때 자격 증명 요청을 개시하려면 다음을 수행합니다.

  1. topLevelOrigindocumenttop-level traversableactive documentrelevant settings objectorigin으로 둡니다.
  2. requestDatarequestsvalidatedRequests이고 top-level origintopLevelOrigin인 새 request context로 둡니다.
  3. 병렬로:
    1. requestData와 함께 디지털 자격 증명 선택기를 표시하고, 다음 결과 중 하나를 기다립니다.
      • 사용자가 요청을 충족할 수 있는 디지털 자격 증명 또는 보유자를 선택합니다.
      • 사용자가 작업을 취소합니다.
      • 플랫폼에서 오류가 발생합니다.
      이슈 456: CTAP을 통한 제시 discussionspec

      @mohamedamir와 논의 중이었습니다... 명세에서 크로스 플랫폼 교차 기기 자격 증명 교환은 CTAP을 통해 발생해야 한다고 SHOULD(또는 RECOMMENDED)라고 말해야 합니다.

      우리가 이를 의무화할 수 없는 이유(즉, MUST로 할 수 없는 이유)는 다음과 같습니다.

      • 이는 OS 또는 프레임워크별 사항이므로 명세 범위 밖입니다... 또는 적어도 브라우저가 전체 교환 스택을 구현하지 않고 흔히 수행할 수 있는 범위를 벗어납니다.
      • 플랫폼은 특히 교차 기기 교환을 위해 더 효율적인 또는 독점 프로토콜을 자유롭게 사용할 수 있습니다.
      • 지금 최상의 호환성을 제공하면서도 명세의 미래 대응성을 보장합니다.
    2. signal이 null이 아니고 signalaborted이면:
      1. 반환합니다.
        참고: 중단은 이미 처리됨

        자격 증명 요청 준비 단계에서 signal추가된 abort algorithm이 디지털 자격 증명 선택기 해제를 처리합니다.

    3. 사용자가 작업을 취소하거나 자격 증명이 선택되지 않은 경우:
      1. error를 새로 생성한 "NotAllowedError" DOMException으로 둡니다.
      2. errorpromise자격 증명 요청을 reject합니다.
      3. 반환합니다.
    4. 플랫폼이 플랫폼별 오류를 반환하는 경우:
      1. error를 다음과 같이 결정합니다.
        사용자 에이전트 또는 플랫폼이 작업을 허용하지 않는 경우:
        새로 생성한 "NotAllowedError" DOMException.
        요청 데이터가 형식에 맞지 않거나 유효하지 않은 경우:
        새로 생성한 TypeError.
        자격 증명 요청이 이미 진행 중인 경우:
        새로 생성한 "InvalidStateError" DOMException.
        그 밖의 경우:
        새로 생성한 "OperationError" DOMException.
      2. errorpromise자격 증명 요청을 reject합니다.
      3. 반환합니다.
    5. 사용자가 디지털 자격 증명을 선택한 경우:
      1. protocol을 이 교환에 대해 디지털 자격 증명 선택기가 반환한 프로토콜 식별자로 둡니다.
        참고: 프로토콜은 플랫폼이 결정함

        디지털 자격 증명 선택기 또는 그 기반 플랫폼은 validatedRequests 중 어느 항목을 보유자에게 전달할지 결정하고, 해당 교환에 대한 프로토콜 식별자를 반환합니다. 사용자 에이전트는 어떤 특정 항목이 선택되었는지 반드시 알지는 못합니다.

      2. responseData문자열 제시 응답 또는 문자열 발급 응답으로 둡니다. 이는 보유자가 반환한 것입니다.
        참고: 응답이 문자열인 이유
      3. documentrelevant global object가 주어졌을 때 DOM manipulation task source에서 전역 작업을 큐에 넣어 다음 단계를 수행합니다.
        1. credential request coordinatoractive promisepromise가 아니면 반환합니다.
        2. parsedResponseDataOrErrorresponseData가 주어졌을 때 JSON 문자열을 JavaScript 값으로 파싱한 결과로 둡니다.
        3. abortSignalcredential request coordinatorabort signal로 둡니다.
        4. abortAlgorithmcredential request coordinatorabort algorithm으로 둡니다.
        5. abortSignalnull이 아니고 abortAlgorithmnull이 아니면, abortAlgorithmabortSignal에서 제거합니다.
        6. credential request coordinatorabort signalnull로 설정합니다.
        7. credential request coordinatorabort algorithmnull로 설정합니다.
        8. parsedResponseDataOrError예외이면:
          1. promiseparsedResponseDataOrErrorReject합니다.
        9. 그렇지 않고, parsedResponseDataOrErrorobject가 아니면:
          1. promise를 새로 생성한 TypeErrorReject합니다.
        10. 그렇지 않으면:
          1. credential을 새로 생성한 DigitalCredential 인스턴스로 둡니다. 이 인스턴스의 dataparsedResponseDataOrError로 초기화되고, protocolprotocol로 초기화됩니다.
          2. promisecredentialResolve합니다.
        11. credential request coordinatoractive promisenull로 설정합니다.
        12. credential request coordinator 상호작용 상태를 "idle"로 설정합니다.

7. Digital Credentials API

Digital Credentials APICredential Management Level 1 명세를 활용하여, 사용자 에이전트발급프레젠테이션 디지털 자격 증명을 중재할 수 있게 한다.

이 API는 사용자 에이전트로부터 요청하는 것을 허용하며, 디지털 자격 증명을 사용자 에이전트에 요청하면, 사용자 에이전트는 사용자에게 디지털 자격 증명 선택기를 표시하여, 사용자가 요청을 충족할 수 있는 디지털 자격 증명을 선택할 수 있게 한다. 이는 웹사이트가 navigator.credentials.get() 메서드를 호출하여 이루어지며, 이 메서드는 Credential Management Level 1Credential 요청 알고리즘을 실행한다. 그러면 해당 알고리즘은 이 명세의 DigitalCredential 인터페이스의 [[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors) 내부 메서드로 다시 호출한다.

또한 이 API는 발급 요청도 허용한다. 이는 디지털 자격 증명의 발급을 요청하여, 사용자 에이전트 및/또는 보유자 사이에서 중재된 발급 흐름을 시작한다. 이는 navigator.credentials.create() 메서드를 호출하여 이루어지며, 이 메서드는 Credential Management Level 1자격 증명 생성 알고리즘을 실행한다. 그러면 해당 알고리즘은 이 명세의 DigitalCredential 인터페이스의 [[Create]](origin, options, sameOriginWithAncestors) 내부 메서드로 다시 호출한다.

Credential Management Level 1 명세와 통합하는 방법에 대한 전체 세부 사항은 Credential Management 통합을 참조하라.

7.1 CredentialRequestOptions 딕셔너리에 대한 확장

WebIDLpartial dictionary CredentialRequestOptions {
  DigitalCredentialRequestOptions digital;
};

7.1.1 digital 멤버

digital 멤버는 디지털 자격 증명 요청을 구성하기 위한 옵션을 허용합니다.

7.2 DigitalCredentialRequestOptions 딕셔너리

WebIDLdictionary DigitalCredentialRequestOptions {
  required sequence<DigitalCredentialGetRequest> requests;
};

7.2.1 requests 멤버

requests제시 프로토콜제시 요청 데이터를 지정하며, 사용자 에이전트는 이를 디지털 지갑과 같은 credential manager와 일치시킬 MAY 있습니다.

7.3 DigitalCredentialGetRequest 딕셔너리

DigitalCredentialGetRequest 딕셔너리는 제시 요청을 나타냅니다. 이는 제시 프로토콜과 일부 제시 요청 데이터를 지정하는 데 사용되며, 사용자 에이전트는 이를 디지털 지갑과 같은 credential manager와 일치시킬 MAY 있습니다.

WebIDLdictionary DigitalCredentialGetRequest {
  required DOMString protocol;
  required object data;
};

7.3.1 protocol 멤버

protocol 멤버는 제시 프로토콜을 나타냅니다.

protocol 멤버의 값은 DigitalCredentialPresentationProtocol에 정의된 프로토콜 식별자 중 하나입니다.

7.3.2 data 멤버

data 멤버는 디지털 신원 지갑과 같은 보유자credential manager가 처리할 제시 요청 데이터입니다.

7.4 CredentialCreationOptions 딕셔너리에 대한 확장

WebIDLpartial dictionary CredentialCreationOptions {
  DigitalCredentialCreationOptions digital;
};

7.4.1 digital 멤버

digital 멤버는 디지털 자격 증명 발급을 구성하기 위한 옵션을 허용합니다.

7.5 DigitalCredentialCreationOptions 딕셔너리

WebIDLdictionary DigitalCredentialCreationOptions {
  required sequence<DigitalCredentialCreateRequest> requests;
};

7.5.1 requests 멤버

requests발급 프로토콜발급 요청 데이터를 지정하며, 사용자 에이전트는 이를 보유자에게 전달할 MAY 있습니다.

7.6 DigitalCredentialCreateRequest 딕셔너리

DigitalCredentialCreateRequest 딕셔너리는 발급 요청을 나타냅니다. 이는 발급 프로토콜과 일부 발급 요청 데이터를 지정하고, 발급자보유자 사이에서 발급 요청을 전달하는 데 사용됩니다.

WebIDLdictionary DigitalCredentialCreateRequest {
  required DOMString protocol;
  required object data;
};

7.6.1 protocol 멤버

protocol 멤버는 발급 프로토콜을 나타냅니다.

protocol 멤버의 값은 DigitalCredentialIssuanceProtocol에 정의된 프로토콜 식별자 중 하나입니다.

7.6.2 data 멤버

data 멤버는 디지털 신원 지갑과 같은 보유자credential manager가 처리할 발급 요청 데이터입니다.

7.7 DigitalCredential 인터페이스

DigitalCredential 인터페이스는 개념적 디지털 자격 증명을 나타냅니다.

DigitalCredential 인터페이스는 사용자 제어와 동의를 보장하기 위해 모든 작업에 대해 사용자 중개를 요구합니다.

DigitalCredential과 관련된 get() 호출의 개발자 경험을 단순화하기 위해, 사용자 에이전트mediation 멤버가 없거나 "required"가 아닌 값을 갖는 경우에도 오류를 throw해서는 MUST NOT 됩니다. 마찬가지로, DigitalCredential과 관련된 create() 호출에서, 사용자 에이전트mediation 멤버가 없거나 "required"가 아닌 값을 갖는 경우에도 오류를 throw해서는 MUST NOT 됩니다. 이는 "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);
};

7.7.1 protocol 멤버

protocol 멤버는 디지털 자격 증명을 요청하는 데 사용된 제시 프로토콜 또는 디지털 자격 증명을 발급하는 데 사용된 발급 프로토콜입니다.

7.7.2 data 멤버

data 멤버는 자격 증명의 응답 데이터입니다. 이는 JSON으로 파싱 가능한 객체 유형의 하위 집합을 포함합니다.

7.7.3 userAgentAllowsProtocol() 메서드

userAgentAllowsProtocol() 메서드는 디지털 자격 증명 검증자가 사용자 에이전트가 허용하는 제시 프로토콜발급 프로토콜을 결정할 수 있게 합니다.

참고

이 메서드는 기반 OS/플랫폼의 제시 프로토콜 또는 발급 프로토콜 지원 여부를 전달하지 않습니다.

사용자 에이전트는 하드웨어 가용성, 소프트웨어의 존재 또는 구성, credential managers 또는 디지털 자격 증명, 또는 사용자 구성이나 환경설정에 관한 어떠한 정보에 따라서도 응답 값을 달리해서는 MUST NOT 됩니다. 응답 값이 달라진다면, 사용자 에이전트는 핑거프린팅 위험과 사용자 행동 또는 구성에 관한 다른 세부사항을 은밀히 드러낼 위험을 모두 도입하게 됩니다. 응답 값은 사용자 에이전트의 주요 버전에 의해서만 달라지고, 브라우저가 해당 프로토콜로 요청을 기반 플랫폼 또는 제공자에 배포하는 것을 지원하는지 여부를 나타내야 SHOULD 합니다.

DOMString protocol이 주어졌을 때 사용자 에이전트가 프로토콜을 허용하는지 확인하려면, 다음 단계를 수행합니다.

  1. protocolDigitalCredentialProtocolenumeration value가 아니면, false를 반환합니다.
  2. 사용자 에이전트가 protocol을 허용하면 true를 반환하고, 그렇지 않으면 false를 반환합니다.

이 메서드가 호출되면, 사용자 에이전트는 protocol이 주어졌을 때 사용자 에이전트가 프로토콜을 허용하는지의 결과를 반환해야 MUST 합니다.

7.8 지원 데이터 구조

이 명세에서 DigitalCredential을 지원하는 열거형 등의 데이터 구조입니다.

7.8.1 request context 구조체

request context는 다음 items를 가진 struct입니다.

requests
검증된 자격 증명 요청list입니다.
top-level origin
environment settings objectorigin입니다.

이 열거형의 값은 5. 프로토콜에 나열된 지원되는 제시 프로토콜에 해당합니다.

WebIDLenum DigitalCredentialPresentationProtocol {
  "openid4vp-v1-unsigned",
  "openid4vp-v1-signed",
  "openid4vp-v1-multisigned",
  "org-iso-mdoc"
};

이 열거형의 값은 5. 프로토콜에 나열된 지원되는 발급 프로토콜에 해당합니다.

WebIDLenum DigitalCredentialIssuanceProtocol {
  "openid4vci-v1",
};

8. Credential Management Level 1과의 통합

8.1 [[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors) 내부 메서드

호출되었을 때, [[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors) 내부 메서드는, 사용자 에이전트가 제시 요청을 지원하지 않는 경우(예: 플랫폼이 디지털 자격 증명 선택기를 제공할 수 없는 경우), 동일한 인수로 Credential[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors) 내부 메서드의 기본 구현을 호출합니다. 그렇지 않으면:

  1. optionssignal이 존재하면, signal을 그것으로 둡니다.
  2. signalaborted이면, signalabort reason으로 reject된 promise를 반환합니다.
  3. globalthisrelevant global object로 둡니다.
  4. documentglobal관련 Document로 둡니다.
  5. document사용자 주의를 가진 top-level traversable의 fully active descendant가 아니면, "NotAllowedError" DOMException으로 reject된 promise를 반환합니다.
  6. requestsoptionsdigitalrequests 멤버로 둡니다.
  7. globaltransient activation이 없으면, "NotAllowedError" DOMException으로 reject된 promise를 반환합니다.
  8. global사용자 활성화를 소비합니다.
  9. promisethisrelevant realm에 있는 새 promise로 둡니다.
  10. document, requests, promise, 그리고 signal자격 증명 요청을 준비합니다.
  11. promise를 반환합니다.

8.2 [[Store]](credential, sameOriginWithAncestors) 내부 메서드

호출되었을 때, [[Store]](credential, sameOriginWithAncestors)는 동일한 인수로 Credential[[Store]](credential, sameOriginWithAncestors) 내부 메서드의 기본 구현을 호출해야 MUST 합니다.

8.3 [[Create]](origin, options, sameOriginWithAncestors) 내부 메서드

호출되었을 때, [[Create]](origin, options, sameOriginWithAncestors) 내부 메서드는, 사용자 에이전트가 발급 요청을 지원하지 않는 경우, 동일한 인수로 Credential[[Create]](origin, options, sameOriginWithAncestors) 내부 메서드의 기본 구현을 호출합니다. 그렇지 않으면:

  1. optionssignal이 존재하면, signal을 그것으로 둡니다.
  2. signalaborted이면, signalabort reason으로 reject된 promise를 반환합니다.
  3. globalthisrelevant global object로 둡니다.
  4. documentglobal관련 Document로 둡니다.
  5. document사용자 주의를 가진 top-level traversable의 fully active descendant가 아니면, "NotAllowedError" DOMException으로 reject된 promise를 반환합니다.
  6. requestsoptionsdigitalrequests 멤버로 둡니다.
  7. globaltransient activation이 없으면, "NotAllowedError" DOMException으로 reject된 promise를 반환합니다.
  8. global사용자 활성화를 소비합니다.
  9. promisethisrelevant realm에 있는 새 promise로 둡니다.
  10. document, requests, promise, 그리고 signal자격 증명 요청을 준비합니다.
  11. promise를 반환합니다.

8.4 [[type]] 내부 슬롯

DigitalCredential interface object에는 [[type]]이라는 내부 슬롯이 있으며, 그 값은 "digital"입니다.

8.5 [[discovery]] 내부 슬롯

DigitalCredential interface object에는 [[discovery]]라는 내부 슬롯이 있으며, 그 값은 "remote"입니다.

8.6 사용자 권한

이 절은 비규범적입니다.

Digital Credentials API는 최종 사용자의 명시적 권한을 요구하는 강력한 기능이다. 이 요구사항은 CredentialsContainerget() 메서드를 호출할 때 규범적으로 적용된다.

9. Permissions Policy 통합

이 명세는 두 가지 정책 제어 기능을 정의합니다.

"digital-credentials-get"
문서가 디지털 자격 증명을 요청할 수 있게 하는 정책 제어 기능입니다. 그 기본 허용 목록'self'입니다. Credential 요청 알고리즘이 정책 강제 지점 역할을 합니다.
"digital-credentials-create"
문서가 디지털 자격 증명을 발급할 수 있게 하는 정책 제어 기능입니다. 그 기본 허용 목록'self'입니다. Credential 생성 알고리즘이 정책 강제 지점 역할을 합니다.

10. 보안 고려사항

이 절은 비규범적입니다.

이어지는 절들은 API의 보안 속성, 범위에 포함되는 위협, 보안이 의존하는 가정, 그리고 완화 조치가 적용된 후에도 남는 잔여 위협을 설명합니다. 이 명세는 자격 증명 응답을 중개할 때에만 사용자 에이전트의 동작에 대한 요구사항을 정의합니다.

참고

프로토콜, credential manager 구현, 운영 체제 또는 전송 보안에 의존하는 기타 보안 고려사항은 기대사항 또는 전제조건으로 설명되지만, 이미 규범적으로 명시되어 있지 않는 한 이 명세에서 규범적으로 요구하지 않습니다.

10.1 위협 모델

이 명세의 위협 모델에는 이 API에 대한 위협과 생태계의 인접 표준에 대한 위협이 포함됩니다.

이 명세에서 위협은 두 범주로 나뉩니다: 범위 내 위협범위 외 위협.

10.1.1 범위 내 위협

범위 내 위협은 DC API 자체가 도입하거나 처리하는 위협입니다. 다음은 이 명세의 범위 내 위협입니다.

요청 변조
안전하지 않은 컨텍스트에서 페이지 콘텐츠를 삽입하거나 수정할 수 있는 네트워크 공격자가 처리 전에 DigitalCredentialGetRequest 또는 DigitalCredentialCreateRequest를 변경하려고 시도합니다.
API 플러딩
악의적인 웹 사이트가 시스템 리소스를 고갈시키거나, 사용자를 혼란스럽게 하거나, 불필요한 자격 증명 상호작용을 만들거나, 사용자 경험을 저하시키는 프롬프트 피로를 유발하기 위해 빠르고 반복적인 요청으로 API를 압도하려고 시도합니다. 여기에는 페이지 로드 중이나 의미 있는 사용자 컨텍스트 없이 요청하는 등 부적절한 시점에 요청하는 것도 포함됩니다.
인가되지 않은 교차 오리진 접근
악의적인 웹 사이트가 삽입하는 사이트의 명시적 허가 없이 iframe과 같은 임베드된 제3자 콘텐츠를 통해 디지털 자격 증명을 요청하거나 발급하려고 시도하여, 잠재적으로 자격 증명 수집 또는 민감한 사용자 데이터에 대한 무단 접근을 가능하게 합니다.

10.1.2 범위 외 위협

범위 외 위협은 프로토콜, credential managers, OS 플랫폼 보안 또는 전송 계층에서 처리하는 위협입니다. "범위 밖"이라 하더라도, 자격 증명 제시 및 발급의 종단 간 보안에 영향을 주기 때문에 관련이 있습니다. 다음은 이 명세의 범위 외 위협을 정의합니다.

  • 작성 예정...

10.2 완화 조치

다음 완화 조치는 명세의 규범적 요구사항을 통해 범위 내 위협을 다룹니다.

Digital Credential API의 WebIDL 인터페이스보안 컨텍스트에서만 노출되어, 안전하지 않은 컨텍스트를 통한 변조의 위험을 줄인다 (예: 악성 스크립트가 네트워크를 통해 삽입되는 경우). 자세한 내용은 Secure Contexts 명세의 5 보안 고려사항 절을 참조하라.

Digital Credentials API는 두 가지 메커니즘을 통해 API 플러딩을 줄인다:

자격 증명 요청 남용을 방지하기 위한 추가 지침은 Credential Management Level 1 명세의 7 개인정보 보호 고려사항 절을 참조하라. 그러나 사이트가 여전히 자격 증명 요청을 트리거하는 불필요한 사용자 상호작용을 유도하기 위해 다크 패턴을 사용할 수 있으므로, 이러한 보호에는 한계가 있음에 유의한다.

Digital Credentials API는 Permissions Policy와의 통합을 통해 교차 출처 남용을 줄인다(Permissions Policy 통합 참조). Credential 요청Credential 생성 알고리즘은 각각 "digital-credentials-get""digital-credentials-create" 정책 제어 기능에 대한 정책 시행 지점으로 작동한다. 두 기능은 의도적으로 분리되어 있다. 사이트는 "digital-credentials-get"을 활성화하지 않고 "digital-credentials-create"를 활성화할 수 있으며, 그 반대도 가능하여, 각 임베드된 컨텍스트를 필요한 기능으로만 제한한다. 이 통합이 제공하는 추가 보안 속성은 Permissions Policy 명세의 Permissions Policy 절을 참조하라.

11. 개인정보 보호 고려사항

이 절은 비규범적입니다.

이슈: 개인정보 보호 고려사항 절은 진행 중인 작업입니다

이 절은 이 문서가 발전함에 따라 진행 중인 작업입니다.

Digital Credentials API는 여러 기술 계층과 다양한 참여자(예를 들어 검증자, 보유자, 발급자를 포함하되 이에 한정되지 않음)가 있는 복잡한 생태계에 통합되며, 각 참여자는 사용자 개인정보 보호의 서로 다른 측면을 고려해야 합니다. 이 명세는 서로 다른 참여자에 대한 모든 고려사항을 빠짐없이 나열하려고 하지 않습니다. 우리는 이러한 당사자들에게 디지털 자격 증명 위협 모델을 더 전체적으로 살펴보는 다양한 다른 자료를 참조하도록 안내하고자 합니다.

대신, 이러한 고려사항은 Digital Credentials API 자체에 초점을 맞추며, 사용자 에이전트가 API 구현에서 자신의 사용자 에이전트 의무를 충족할 수 있는 방법을 설명합니다. 이때 API가 상호작용하는 생태계의 관련 개인정보 보호 속성을 고려합니다.

디지털 자격 증명에 대한 개인정보 보호 고려사항은 정적이지 않습니다. 생태계가 성숙함에 따라 시간이 지나며 발전할 것이고, 생태계 내 다른 행위자의 동작, 스택의 다른 계층에서의 개선, 사용자 개인정보 보호에 대한 새로운 위협, 그리고 변화하는 사회적 규범과 규제의 영향을 받을 수 있습니다.

Digital Credentials API의 설계와 구현에 관여하는 다양한 그룹은 발전하는 개인정보 보호 환경을 적극적으로 모니터링하고 API의 상응하는 발전에 참여할 것으로 기대됩니다.

11.1 설계 고려사항 및 대안

Digital Credentials API는 웹 사이트의 디지털 자격 증명 요청을 중개하도록 설계되었으며, 자격 증명 형식과 그 안에 포함된 정보, 그리고 이를 교환하는 데 사용되는 프로토콜에 구애받지 않습니다. 이러한 설계 선택과 기타 핵심 설계 선택은 기존 대안(예: [custom-schemes])보다 사용자에게 더 안전하고 개인정보 보호가 강화된 자격 증명 교환 경험을 제공하면서도, 채택을 쉽게 하기 위해 일반적인 교환 프로토콜과 계속 호환되도록 하려는 목표에서 비롯됩니다.

이 API는 검증자보유자 사이의 연결 인터페이스를 제공합니다. 즉, 자격 증명 제시 프로토콜이 시작되고 사용자가 자격 증명을 선택하기 위해 보유자 애플리케이션으로 전환하는 수단입니다. 과거에 이 목적으로 사용된 해결책에는 QR 코드와 사용자 정의 URL 스킴이 포함됩니다. 웹에서 자격 증명 제시하기신원 제시를 위한 사용자 정의 스킴의 우려사항에 문서화된 것처럼, 이러한 해결책에는 보안, 개인정보 보호 및 접근성 문제가 있습니다.

디지털 자격 증명 기술의 채택이 생태계 수요와 규제 명령에 의해 추진됨에 따라, 웹 플랫폼은 앞서 언급한 덜 바람직한 기술에 대한 대안을 제공한다. 이 대안은 개발자가 사용하기 쉽고, 기존 자격 증명 프레젠테이션 프로토콜과 호환되며, 무엇보다도 앞서 언급한 대안보다 사용자에게 더 나은 개인정보 보호, 보안 및 접근성 특성을 제공한다.

Digital Credentials API는 사용자 에이전트에게 사용자 대신 중개할 수 있는 능력을 제공합니다(예: 디지털 자격 증명 선택기 형태). 이를 통해 요청에 맥락을 부여하고 보유자 애플리케이션에 대한 즉각적인 노출을 방지할 수 있습니다. 또한 지원되는 프로토콜에 대해 응답 암호화와 같은 특정 최소 요구사항을 강제합니다.

참고

11.2 개인정보 보호의 스펙트럼

Digital Credentials API는 서로 다른 수준의 데이터 공개를 수반하는 다양한 사용 사례와, 자신이 처한 맥락에 따라 서로 다른 선호를 가진 개별 사용자를 지원한다. 특히, 이 API가 중재하는 자격 증명 교환의 개인정보 보호 속성은 개별 사용자의 법률 및 규제 환경에 의해 의무화될 수 있다.

이는 일부 사용자가 자격 증명 정보를 교환하는 가장 개인정보 보호적인 수단을 사용하기를 원하지 않거나, 사용이 허용되지 않을 수도 있음을 의미한다. 그럼에도 불구하고, 사용자 에이전트는 기본적으로 비공개인 경험을 사용자에게 제공하고, 사용자를 피해로부터 보호해야 한다.

이러한 선호와 사용 사례의 스펙트럼 때문에, 사용자 에이전트가 사용자가 자신의 개인 정보를 노출하려는 것인지, 아니면 그렇게 하도록 속고 있는 것인지를 판별하기 어려울 수 있다. 따라서 교환이 시작되기 전에, 모든 사용자가 자신이 어떤 데이터를 공유하는지와 정보 교환에 누가 참여할 것인지를 이해하도록 보장하는 것은 사용자 에이전트의 책임이다.

11.3 제시 프로토콜 및 자격 증명 형식

Digital Credentials API는 여러 독립 당사자가 관여하는 교환의 중심에 위치하기 때문에, 이러한 당사자들이 사용자 정보를 교환하는 데 사용하는 제시 프로토콜과 자격 증명 형식은 사용자 개인정보를 보호하려는 사용자 에이전트의 목표에 매우 중요합니다.

11.3.1 사용자 개인정보 보호를 위한 제시 프로토콜 고려사항

이슈 255: 프로토콜 레지스트리: 검토만으로는 충분하지 않음 privacy-trackersecurity-trackerregistryprivacy-considerationssecurity-considerations

프로토콜에 대해 더 자세한 설명이 필요하다고 생각하는 두 가지 요구사항이 있습니다.

개인정보 보호 검토를 거쳤어야 함 [...]

그리고

보안 검토를 거쳤어야 함 [...]

기술적으로, "이 프로토콜은 모든 면에서 끔찍하다"라고 말하는 검토도 이러한 기준을 충족합니다.

프로토콜이 충족해야 하는 구체적인 개인정보 보호 및 보안 요구사항 집합이 있다면 더 유용할 것입니다. 그러한 검토는 표준이 달성되었는지 여부를 말할 수 있을 것입니다. 검토에는 주관적인 요소가 있을 수도 있지만, 각 프로토콜이 넘어야 하는 최소 기준도 있어야 합니다.

이는 현재 포함 기준에 있는 현재 요구사항 집합을 넘어섭니다. 저는 지금 포괄적인 목록을 가지고 있지는 않지만, 개발할 수는 있을 것입니다. 그리고 일단 개발되면 그 목록은 명세에 있어야 합니다. 예를 들어, 프로토콜이 phone home에 의존합니까? 프로토콜(또는 그것이 전달하는 형식)이 제시의 연결 불가능성을 보장합니까? 또는 일부 사용 사례에서는 연결 불가능성이 의미가 없다는 점을 고려할 때, API는 어떤 조건에서 프로토콜이 연결 불가능성을 제공하도록 요구합니까? 프로토콜에는 어떤 종류의 투명성 장치가 포함되어 있습니까? 어떤 종류의 은닉 채널이 허용됩니까?

11.3.1.1 선택적 공개

선택적 공개데이터 최소화를 위한 기본 기술로, 보유자검증자가 요청한 최소한의 필수 정보만 공유할 수 있게 합니다. 프로토콜은 검증자가 필요한 정확한 클레임을 지정할 수 있도록 하여 선택적 공개를 용이하게 할 것으로 기대됩니다.

11.3.1.2 연결 불가능한 제시

연결 불가능성은 사용자가 자격 증명에서 나온 속성을 여러 번 제시하더라도 검증자가 이러한 별도의 제시를 연결하여 동일한 사용자와 관련된 것이라고 결론 내릴 수 없도록 보장하는 속성입니다 (검증자-검증자 연결 가능성). 또는 검증자발급자와 공모하여 credential manager에서 나온 자격 증명 교환을 발급자에게 보고할 수 없도록 보장하는 속성이기도 합니다 (검증자-발급자 연결 가능성). 전자는 보유자발급자가 유지할 수 있는 속성입니다. 예를 들어 개별 검증자를 위해 새로운 자격 증명을 발급하는 방식입니다.

후자는 예를 들어 영지식 증명을 통해 달성 가능하지만, 암호화된 응답과 같은 API의 설계 선택으로 인해 사용자 에이전트가 검증자-발급자 비연결성이 실제로 달성되었음을 증명하는 것은 불가능하다. 그럼에도 불구하고 프로토콜은 가능한 모든 곳에서 연결 가능성을 제한하도록 요청된다.

비연결성은 특정 사용자 신원에 연결될 수 없는 속성에 대해서만 고려된다는 점에 유의하라. 이름, 운전면허 번호 또는 전화번호와 같이 본질적으로 연결 가능한 속성은 비연결성의 이점을 얻지 못한다.

Digital Credentials API를 통해 사용자 에이전트검증자자격 증명 관리자가 비연결 속성을 교환하도록 도울 수 있지만, 응답 암호화 때문에 검증자자격 증명 관리자 사이에 연결 가능한 정보가 전달되지 않는다고 보장할 수는 없다. 사용자 에이전트는 사용자 권한 경험에서 이 사실을 고려하는 것이 권장된다.

이슈 279: 프로토콜 요구사항으로서의 연결 가능성 및 발급자 관여 privacy-tracker

이 API의 목표는 어느 수준의 연결 불가능성입니까? 특정 연결 불가능성 기능에 대한 지원을 규범적으로 강제할 수 있습니까?

11.3.1.3 "Phone home" 메커니즘

"폰 홈"은 디지털 자격 증명의 제시 또는 검증이 발급자나 다른 중앙 엔터티로 다시 알림 또는 통신을 유발하여, 개인의 추적과 프로파일링으로 이어질 수 있는 시나리오를 가리킨다.

비연결성과 마찬가지로, 사용자가 자격 증명 요청을 진행할 권한을 부여한 후에는 사용자 에이전트발급자가 자격 증명 제시의 생성 또는 검증에 적극적으로 관여하지 않는다고 보장하는 것은 불가능하다. 그 시점부터는 자격 증명 관리자가 이 결정을 맡는다. 일부 자격 증명 관리자는 사용자 에이전트로 간주될 수 있지만, 일반적으로 사용자 에이전트Digital Credentials API를 구현할 때, 사용자 확인 전에 요청이 자격 증명 관리자에게 노출되는 것을 방지하도록 권한 경험을 설계하는 것이 권장된다 (여러 협력하는 사용자 에이전트를 통합하기 위한 고려사항을 염두에 둔다).

프로토콜은 발급자, 자격 증명 관리자검증자가 "phone home" 메커니즘에 대한 의존을 피하거나 줄일 수 있게 하는 메커니즘을 지원해야 한다.

이슈 279: 프로토콜 요구사항으로서의 연결 가능성 및 발급자 관여 privacy-tracker

이 API의 목표는 어느 수준의 연결 불가능성입니까? 명세가 발급자 관여에 대한 제한을 어느 정도까지 의무화할 수 있습니까?

11.3.1.4 연결 불가능한 폐기

자격 증명 교환에서 발급자가 관여하는 일반적인 사례는 자격 증명 철회 확인이다. 이는 프레젠테이션이 검증자-발급자 연결 불가능을 의도하는 경우 특히 어렵다. 자격 증명 프레젠테이션이 예를 들어 영지식 증명의 사용을 통해 연결 불가능하게 만들어지는 경우, 프로토콜에서 사용되는 자격 증명 형식은 암호학적 누산기와 같은 오프라인 철회 방법을 지원할 것으로 예상된다. 또한 프로토콜 설계와 명세는 가능한 경우 철회를 목적으로 한 검증자의 관여를 억제할 것으로 예상된다.

이슈 280: 프로토콜이 연결 불가능한 폐기를 지원하도록 요구할 수 있는가? privacy-trackerregistry

연결 불가능한 폐기 기술이 규범적으로 요구될 만큼 충분히 실용적인지 논의해야 합니다.

11.3.1.6 검증자 인가 지원

검증자 인가는 검증자가 자신의 신원을 증명하고 특정 속성 또는 자격 증명을 요청할 정당한 권한이 있음을 입증하는 프로세스를 의미합니다. 이는 정부 발급 자격 증명에서 나온 것과 같은 민감한 데이터를 교환할 때 특히 유용합니다. 검증자 인가는 불필요하거나 악의적인 자격 증명 요청을 제한하고, 검증자의 접근이 등록된 특정 자격 증명 속성으로 제한되도록 보장할 수 있습니다.

검증자 인가 확인은 보통 credential manager가 처리하지만, 사용자 에이전트는 그러한 체계의 존재가 API 남용을 방지하고 충분히 정보를 바탕으로 한 사용자 권한 경험을 설계하는 데 도움이 된다고 판단할 수 있습니다.

이슈 281: (정부 자격 증명에 대해) 인가된 검증자만 지원하는 사용자 에이전트 privacy-tracker

사용자 에이전트가 검증자 인가를 이해할 수 있도록 하는 조항을 프로토콜에 포함하도록 요구해야 합니까?

11.3.1.7 자격 증명 응답 암호화

"전송 중" 사용자 정보가 다른 당사자에게 노출되는 것을 방지하기 위해, 예를 들어 검증자 페이지에 로드된 브라우저 확장 프로그램에 노출되는 것을 방지하고, 검증자가 사용자 자격 증명을 안전하게 저장하도록 장려하기 위해, 프로토콜은 자격 증명 교환에서 암호화된 응답을 지원하고 의무화해야 합니다.

이슈 109: 응답 암호화가 요구되어야 하는가 discussionpending closureprivacy-trackersecurity-tracker

#49 및 우리가 진행한 여러 다른 논의와 관련이 있습니다. 응답은 항상 암호화되어야 한다고 말하고 싶은가요 (그렇다면 어떤 알고리즘으로), 아니면 이를 선택 사항으로 남겨두어도 괜찮은가요?

11.4 자격 증명에 대한 불필요한 요청

불필요한 자격 증명 요청은 전체 디지털 자격 증명 생태계의 핵심 개인정보 보호 위험입니다. 이는 서로 다른 방식과 동기에서 나타날 수 있습니다.

여기서 한 가지 과제는 무엇이 "유효한" 목적을 구성하는지, 따라서 어떤 요청이 "불필요한"지를 판단하는 것이며, 이는 자격 증명 교환에 관여하는 모든 당사자의 참여를 필요로 합니다.

불필요한 사용을 판단하고 대응하는 방법을 더 자세히 살펴보려면, 정부 발급 자격 증명과 기타 자격 증명을 별도로 고려하는 것이 타당하다. 두 유형은 데이터의 민감도와 오용으로 인한 잠재적 피해뿐 아니라 법률 및 규제 고려사항에서도 잠재적으로 다르기 때문이다.

두 유형의 자격 증명 모두에 적용되는 위험 완화와 사용자 통제 보장의 핵심 구성요소는 사용자 에이전트가 자격 증명 요청 메타데이터를 검사하고 이를 기반으로 결정이나 UI 표시를 수행할 수 있는 능력이다. 이 명세는 요청을 암호화하지 않고 전송하며 관련 정보를 포함하도록 하는 프로토콜 요구사항을 통해 이러한 사용자 에이전트 접근을 보장한다(5. 프로토콜6.2 자격 증명 요청 준비 참조).

11.4.1 정부 발급 자격 증명

정부 발급 디지털 자격 증명에는 여행 문서, 개인 면허, 복지 및 공중보건 프로그램 증명, 차량 등록, 그리고 정부 기관이 발급한 기타 문서 또는 이 정보를 나타내는 기타 문서가 포함됩니다. 이러한 문서는 사람의 개인 신원과 필수 공공 서비스와 상호작용할 수 있는 능력의 중심이 되는 영구적이고, 폐기 불가능하며, 고유한 식별자를 포함할 수 있으므로 매우 민감합니다.

11.4.1.1 정부 자격 증명의 도난 및 유출 위험

이러한 자격 증명이 사용자와 공격자에게 가지는 높은 가치는 도난의 상당한 위험과 인가되지 않은 제3자에게 유출될 경우의 상당한 잠재적 피해를 의미합니다. 여기에는 추적과 개인화를 목적으로 정부 신원 정보를 요청하는 것도 포함됩니다.

11.4.1.2 정부 자격 증명 요청 확산 위험

온라인에서 정부 자격 증명의 가용성이 높아지는 것에 대한 주요 우려는 제번스의 역설, 즉 접근 마찰이 낮아짐으로써 자격 증명에 대한 수요가 증가할 가능성입니다. 이 효과는 Digital Credentials API 자체로 인해 본질적으로 발생하는 것이 아니라 생태계 전반에서 디지털 자격 증명의 채택이 증가함에 따라 발생합니다. 다만 사용자 에이전트가 Digital Credentials API를 구현하면 추가적인 추진력이 생길 가능성이 큽니다. 따라서 API를 구현하는 사용자 에이전트는 이 효과를 고려해야 하며, 이는 사용자에게 해로운 결과를 초래할 수 있습니다.

  • 정보 유출 위험이 증가하고, 궁극적으로 웹에서 덜 신뢰할 수 있는 사용자 경험이 됩니다. 많은 서비스가 정부 발급 자격 증명에 접근하고 이를 안전하지 않은 방식으로 저장할 때(즉, 암호화를 유지하지 않거나 개인 키를 보호하지 못하는 경우), 데이터 유출과 무단 접근 가능성도 함께 증가합니다. 생년월일과 우편번호처럼 겉보기에는 식별 정보가 아닌 정보도 결합되면 통계적으로 개인을 식별할 수 있습니다.
  • 많은 웹 사이트가 사용자에게 개인정보 공유를 요청할 때 사용자는 프롬프트 피로와 신뢰 상실을 경험합니다.
  • 감시의 가능성과 온라인 서비스의 가명 사용에 대한 제한이 증가합니다. 검증자발급자 또는 다른 당사자 간의 공모는 웹에서 사용자의 활동을 면밀히 모니터링하고 해당 개인에게 불리한 조치를 취할 수 있는 능력으로 이어질 수 있습니다. 아무 조치가 취해지지 않더라도, 감시 가능성 자체만으로도 불안, 불편, 그리고 억제와 자기검열 같은 행동 변화를 야기하여 개인의 자율성과 표현의 자유에 영향을 줄 수 있습니다.
  • 이러한 자격 증명을 제공할 수 없거나 제공하고 싶지 않은 개인에 대한 배제 및 차별이 발생하여, 이전에는 정부 발급 자격 증명을 요구하지 않았던 웹상의 포럼 및 소셜 미디어 플랫폼과 같은 서비스 참여가 금지될 수 있습니다.
11.4.1.3 정부 자격 증명에 대한 불필요한 요청 완화

앞서 설명한 정부 발급 디지털 자격 증명의 위험은 생태계의 단일 참여자가 해결할 수 없는 과제를 제시하며, 실제 세계의 자격 증명을 통해 온라인 서비스에 접근하는 것의 위험과 이점에 대해 개별 주권 국가 내에서 더 광범위한 정책 논의를 필요로 합니다.

디지털 자격 증명을 발급하는 정부가 해당 자격 증명을 어떻게, 어떤 목적으로 사용할 수 있는지 명확히 정의하는 법률과 규정을 함께 제정하는 것이 바람직합니다. 교환에 관여하는 모든 당사자는, 법적으로 그렇게 할 의무가 있는지 여부와 관계없이, 존재하는 경우 정부 검증자 인증 체계를 지원하는 것이 권고됩니다. 검증자 인증 체계, 예를 들어 EUDI 접근 및 등록 인증서에 대한 지원(및 통합)은 불필요한 자격 증명 요청 확산 위험을 완화할 수 있습니다. 그러나 그러한 체계의 존재는 보장되지 않으며, 이는 자격 증명 교환의 위험을 크게 증가시킵니다.

Digital Credentials API를 구현하는 사용자 에이전트가 위험을 줄이고, 사용자의 이해를 높이며, 특정 유형의 피해를 방지하기 위해 취할 수 있는 다른 실용적인 단계도 있습니다.

  • 선택적 공개와 데이터 최소화의 기타 기법을 가능하게 하는 프로토콜만 지원하면 정보 유출의 영향과 가능성을 줄이고, 권한 및 동의 흐름에서 사용자에게 더 나은 맥락을 제공할 수 있다.
  • 영지식 증명과 같은 비연결성 메커니즘을 허용하는 프로토콜을 지원하면 검증자 기반 감시와 잠재적 차별을, 발급자를 숨김으로써 방지할 수 있다.
  • 유용한 맥락과 명확하게 이해할 수 있는 권한 흐름을 제공하면 사용자가 자격 증명 교환을 수락할지 여부에 대해 더 나은 결정을 내리는 데 도움이 되며, 이는 구체적인 사용자 필요 없이 이루어지는 교환 요청의 실현 가능성을 줄일 수 있다.

또한 사용자 에이전트가 이러한 완화 조치의 부재를 고려한 권한 경험을 설계하는 것이 매우 중요하다. 예를 들어, 검증자 인증 체계 없이 정부 자격 증명에서 개인 정보를 교환하는 경우가 이에 해당한다. 이러한 유형의 교환에는 관련 위험을 강조하는 명확한 사용자 메시지와 더 높은 수준의 마찰을 적용하는 것이 권장된다.

11.4.2 비정부 발급 자격 증명

비정부 발급 자격 증명에는 정부 발급이 아니며 정부 발급 문서를 나타내지 않는 모든 기타 디지털 문서, 인증서 및 증명이 포함됩니다. 여기에는 재직 증명, (비정부) 교육 자격 증명 또는 영화 티켓이 포함될 수 있습니다. 특히, 이러한 자격 증명의 교환은 법률과 규제에 의해 덜 제한될 가능성이 큽니다. 이러한 문서는 종종 정부 발급 자격 증명과 동일한 위험을 보이지는 않지만, 식별 가능한 정보 또는 민감한 정보를 포함할 수도 있습니다.

11.4.2.1 비정부 자격 증명의 도난 및 유출 위험

비정부 자격 증명의 도난과 유출이 미치는 영향과 실현 가능성은 대체로 각 개별 자격 증명 유형의 내용에 기반합니다. 일반적으로 이는 민감한 사적 정보의 통제 상실과 노출, 그리고 사칭과 데이터 도난으로 이어질 수 있으며, 이는 영향을 받은 개인에 대한 추가 공격 가능성을 높일 수 있습니다.

11.4.2.2 비정부 자격 증명 요청 확산 위험

비정부 자격 증명의 유연성과 규제 부족은 이메일 주소나 전화번호와 같은 장기 식별자를 통한 교차 사이트 추적 및 신원 연결을 목적으로 한 악용 가능성을 지닙니다. 디지털 자격 증명에 기반한 추적 체계에 참여하는 검증자는 사용자가 자신의 개인정보에 미치는 영향을 완전히 이해하지 못한 채 여러 사이트에서 식별자 자격 증명 공유를 수락하도록 유인을 만들 수 있습니다(웹을 위한 "로열티 카드").

그러한 체계에서 정보를 공유하기를 원하지 않는 사용자도 프롬프트 피로의 영향을 받을 수 있으며, 이러한 서비스를 사용하는 데서 배제될 위험도 있을 수 있습니다.

11.4.2.3 비정부 자격 증명에 대한 불필요한 요청 완화

비정부 발급 자격 증명의 경우, 사용자 에이전트가 요청된 자격 증명 형식과 그 개인정보 보호 속성을 이해하고, 사용자에게 표시되는 맥락과 각 자격 증명 유형에 적절한 마찰의 양을 알려주는 위험 프레임워크를 구축하는 것이 권장됩니다. 이러한 자격 증명의 교환에 관여하는 프로토콜과 형식은 일반적으로 선택적 공개와 연결 불가능성 같은 기능을 지원할 것으로 기대되지만, 특히 영화 티켓과 같은 저위험 자격 증명과 관련된 정보 교환에서는 이러한 기능이 항상 적절하거나 필요하지 않을 수 있습니다.

요청되는 자격 증명의 유형을 인식하는 사용자 에이전트는 요청된 자격 증명에 가장 잘 맞도록 권한 경험을 사용자화하고, 사용자가 이를 공유하는 결과를 이해하도록 돕는 것이 권장됩니다.

사용자 에이전트가 모든 자격 증명 요청을 이해할 것으로 기대할 수는 없다. 요청되는 자격 증명의 유형을 인식하지 못하는 사용자 에이전트는 권한 경험에서 사용자 마찰을 크게 높이고, 알 수 없는 자격 증명을 웹사이트와 공유할 때의 위험을 사용자에게 명확히 전달하는 것이 권고된다. 이는 적절한 수준의 마찰과 투명성을 적용하기 위해 서로 다른 사용자 에이전트 간의 통합이 필요할 수 있음에 유의하라. 예를 들어, 브라우저는 자격 증명 요청에 관한 지식을 운영 체제에 위임할 수 있으며, 운영 체제는 자격 증명 관리자가 알려진 자격 증명 유형을 등록하고 알 수 없는 자격 증명 유형에 대한 교환 요청을 거부하도록 요구할 수 있다.

이슈 100: 사용자 에이전트 요청 검증과 관련하여 견고성 원칙 적용 고려 discussionprivacy-considerations

사용자에게 적절한 투명성을 제공해야 할 필요성은 명시적인 사용자 에이전트의 동의 없이도 생태계가 새로운 자격 증명 형식을 개발할 수 있도록 하려는 바람과 충돌합니다.

11.4.2.4 악용 신고
이슈 267: 자격 증명 요청의 악용 신고 privacy-trackerprivacy-considerations

불필요하고 악의적인 요청을 하는 검증자를 위한 상호운용 가능한 악용 신고 시스템을 고려하십시오.

11.5 핑거프린팅 및 데이터 유출

11.5.1 브라우저 핑거프린팅

API는 권한 프롬프트 없이 사용자 데이터가 절대 공유되지 않도록 보장하지만 ([[[#user-permission-and-transparency|사용자 권한 및 투명성]] 섹션 참조), Digital Credentials API가 반환할 가능성이 있는 실제 세계 식별자의 수명과 고유성은 이를 추적자와 핑거프린터의 잠재적 대상으로 만든다.

선택적 공개가 있더라도, 공격자는 디지털 자격 증명에서 얻은 데이터 (예: 사용자의 나이, 또는 자격 증명의 발급자, 타임스탬프; [[[#leaking-incidental-data|부수적 데이터 유출]] 섹션 참조)를 결합하여 사용자를 재식별하거나 핑거프린팅할 수 있다.

이 공격은 제3자 공격자(예: 검증자의 페이지에 삽입되었지만 추적 목적으로 적극적으로 협력하지 않는 스크립트)에게는 더 어려울 수 있습니다. 응답 암호화가 의무이며 응답은 검증자의 서버에서 복호화되어야 하기 때문입니다. 따라서 검증자는 복호화된 정보가 클라이언트 측 JavaScript로 다시 반영되지 않도록 보장할 수 있습니다. 그러나 모든 검증자가 그렇게 하기로 선택하지는 않을 것입니다.

11.5.2 자격 증명 제시를 통한 부수적 데이터 유출

자격 증명의 진위를 보장하기 위해, 검증자에게 제시되는 자격 증명에는 일반적으로 검증자가 접근을 요청하는 내용보다 더 많은 정보가 포함됩니다. 보통 최소한 발급자credential manager의 서명, 그리고 잠재적으로 기타 메타데이터가 포함됩니다.

이러한 추가 정보는 사용자를 재식별하고 핑거프린팅하는 데 사용될 수 있으며, 이는 그 외에는 연결 불가능한 제시가 이루어질 때 특히 관련이 있습니다.

Digital Credentials API가 자격 증명 응답의 내용을 제어하지는 않지만, 사용자 에이전트는 요청된 것 외에 어떤 정보가 검증자와 공유될 가능성이 있는지 명확히 강조하고, 더 넓게는 검증자가 API를 통해 수행하는 핑거프린팅을 식별하고 차단함으로써 이러한 유형의 추적으로부터 사용자를 보호하는 데 도움을 줄 수 있습니다.

11.5.3 프로토콜 가용성을 통한 기기 속성 노출

Digital Credentials API는 userAgentAllowsProtocol()을 통해 사용자 에이전트가 어떤 제시발급 프로토콜을 지원하는지에 관한 정보를 노출합니다. 예를 들어 사용자의 기기에 어떤 credential manager 애플리케이션이 설치되어 있는지에 따라 응답을 사용자화하지 않음으로써, 브라우저 핑거프린팅과 사용자의 기기 구성에 관한 정보 노출을 완화합니다. 따라서 반환되는 정보는 기껏해야 사용자 에이전트 버전과 동등합니다.

11.5.4 자격 증명 가용성 유출 방지

Digital Credentials API는 사이트가 먼저 사용자 권한 흐름을 거치지 않고는 자격 증명이 사용 가능한지 알 수 있게 하지 않습니다. 자격 증명의 존재를 드러내는 것은 사용자 개인정보 보호에 대한 위험입니다. 자격 증명의 존재는 사용자가 사이트와 공유하고 싶지 않았을 수 있는 개인정보이며, 다른 신호와 결합될 경우 사용자의 허락 없이 사용자를 식별하는 데 사용될 수 있기 때문입니다. 이는 표현의 자유에 대한 위험이기도 합니다. 웹 사이트가 서비스에 접근하기 위해 사용자에게 이러한 자격 증명의 제시를 점점 더 요구하기 시작할 수 있으며, 자격 증명을 제시하고 싶지 않은 개인을 배제할 수 있기 때문입니다.

11.6 사용자 권한 및 투명성

이슈: 진행 중인 작업

Digital Credentials API는 자격 증명을 통해 매우 개인적이고, 민감하며 위험에 노출될 수 있는 사용자 정보를 웹 사이트와 공유할 수 있게 하며, 영구적이고 고유하며 폐기 불가능하고 교차 컨텍스트에서 사용되는 식별자를 통해 온라인과 오프라인에서 사용자를 추적할 수 있는 능력을 잠재적으로 부여합니다. 또한 사용자의 탐색 활동 일부와 특정 웹 사이트 및/또는 credential managers에 자신을 식별하려는 의도도 드러냅니다. 자격 증명 요청에서 사용자 에이전트의 중요한 책임 중 하나는 정보 교환을 진행하기 위한 사용자 권한을 수집하는 것입니다.

사용자가 자격 증명 교환을 진행할지에 대해 충분히 정보를 바탕으로 결정을 내리는 데 필요한 중요한 맥락 세부사항에는 다음이 포함됩니다.

사용자 에이전트는 구현에서 사용자 관련 정보의 어떠한 교환이 발생하기 전에, 나열된 세부사항이 사용자에게 완전히 공개되도록 보장하는 것이 권고됩니다.

이슈 252: 권한 프롬프트의 요소를 규범적으로 정의해야 하는가? privacy-considerations

이것들이 명세에서 규범적이어야 합니까?

이슈 44: API 요청은 사이트가 요청된 자격 증명 정보가 왜, 어떻게 사용될 것인지 설명하는 데 필요한 것을 제공해야 함 enhancementpending closureprivacy-tracker

사이트가 맥락 내 설명을 제공할 수 있도록 API를 설계해야 합니까?

11.6.1 여러 자격 증명 요청 처리

이슈 286: 여러 제시 요청(및 응답)에 대한 개인정보 보호 고려사항 privacy-trackerprivacy-considerations

자격 증명 제시를 위한 여러 요청과 응답을 처리할 때의 우려사항, 절충점 및 가능한 완화 조치를 설명해야 합니다.

11.6.2 여러 사용자 에이전트 통합

사용자의 시스템 기술 아키텍처에 따라, "사용자 에이전트"의 정의에는 브라우저와 운영 체제와 같은 소프트웨어 스택의 여러 협력 계층이 포함될 가능성이 큽니다. 이러한 계층의 최우선 순위는 안전하고 충분히 정보를 바탕으로 한 사용자 권한 경험이어야 합니다. 따라서 통합은 사용자 안전에 매우 중요할 수 있습니다. 일부 계층은 사용자의 자격 증명 가용성과 같이 다른 계층이 접근할 수 없는 정보를 보유할 수 있습니다. 과도한 프롬프트 또는 충분한 맥락 없는 프롬프트는 (악용 가능한) 혼란과 프롬프트 무감각으로 이어질 수 있습니다.

이러한 이유로, 권한을 요청하는 사용자 에이전트는 그렇게 하는 것이 안전하다고 판단하는 경우, 이상적인 사용자 경험을 위해 소프트웨어 계층을 통합하는 것이 권장됩니다. 예를 들어, 브라우저가 운영 체제의 API 계약을 신뢰하여 적절한 프롬프트를 표시하도록 하고, 따라서 브라우저 자체는 프롬프트를 표시하지 않는 경우가 이에 해당할 수 있습니다.

11.6.3 Credential Manager 선택 전 권한

사용자 권한 흐름의 일부로, 사용자 에이전트는 사용자가 자격 증명 요청을 credential manager에 전달할지 여부와 어떤 credential manager를 선택할지 선택할 권한을 유지하도록 보장해야 합니다. 이는 요청의 일부로 발생하는 정보 공개와, credential manager가 요청 시점에 이 정보를 보관하거나 공유할 수 있는 능력 때문입니다.

12. 접근성 고려사항

구현자는 이 API를 위해 특별히 자격 증명 선택기를 설계할 때 접근성을 고려해야 합니다. 발급 또는 제시 중에 제시되는 모달 대화상자의 콘텐츠는 텍스트, QR 코드 및 기타 시각 매체를 포함할 수 있으며, 레이블이 지정되고 보조 기술에 노출되어야 SHOULD 합니다.

상호작용 요소, 특히 사용자가 발급 또는 제시 요청을 계속하거나 중단할 수 있게 하는 요소는 기기 독립적인 방식으로 조작 가능해야 MUST 합니다.

13. 자동화된 테스트

사용자 에이전트 자동화 및 애플리케이션 테스트를 위해, 이 문서는 WebDriver BiDi 명세를 위한 확장 모듈을 정의합니다. 사용자 에이전트가 이를 지원하는 것은 OPTIONAL입니다.

13.1 digitalCredentials 모듈

digitalCredentials 모듈은 [[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors), 및 [[Create]](origin, options, sameOriginWithAncestors) 호출 중 credential managers의 원격 끝 동작을 관리하고 시뮬레이션하기 위한 명령을 포함합니다.

13.1.1 유형

CDDLdigitalCredentials.VirtualWalletAction = "decline" / "respond" / "wait" / "clear"

digitalCredentials.SetVirtualWalletBehaviorParameters = {
  action: digitalCredentials.VirtualWalletAction,
  ? context: text,
  ? protocol: text,
  ? response: { * text => any },
}

digitalCredentials.VirtualWalletAction 유형은 다양한 유형의 가상 지갑 동작을 나타냅니다.

"decline"
가상 지갑은 사용자 취소 또는 거부를 시뮬레이션하여 요청을 중단합니다.
"respond"
가상 지갑은 성공적인 사용자 상호작용을 시뮬레이션하고 미리 정의된 자격 증명 응답을 반환합니다.
"wait"
가상 지갑은 활성 상태의 대기 중 프롬프트를 시뮬레이션하여, 타임아웃 또는 동시 요청 처리를 테스트하기 위해 활성 promise를 사실상 미해결 상태로 둡니다.
"clear"
활성 가상 지갑 동작을 지웁니다.

13.1.2 명령

13.1.2.1 digitalCredentials.setVirtualWalletBehavior 명령
명령 유형
CDDLdigitalCredentials.SetVirtualWalletBehavior = (
  method: "digitalCredentials.setVirtualWalletBehavior",
  params: digitalCredentials.SetVirtualWalletBehaviorParameters
)
반환 유형
CDDLdigitalCredentials.SetVirtualWalletBehaviorResult = EmptyResult

sessioncommand parameters가 주어졌을 때 digitalCredentials.setVirtualWalletBehavior 명령에 대한 원격 끝 단계는 다음과 같습니다.

  1. actioncommand parameters["action"]으로 둡니다.
  2. command parameters["context"]가 존재하면 context를 그것으로 두고, 그렇지 않으면 null로 둡니다.
  3. command parameters["protocol"]이 존재하면 protocol을 그것으로 두고, 그렇지 않으면 null로 둡니다.
  4. command parameters["response"]가 존재하면 response를 그것으로 두고, 그렇지 않으면 null로 둡니다.
  5. action"respond"이면:
    1. protocolnull이거나 responsenull이면, invalid argument 오류 코드를 가진 오류를 반환합니다.
    2. protocolDigitalCredentialProtocolenumeration value가 아니면, invalid argument 오류 코드를 가진 오류를 반환합니다.
    3. response를 JSON 문자열로 직렬화합니다.
    4. 직렬화 결과가 예외이면, invalid argument 오류 코드를 가진 오류를 반환합니다.
  6. 그렇지 않으면:
    1. responsenull이 아니거나 protocolnull이 아니면, invalid argument 오류 코드를 가진 오류를 반환합니다.
  7. action"clear"이면:
    1. contextnull이 아니면, WebDriver sessionactive virtual wallet behavior에서 context에 대한 항목을 제거합니다.
    2. 그렇지 않으면, WebDriver sessionactive virtual wallet behaviornull로 설정합니다.
  8. 그렇지 않으면:
    1. behavior를 (action, protocol, response)의 튜플로 둡니다.
    2. contextnull이 아니면, WebDriver session의 browsing context ID context에 대한 active virtual wallet behaviorbehavior로 설정합니다.
    3. 그렇지 않으면, WebDriver session의 기본 active virtual wallet behaviorbehavior로 설정합니다.
  9. 데이터 null과 함께 success를 반환합니다.

13.2 가상 지갑 동작 처리

Promise promise와 전역 객체 global이 주어졌을 때 가상 지갑 동작을 처리하려면, 다음 단계를 실행합니다.

  1. 사용자 에이전트가 자동화 상태가 아니면, false를 반환합니다.
  2. context IDglobalbrowsing context의 ID로 둡니다.
  3. behaviorcontext ID에 대한 현재 WebDriver sessionactive virtual wallet behavior로 둡니다.
  4. behaviornull이면, behavior를 현재 WebDriver session의 기본 active virtual wallet behavior로 설정합니다.
  5. behaviornull이면, false를 반환합니다.
  6. (action, protocol, response)를 behavior로 둡니다.
  7. action"wait"이면, true를 반환합니다.
  8. action"decline"이면:
    1. promise를 "NotAllowedError" DOMException으로 Reject합니다.
    2. true를 반환합니다.
  9. action"respond"이면:
    1. JSON stringresponse직렬화한 결과로 둡니다.
    2. JS objectglobalrelevant realm이 주어졌을 때 JSON string파싱한 결과로 둡니다.
    3. credential을 새 DigitalCredential 인스턴스로 둡니다.
    4. credentialprotocol 속성을 protocol로 설정합니다.
    5. credentialdata 속성을 JS object로 설정합니다.
    6. global이 주어졌을 때 DOM manipulation task source에서 전역 작업을 큐에 넣어, promisecredentialresolve합니다.
    7. true를 반환합니다.

A. 색인

A.1 이 명세에서 정의한 용어

A.2 참조로 정의된 용어

B. IDL 색인

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",
};

C. CDDL 색인

C.1 모듈: remote-cddl

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
)

C.2 모듈: local-cddl

digitalCredentials.SetVirtualWalletBehaviorResult = EmptyResult

D. 적합성

비규범적으로 표시된 절뿐만 아니라, 이 명세의 모든 작성 지침, 다이어그램, 예제 및 참고는 비규범적입니다. 이 명세의 그 밖의 모든 것은 규범적입니다.

이 문서의 핵심 단어 MAY, MUST, MUST NOT, OPTIONAL, 그리고 SHOULD는 여기에 표시된 것처럼 모두 대문자로 나타날 때, 그리고 오직 그 경우에만 BCP 14 [RFC2119] [RFC8174]에 설명된 대로 해석되어야 합니다.

E. 감사의 말

편집자 일부는 이 명세에 대한 피드백과 기여에 대해 다음 개인들에게 감사드립니다: 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).

Some of the Editors would like to thank the following individuals for their feedback and contributions to this specification: 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 (Invited Expert), Manu Sporny (Digital Bazaar), Orie Steele (Transmute), Ted Thibodeau Jr (OpenLink Software), David Waite (Ping Identity), and Kristina Yasuda (SPRIND).

F. 참고문헌

F.1 규범적 참고문헌

[credential-management]
Credential Management Level 1. Nina Satragno; Marcos Caceres. W3C. 2026년 4월 10일. W3C 작업 초안. URL: https://www.w3.org/TR/credential-management-1/
[dom]
DOM Standard. Anne van Kesteren. WHATWG. Living Standard. URL: https://dom.spec.whatwg.org/
[html]
HTML Standard. Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Infra Standard. Anne van Kesteren; Domenic Denicola. WHATWG. Living Standard. URL: https://infra.spec.whatwg.org/
[ISO18013-7]
ISO/IEC 18013-7:2025 ISO 호환 운전 면허증, Part 7: 모바일 운전면허증(mDL) 추가 기능. ISO/IEC JTC 1/SC 17. International Organization for Standardization. 2025년 5월. URL: https://www.iso.org/standard/91154.html
[OPENID4VCI]
OpenID for Verifiable Credential Issuance 1.0. Torsten Lodderstedt; Kristina Yasuda; Tobias Looker; Paul Bastian. OpenID Foundation. 2025년 9월 16일. 최종판. URL: https://openid.net/specs/openid-4-verifiable-credential-issuance-1_0.html
[OPENID4VP]
OpenID for Verifiable Presentations 1.0. Oliver Terbu; Torsten Lodderstedt; Kristina Yasuda; Daniel Fett; Joseph Heenan. OpenID Foundation. 2025년 7월 9일. 최종판. URL: https://openid.net/specs/openid-4-verifiable-presentations-1_0.html
[permissions]
Permissions. Marcos Caceres; Mike Taylor. W3C. 2025년 10월 6일. W3C 작업 초안. URL: https://www.w3.org/TR/permissions/
[permissions-policy]
Permissions Policy. Ian Clelland. W3C. 2025년 10월 6일. W3C 작업 초안. URL: https://www.w3.org/TR/permissions-policy-1/
[RFC2119]
요구 수준을 나타내기 위해 RFC에서 사용하는 핵심 단어. S. Bradner. IETF. 1997년 3월. 현재 모범 사례. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC8174]
RFC 2119 핵심 단어에서 대문자와 소문자의 모호성. B. Leiba. IETF. 2017년 5월. 현재 모범 사례. URL: https://www.rfc-editor.org/rfc/rfc8174
[vc-data-model]
검증 가능한 자격 증명 데이터 모델 v2.0. Ivan Herman; Michael Jones; Manu Sporny; Ted Thibodeau Jr; Gabe Cohen. W3C. 2025년 5월 15일. W3C 권고안. URL: https://www.w3.org/TR/vc-data-model-2.0/
[vc-use-cases]
검증 가능한 자격 증명 사용 사례. Joe Andrieu; Kevin Dean. W3C. 2026년 3월 18일. W3C 워킹 그룹 참고 문서. URL: https://www.w3.org/TR/vc-use-cases/
[webdriver]
WebDriver. Simon Stewart; David Burns. W3C. 2026년 5월 28일. W3C 작업 초안. URL: https://www.w3.org/TR/webdriver2/
[webdriver-bidi]
WebDriver BiDi. James Graham; Alex Rudenko; Maksim Sadym. W3C. 2026년 5월 22일. W3C 작업 초안. URL: https://www.w3.org/TR/webdriver-bidi/
[webidl]
Web IDL Standard. Edgar Chen; Timothy Gu. WHATWG. Living Standard. URL: https://webidl.spec.whatwg.org/

F.2 정보성 참고문헌

[credential-considerations]
웹의 자격 증명에 대한 사용자 고려사항. Nick Doty; Rick Byers. W3C. 2025-03-26. URL: https://github.com/w3c/credential-considerations/blob/main/credentials-considerations.md
[custom-schemes]
신원 제시를 위한 사용자 지정 스킴에 대한 우려. Rick Byers. W3C. 2024-05-01. URL: https://github.com/w3c-fedid/digital-credentials/blob/main/custom-schemes.md
[identity-web-impact]
신원 & 웹. Simone Onofri. W3C. 2025-02-25. URL: https://www.w3.org/reports/identity-web-impact
[presenting-credentials-on-the-web]
웹에서 자격 증명 제시. Simone Onofri. URL: https://docs.google.com/document/d/1Ppaz_EnhzHqPOz5UusRJvbSunh-RXPWgJ3Np_TM2EE0/
[prevent-credential-abuse]
디지털 자격 증명 남용 방지. Daniel Appelquist; Martin Thomson. W3C. 2025년 11월 14일. TAG Finding. URL: https://www.w3.org/2001/tag/doc/prevent-credential-abuse/
[privacy-principles]
개인정보 보호 원칙. Robin Berjon; Jeffrey Yasskin. W3C. 2025년 5월 15일. STMT. URL: https://www.w3.org/TR/privacy-principles/
[rfc6973]
인터넷 프로토콜에 대한 개인정보 보호 고려사항. A. Cooper; H. Tschofenig; B. Aboba; J. Peterson; J. Morris; M. Hansen; R. Smith. IETF. 2013년 7월. 정보 제공용. URL: https://www.rfc-editor.org/rfc/rfc6973
[secure-contexts]
보안 컨텍스트. Mike West. W3C. 2023년 11월 10일. CRD. URL: https://www.w3.org/TR/secure-contexts/
[threat-model-decentralized-credentials]
분산형 자격 증명을 위한 위협 모델. Simone Onofri; Amir Sharif. W3C. 2026년 5월 29일. DNOTE. URL: https://www.w3.org/TR/threat-model-decentralized-credentials/