이 문서는 W3C Verifiable Credentials Data Model v1.1의 한국어 번역본입니다.

이 문서에 오역 및 오타를 포함할 수 있습니다. 영어 원문만이 공식적이고 규범적인 효력을 가지고 있습니다. 문의나 개선사항은 깃헙 링크lukas.j.han@gmail.com로 연락주시기 바랍니다.

원문작성일: 2022-03-03
최초번역일: 2024-03-23
최종수정일: 2024-04-25

편집자 (가나다순):
한종호 (Hopae Inc.)

크리덴셜은 우리 일상생활의 한 부분이다. 운전면허증은 우리가 자동차를 운전할 수 있는 능력이 있음을 주장하는 데 사용되고, 대학 학위는 우리의 교육 수준을 주장하는 데 사용될 수 있으며, 정부에서 발급한 여권은 우리가 국가 간에 여행할 수 있게 해준다. 이 규격은 이러한 종류의 크리덴셜을 암호학적으로 안전하고, 프라이버시를 존중하며, 기계적으로 검증 가능한 방식으로 웹에서 표현할 수 있는 메커니즘을 제공한다.

Comments regarding this document by the W3C Advisory Committee are welcome before January 14th 2021, but readers should be aware that the comment period regarding the rest of this document has ended and the Working Group is unlikley to make substantive modifications to the specification at this stage. Please file issues directly on GitHub, or send them to public-vc-comments@w3.org (subscribe, archives).

The Working Group has received implementation feedback showing that there are at least two implementations for each normative feature in the specification. The group has obtained reports from fourteen (14) implementations. For details, see the test suite and implementation report.

소개

크리덴셜은 우리 일상생활의 한 부분이다. 운전면허증은 우리가 자동차를 운전할 수 있는 능력이 있음을 주장하는 데 사용되고, 대학 학위는 우리의 교육 수준을 주장하는 데 사용될 수 있으며, 정부에서 발급한 여권은 우리가 국가 간에 여행할 수 있게 해준다. 이러한 크리덴셜은 물리적 세계에서 사용될 때 우리에게 이점을 제공하지만, 웹에서의 사용은 여전히 난해한 상태이다.

현재 웹에서 교육 자격, 의료 데이터, 금융 계좌 세부 정보 및 기타 종류의 제3자 검증된 기계 판독 가능한 개인 정보를 표현하는 것은 어렵다. 웹에서 디지털 크리덴셜을 표현하는 것이 어렵기 때문에 물리적 크리덴셜이 물리적 세계에서 우리에게 제공하는 것과 동일한 이점을 웹을 통해 받는 것이 어려워진다.

이 규격은 크리덴셜을 암호학적으로 안전하고, 프라이버시를 존중하며, 기계적으로 검증 가능한 방식으로 웹에서 표현할 수 있는 표준 방법을 제공한다.

검증가능한 크리덴셜과 관련된 개념에 익숙하지 않은 사람들을 위해 다음 섹션에서는 다음에 대한 개요를 제공한다:

검증가능한 크리덴셜이란 무엇인가?

물리적 세계에서 크리덴셜은 다음으로 구성될 수 있다:

검증가능한 크리덴셜은 물리적 크리덴셜이 나타내는 모든 정보를 표현할 수 있다. 디지털 서명과 같은 기술의 추가로 인해 검증가능한 크리덴셜은 물리적인 크리덴셜보다 변조가 더 어렵고 신뢰할 수 있게 된다.

검증가능한 크리덴셜보유자검증가능한 프레젠테이션을 생성한 다음 이러한 검증가능한 프레젠테이션검증자와 공유하여 특정 특성을 가진 검증가능한 크리덴셜을 소유하고 있음을 증명할 수 있다.

검증가능한 크리덴셜검증가능한 프레젠테이션 모두 빠르게 전송될 수 있어, 원격으로 신뢰를 구축하려고 할 때 물리적인 크리덴셜보다 더 편리하다.

이 규격은 디지털 크리덴셜을 쉽게 표현할 수 있도록 하는 동시에, 이 목표를 다수의 프라이버시 보호 목표와 균형을 맞추려고 시도한다. 디지털 정보의 지속성과 이질적인 디지털 데이터 출처를 쉽게 수집하고 연관시킬 수 있다는 점은 검증 가능하고 쉽게 기계 판독이 가능한 크리덴셜의 사용으로 인해 악화될 수 있는 프라이버시 문제이다. 이 문서는 섹션에서 이러한 문제들을 설명하고 해결하려고 시도한다. 영지식 증명과 같은 프라이버시 강화 기술을 사용하여 이 데이터 모델을 사용하는 방법의 예시도 이 문서 전반에 걸쳐 제공된다.

생태계 개요

이 섹션에서는 검증가능한 크리덴셜이 유용할 것으로 예상되는 생태계에서 핵심 참여자의 역할과 그들 간의 관계에 대해 설명한다. 역할은 다양한 방식으로 구현될 수 있는 추상적인 개념이다. 역할의 분리는 표준화를 위한 인터페이스와 프로토콜을 제안한다. 이 규격에서는 다음과 같은 역할을 소개한다:

보유자
하나 이상의 검증가능한 크리덴셜을 소유하고 이로부터 검증가능한 프레젠테이션을 생성함으로써 엔티티가 수행할 수 있는 역할. 보유자의 예로는 학생, 직원 및 고객이 있다.
발급자
하나 이상의 주체에 대한 클레임을 주장하고, 이러한 클레임으로부터 검증가능한 크리덴셜을 만들고, 검증가능한 크리덴셜보유자에게 전송함으로써 엔티티가 수행하는 역할. 발급자의 예로는 기업, 비영리 단체, 무역 협회, 정부 및 개인이 있다.
주체
클레임이 만들어지는 대상인 엔티티. 주체의 예로는 인간, 동물 및 사물이 있다. 대부분의 경우 검증가능한 크리덴셜보유자가 주체이지만, 특정 경우에는 그렇지 않다. 예를 들어, 부모(보유자)가 자녀(주체)의 검증가능한 크리덴셜을 보유하거나, 애완동물 주인(보유자)이 애완동물(주체)의 검증가능한 크리덴셜을 보유할 수 있다. 이러한 특수한 경우에 대한 자세한 내용은 부록 을 참조하시오.
검증자
처리를 위해 하나 이상의 검증가능한 크리덴셜을 선택적으로 검증가능한 프레젠테이션 내에서 수신함으로써 엔티티가 수행하는 역할. 검증자의 예로는 고용주, 보안 담당자 및 웹사이트 등이 있다.
검증가능한 데이터 레지스트리
검증가능한 크리덴셜 사용에 필요할 수 있는 식별자, 키 및 기타 관련 데이터(예: 검증가능한 크리덴셜 스키마, 폐기 레지스트리, 발급자 공개 키 등)의 생성 및 검증을 중재함으로써 시스템이 수행할 수 있는 역할. 일부 구성에서는 주체에 대한 상관관계가 있는 식별자가 필요할 수 있다. 검증가능한 데이터 레지스트리의 예로는 신뢰할 수 있는 데이터베이스, 탈중앙화된 데이터베이스, 정부 ID 데이터베이스 및 분산 원장 등이 있다. 종종 생태계에서는 두 가지 이상의 유형의 검증가능한 데이터 레지스트리가 활용된다.
diagram showing how
	       credentials flow from issuer to holder and
	       presentations flow from holder to verifier where all
	       three parties can use information from a logical
	       verifiable data registry
The roles and information flows forming the basis for this specification.

above provides an example ecosystem in which to ground the rest of the concepts in this specification. Other ecosystems exist, such as protected environments or proprietary systems, where verifiable credentials also provide benefit.

사용 사례 및 요구사항

검증가능한 크리덴셜 사용 사례 문서 [[VC-USE-CASES]]는 독자에게 유용할 수 있는 여러 가지 주요 주제를 간략히 설명하고 있다:

사용 사례 문서의 문서화 및 분석 결과, 이 규격에 대해 다음과 같은 바람직한 생태계 특성이 식별되었다:

적합한 문서는 이 규격의 규범적 진술을 준수하는 데이터 모델의 모든 구체적인 표현이다. 구체적으로, 이 문서의 , 섹션의 모든 관련 규범적 진술은 반드시 시행되어야 한다. 적합한 문서의 직렬화 형식은 섹션에 설명된 대로 결정론적이고 양방향이며 무손실이어야 한다. 적합한 문서는 그러한 모든 직렬화 형식으로 전송되거나 저장될 수 있다.

적합한 프로세서적합한 문서를 생성하거나 사용하는 소프트웨어 및/또는 하드웨어로 실현된 모든 알고리즘이다. 적합한 프로세서는 부적합한 문서가 사용될 때 오류를 생성해야 한다.

이 규격은 발급자, 보유자 또는 검증자와 같은 생태계의 역할 적합성에 대해 규범적인 진술을 하지 않는다. 생태계 역할의 적합성은 애플리케이션, 사용 사례 및 시장 수직 분야에 매우 특화되어 있기 때문이다.

디지털 서명의 하위 집합인 디지털 증명 메커니즘은 검증가능한 크리덴셜의 보호를 보장하는 데 필요하다. 증명을 보유하고 유효성 검사하는 것은 증명의 구문에 따라 달라질 수 있으며(예: 키 보유자 증명을 위해 JSON Web Token의 JSON Web Signature 사용), 검증가능한 크리덴셜을 처리하는 데 필수적인 부분이다. 출판 시점에, 작업 그룹 구성원들은 최소한 세 가지 증명 메커니즘을 사용하여 검증가능한 크리덴셜을 구현했다:

구현자는 이 규격의 출판 날짜를 기준으로 모든 증명 메커니즘이 표준화되지는 않았음에 유의해야 한다. 그룹은 이러한 메커니즘 중 일부와 새로운 메커니즘이 독립적으로 성숙하여 시간이 지남에 따라 표준화될 것으로 기대한다. 여러 유효한 증명 메커니즘이 있기 때문에 이 규격은 단일 디지털 서명 메커니즘을 표준화하지 않는다. 이 규격의 목표 중 하나는 다양한 현재 및 미래의 디지털 증명 메커니즘으로 보호할 수 있는 데이터 모델을 제공하는 것이다. 이 규격을 준수하는 것은 특정 증명 메커니즘의 세부 사항에 의존하지 않으며, 검증가능한 크리덴셜이 사용하는 메커니즘을 명확하게 식별할 것을 요구한다.

이 문서에는 또한 JSON 및 JSON-LD 콘텐츠가 포함된 예제가 포함되어 있다. 이러한 예제 중 일부에는 인라인 주석(//) 및 예제에 거의 가치를 더하지 않는 정보를 표시하기 위한 줄임표(...) 사용과 같이 잘못된 JSON 문자가 포함되어 있다. 구현자는 정보를 유효한 JSON 또는 JSON-LD로 사용하려면 이 내용을 제거하는 것이 좋다.

Terminology

핵심 데이터 모델

다음 섹션에서는 이 규격의 기반을 형성하는 클레임, 크리덴셜, 프레젠테이션과 같은 핵심 데이터 모델 개념에 대해 설명한다.

클레임

클레임주체에 대한 진술이다. 주체클레임이 만들어질 수 있는 대상이다. 클레임주체-속성- 관계를 사용하여 표현된다.

주체는 값을 갖는 속성을 가지고 있다
클레임의 기본 구조.

위의 에 설명된 클레임의 데이터 모델은 강력하며 다양한 진술을 표현하는 데 사용될 수 있다. 예를 들어, 누군가가 특정 대학을 졸업했는지 여부는 아래 와 같이 표현될 수 있다.

Pat은 Example University라는 값을 가진 alumniOf 속성을 가지고 있다
Pat이 "Example University"의 동문임을 나타내는 기본 클레임.

개별 클레임주체에 대한 정보의 그래프를 표현하기 위해 결합될 수 있다. 아래 에 표시된 예는 Pat이 Sam을 알고 있으며 Sam이 교수로 고용되어 있다는 클레임을 추가하여 이전 클레임을 확장한 것이다.

extends previous
            diagram with another property called knows whose value is
            Sam, and Sam has a property jobTitle whose value is Professor
Multiple claims can be combined to express a graph of information.

이 시점에서 클레임과 정보의 그래프 개념이 소개되었다. 클레임을 신뢰할 수 있으려면 그래프에 더 많은 정보가 추가될 것으로 예상된다.

크리덴셜

크리덴셜은 동일한 엔티티에 의해 만들어진 하나 이상의 클레임 집합이다. 크리덴셜에는 발급자, 만료 날짜 및 시간, 대표 이미지, 검증을 위해 사용할 공개 키, 폐기 메커니즘 등과 같은 크리덴셜의 속성을 설명하는 식별자와 메타데이터도 포함될 수 있다. 메타데이터에는 발급자의 서명이 포함될 수 있다. 검증가능한 크리덴셜은 변조 방지 클레임과 메타데이터 집합으로, 누가 발급했는지를 암호학적으로 증명한다.

검증가능한 크리덴셜은 크리덴셜 메타데이터, 클레임, 증명을 포함한다
검증가능한 크리덴셜의 기본 구성 요소.

검증가능한 크리덴셜의 예로는 디지털 직원 신분증, 디지털 출생증명서, 디지털 교육 증명서 등이 있다.

크리덴셜 식별자는 종종 크리덴셜의 특정 인스턴스를 식별하는 데 사용된다. 이러한 식별자는 상관관계에도 사용될 수 있다. 상관관계를 최소화하려는 보유자크리덴셜 식별자를 공개하지 않는 선택적 공개 체계를 사용하는 것이 좋다.

위의 검증가능한 크리덴셜의 기본 구성 요소를 보여주지만, 클레임이 정보 그래프로 구성되는 방법과 이러한 정보 그래프검증가능한 크리덴셜로 구성되는 방법에 대한 세부 사항은 추상화한다. 아래 는 일반적으로 적어도 두 개의 정보 그래프로 구성되는 검증가능한 크리덴셜의 보다 완전한 묘사를 보여준다. 첫 번째 그래프크리덴셜 메타데이터클레임을 포함하는 검증가능한 크리덴셜 자체를 표현한다. 두 번째 그래프는 일반적으로 디지털 서명인 디지털 증명을 표현한다.

diagram with a
	       Credential Graph on top connected via a proof to a
	       Proof Graph on the bottom.  The Credental Graph has
	       Credential 123 with 4 properties: 'type' of value
	       AlumniCredential, 'issuer' of Example University,
	       'issuanceDate' of 2010-01-01T19:23:24Z, and
	       credentialSubject of Pat, who has an alumniOf property
	       with value of Example University.  The Proof Graph has
	       Signature 456 with 5 properties: 'type' of
	       RsaSignature2018, 'verificationMethod' of Example University
	       Public Key 7, 'created' of 2017-06-18T21:19:10Z, and 'jws'
         of 'BavEll0...3JT24='
Information graphs associated with a basic verifiable credential.

결혼 증명서와 같이 서로 관련이 없어도 되는 다른 주체에 대한 여러 클레임을 포함하는 크리덴셜을 가질 수 있다.

크리덴셜이 발급된 엔티티에 대한 클레임을 전혀 포함하지 않는 크리덴셜을 가질 수 있다. 예를 들어, 특정 개에 대한 클레임만 포함하지만 개의 주인에게 발급되는 크리덴셜이 있다.

프레젠테이션

프라이버시 향상은 이 규격의 핵심 설계 기능이다. 따라서 이 기술을 사용하는 엔티티가 특정 상황에 적합한 페르소나의 일부분만 표현할 수 있는 것이 중요하다. 페르소나의 일부를 표현하는 것을 검증가능한 프레젠테이션이라고 한다. 서로 다른 페르소나의 예로는 한 사람의 직업상 페르소나, 온라인 게임 페르소나, 가족 페르소나 또는 익명 페르소나 등이 있다.

검증가능한 프레젠테이션은 하나 이상의 검증가능한 크리덴셜의 데이터를 표현하며, 데이터의 저작권을 검증할 수 있는 방식으로 패키징된다. 검증가능한 크리덴셜이 직접 제시되면 검증가능한 프레젠테이션이 된다. 검증가능한 크리덴셜에서 파생되었지만 그 자체로는 검증가능한 크리덴셜을 포함하지 않는 암호학적으로 검증 가능한 데이터 형식도 검증가능한 프레젠테이션일 수 있다.

프레젠테이션의 데이터는 종종 동일한 주체에 관한 것이지만, 여러 발급자에 의해 발급되었을 수 있다. 이 정보의 집합은 일반적으로 사람, 조직 또는 엔티티의 한 측면을 표현한다.

검증가능한 프레젠테이션은 프레젠테이션 메타데이터, 검증가능한 크리덴셜, 증명을 포함한다
검증가능한 프레젠테이션의 기본 구성 요소.

위의 검증가능한 프레젠테이션의 구성 요소를 보여주지만, 검증가능한 크리덴셜이 정보 그래프로 구성되고 이러한 정보 그래프검증가능한 프레젠테이션으로 구성되는 방법에 대한 세부 사항은 추상화한다.

아래 는 일반적으로 적어도 네 개의 정보 그래프로 구성되는 검증가능한 프레젠테이션의 보다 완전한 묘사를 보여준다. 첫 번째 정보 그래프인 프레젠테이션 그래프는 프레젠테이션 메타데이터를 포함하는 검증가능한 프레젠테이션 자체를 표현한다. 프레젠테이션 그래프verifiableCredential 속성은 하나 이상의 검증가능한 크리덴셜을 참조하며, 각각은 두 번째 정보 그래프, 즉 크리덴셜 메타데이터와 클레임을 포함하는 자체 포함된 크리덴셜 그래프이다. 세 번째 정보 그래프인 크리덴셜 증명 그래프는 일반적으로 디지털 서명인 크리덴셜 그래프 증명을 표현한다. 네 번째 정보 그래프인 프레젠테이션 증명 그래프는 일반적으로 디지털 서명인 프레젠테이션 그래프 증명을 표현한다.

상단에 프레젠테이션 그래프가 있고 하단에 프레젠테이션 증명 그래프가 증명으로 연결된 다이어그램. 프레젠테이션 그래프에는 값이 VerifiablePresentation인 'type', 값이 Do Not Archive인 'termsOfUse', 값이 Figure 6인 'verifiableCredential'의 3가지 속성을 가진 프레젠테이션 ABC가 있다. 프레젠테이션 증명 그래프에는 RsaSignature2018인 'type', Example Presenter Public Key 11인 'verificationMethod', 2018-01-15T12:43:56Z인 'created', d28348djsj3239인 'challenge', 'p2KaZ...8Fj3K='인 'jws'의 5가지 속성을 가진 시그니처 8910이 있다.
기본 검증가능한 프레젠테이션과 관련된 정보 그래프.

비즈니스 페르소나와 같이 종종 관련이 있지만 반드시 그럴 필요는 없는 여러 주체에 대한 여러 크리덴셜을 사용하는 프레젠테이션을 가질 수 있다.

구체적인 라이프사이클 예시

이전 섹션에서는 그래픽 묘사를 사용하여 클레임, 검증가능한 크리덴셜, 검증가능한 프레젠테이션의 개념을 소개했다. 이 섹션에서는 이 규격에서 지원하는 구체적인 구문 중 하나로 표현된 데이터 모델의 간단하지만 완전한 라이프사이클 예시를 제공한다. 검증가능한 크리덴셜 생태계에서 크리덴셜프레젠테이션의 라이프사이클은 일반적으로 다음과 같은 공통 경로를 거친다:

  1. 하나 이상의 검증가능한 크리덴셜 발급.
  2. 검증가능한 크리덴셜을 (디지털 지갑과 같은) 크리덴셜 리포지토리에 저장.
  3. 검증자를 위해 검증가능한 크리덴셜검증가능한 프레젠테이션으로 구성.
  4. 검증자에 의한 검증가능한 프레젠테이션검증.

이 라이프사이클을 설명하기 위해, 대학에서 동문 할인을 받는 예시를 사용할 것이다. 아래 예시에서 Pat은 대학에서 동문 검증가능한 크리덴셜을 받고, Pat은 검증가능한 크리덴셜을 디지털 지갑에 저장한다.

{
  // set the context, which establishes the special terms we will be using
  // such as 'issuer' and 'alumniOf'.
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://www.w3.org/2018/credentials/examples/v1"
  ],
  // specify the identifier for the credential
  "id": "http://example.edu/credentials/1872",
  // the credential types, which declare what data to expect in the credential
  "type": ["VerifiableCredential", "AlumniCredential"],
  // the entity that issued the credential
  "issuer": "https://example.edu/issuers/565049",
  // when the credential was issued
  "issuanceDate": "2010-01-01T19:23:24Z",
  // claims about the subjects of the credential
  "credentialSubject": {
    // identifier for the only subject of the credential
    "id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
    // assertion about the only subject of the credential
    "alumniOf": {
      "id": "did:example:c276e12ec21ebfeb1f712ebc6f1",
      "name": [{
        "value": "Example University",
        "lang": "en"
      }, {
        "value": "Exemple d'Université",
        "lang": "fr"
      }]
    }
  },
  // digital proof that makes the credential tamper-evident
  // see the NOTE at end of this section for more detail
  "proof": {
    // the cryptographic signature suite that was used to generate the signature
    "type": "RsaSignature2018",
    // the date the signature was created
    "created": "2017-06-18T21:19:10Z",
    // purpose of this proof
    "proofPurpose": "assertionMethod",
    // the identifier of the public key that can verify the signature
    "verificationMethod": "https://example.edu/issuers/565049/keys/1",
    // the digital signature value
    "jws": "eyJhbGciOiJSUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..TCYt5X
      sITJX1CxPCT8yAV-TVkIEq_PbChOMqsLfRoPsnsgw5WEuts01mq-pQy7UJiN5mgRxD-WUc
      X16dUEMGlv50aqzpqh4Qktb3rk-BuQy72IFLOqV0G_zS245-kronKb78cPN25DGlcTwLtj
      PAYuNzVBAh4vGHSrQyHUdBBPM"
  }
}
        

그런 다음 Pat은 동문 할인을 받으려고 시도한다. 티켓 판매 시스템인 검증자는 "Example University"의 동문은 스포츠 이벤트 시즌 티켓 구매 시 할인을 받을 수 있다고 명시한다. Pat은 모바일 기기를 사용하여 시즌 티켓 구매 프로세스를 시작한다. 이 프로세스의 한 단계에서 동문 검증가능한 크리덴셜을 요청하고, 이 요청은 Pat의 디지털 지갑으로 전달된다. 디지털 지갑은 Pat에게 이전에 발급받은 검증가능한 크리덴셜을 제공할지 묻는다. Pat은 동문 검증가능한 크리덴셜을 선택하고, 이는 검증가능한 프레젠테이션으로 구성된다. 검증가능한 프레젠테이션검증자에게 전송되고 검증된다.

{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://www.w3.org/2018/credentials/examples/v1"
  ],
  "type": "VerifiablePresentation",
  // the verifiable credential issued in the previous example
  "verifiableCredential": [{
    "@context": [
      "https://www.w3.org/2018/credentials/v1",
      "https://www.w3.org/2018/credentials/examples/v1"
    ],
    "id": "http://example.edu/credentials/1872",
    "type": ["VerifiableCredential", "AlumniCredential"],
    "issuer": "https://example.edu/issuers/565049",
    "issuanceDate": "2010-01-01T19:23:24Z",
    "credentialSubject": {
      "id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
      "alumniOf": {
        "id": "did:example:c276e12ec21ebfeb1f712ebc6f1",
        "name": [{
          "value": "Example University",
          "lang": "en"
        }, {
          "value": "Exemple d'Université",
          "lang": "fr"
        }]
      }
    },
    "proof": {
      "type": "RsaSignature2018",
      "created": "2017-06-18T21:19:10Z",
      "proofPurpose": "assertionMethod",
      "verificationMethod": "https://example.edu/issuers/565049/keys/1",
      "jws": "eyJhbGciOiJSUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..TCYt5X
        sITJX1CxPCT8yAV-TVkIEq_PbChOMqsLfRoPsnsgw5WEuts01mq-pQy7UJiN5mgRxD-WUc
        X16dUEMGlv50aqzpqh4Qktb3rk-BuQy72IFLOqV0G_zS245-kronKb78cPN25DGlcTwLtj
        PAYuNzVBAh4vGHSrQyHUdBBPM"
    }
  }],
  // digital signature by Pat on the presentation
  // protects against replay attacks
  "proof": {
    "type": "RsaSignature2018",
    "created": "2018-09-14T21:19:10Z",
    "proofPurpose": "authentication",
    "verificationMethod": "did:example:ebfeb1f712ebc6f1c276e12ec21#keys-1",
    // 'challenge' and 'domain' protect against replay attacks
    "challenge": "1f44d55f-f161-4938-a659-f8026467f126",
    "domain": "4jt78h47fh47",
    "jws": "eyJhbGciOiJSUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..kTCYt5
      XsITJX1CxPCT8yAV-TVIw5WEuts01mq-pQy7UJiN5mgREEMGlv50aqzpqh4Qq_PbChOMqs
      LfRoPsnsgxD-WUcX16dUOqV0G_zS245-kronKb78cPktb3rk-BuQy72IFLN25DYuNzVBAh
      4vGHSrQyHUGlcTwLtjPAnKb78"
  }
}
        

위에 사용된 proof 메커니즘에 대해 더 이해하고 싶은 구현자는 섹션과 다음 규격을 읽어보면 더 많은 것을 배울 수 있다: Linked Data Proofs \[\[?LD-PROOFS\]\], Linked Data Cryptographic Suites Registry\[\[?LDP-REGISTRY\]\], JSON Web Signature (JWS) Unencoded Payload Option \[\[RFC7797\]\]. 증명 메커니즘 목록은 검증가능한 크리덴셜 확장 레지스트리 \[\[VC-EXTENSION-REGISTRY\]\]에서 확인할 수 있다.

기본 개념

이 섹션에서는 문서 뒷부분의 섹션을 준비하기 위해 이 규격의 몇 가지 기본 개념을 소개한다.

컨텍스트

두 소프트웨어 시스템이 데이터를 교환해야 할 때, 두 시스템이 모두 이해하는 용어를 사용해야 한다. 비유하자면, 두 사람이 어떻게 의사소통하는지 생각해보자. 두 사람은 동일한 언어를 사용해야 하고 사용하는 단어는 서로에게 동일한 의미를 가져야 한다. 이를 대화의 맥락이라고 부를 수 있다.

검증가능한 크리덴셜검증가능한 프레젠테이션에는 \[\[RFC3986\]\]에 정의된 URI로 식별되는 많은 속성과 값이 있다. 그러나 이러한 URI은 길고 사람이 친숙하지 않을 수 있다. 이런 경우 짧은 형식의 사람에게 친숙한 별칭이 더 도움이 될 수 있다. 이 규격은 @context 속성을 사용하여 이러한 짧은 형식의 별칭을 특정 검증가능한 크리덴셜검증가능한 프레젠테이션에 필요한 URI에 매핑한다.

JSON-LD에서 @context 속성은 데이터 타입 정보, 언어 정보, 변환 규칙 등 이 규격의 요구사항을 넘어서지만 향후 또는 관련 작업에 유용할 수 있는 다른 세부사항을 전달하는 데에도 사용될 수 있다. 자세한 내용은 \[\[JSON-LD\]\] 규격의 Section 3.1: 컨텍스트를 참조하시오.

검증가능한 크리덴셜검증가능한 프레젠테이션은 반드시 @context 속성을 포함해야 한다.

@context
@context 속성의 값은 반드시 정렬된 집합이어야 하며, 첫 번째 항목은 값이 https://www.w3.org/2018/credentials/v1URI이어야 한다. 참고로, 기본 컨텍스트의 사본은 부록 에 제공된다. 배열의 후속 항목은 반드시 컨텍스트 정보를 표현해야 하며 URI 및/또는 객체의 조합으로 구성되어야 한다. @context의 각 URI은 역참조될 경우 @context에 대한 기계 판독 가능한 정보가 포함된 문서를 반환하는 것이 권장된다(RECOMMENDED).

이 규격은 @context 속성이 존재할 것을 요구하지만, @context 속성의 값이 반드시 JSON-LD를 사용하여 처리될 것을 요구하지는 않는다. 이는 검증가능한 크리덴셜이 JWT로 인코딩될 때 사용될 수 있는 일반 JSON 라이브러리와 같은 라이브러리를 사용한 처리를 지원하기 위한 것이다. 모든 라이브러리 또는 프로세서는 @context 속성의 값 순서가 특정 애플리케이션에 예상되는 것과 동일한지 확인해야 한다. JSON-LD를 지원하는 라이브러리 또는 프로세서는 예상대로 전체 JSON-LD 처리를 사용하여 @context 속성을 처리할 수 있다.

{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://www.w3.org/2018/credentials/examples/v1"
  ],
  "id": "http://example.edu/credentials/58473",
  "type": ["VerifiableCredential", "AlumniCredential"],
  "issuer": "https://example.edu/issuers/565049",
  "issuanceDate": "2010-01-01T00:00:00Z",
  "credentialSubject": {
    "id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
    "alumniOf": {
      "id": "did:example:c276e12ec21ebfeb1f712ebc6f1",
      "name": [{
        "value": "Example University",
        "lang": "en"
      }, {
        "value": "Exemple d'Université",
        "lang": "fr"
      }]
    }
  },
  "proof": { ... }
}
        

위의 예시는 대화가 검증가능한 크리덴셜에 관한 것임을 나타내기 위해 기본 컨텍스트 URI(https://www.w3.org/2018/credentials/v1)를 사용한다. 두 번째 URI(https://www.w3.org/2018/credentials/examples/v1)는 대화가 예시에 관한 것임을 나타낸다.

이 문서는 예시를 보여주기 위해 예시 컨텍스트 URI(https://www.w3.org/2018/credentials/examples/v1)를 사용한다. 구현에서는 이 URI를 파일럿 또는 프로덕션 시스템과 같은 다른 목적으로 사용하지 않을 것으로 예상된다.

https://www.w3.org/2018/credentials/v1에서 사용 가능한 데이터는 절대 업데이트되지 않는 정적 문서이며, 다운로드하여 캐시해야 한다(SHOULD). 검증가능한 크리덴셜 데이터 모델과 관련된 사람이 읽을 수 있는 어휘 문서는 https://www.w3.org/2018/credentials/에서 확인할 수 있다. 이 개념은 섹션에서 더 자세히 설명된다.

식별자

사람, 제품 또는 조직과 같은 특정 사물에 대한 진술을 표현할 때, 다른 사람이 동일한 사물에 대한 진술을 표현할 수 있도록 일종의 식별자를 사용하는 것이 종종 유용하다. 이 규격은 그러한 식별자를 위해 선택적인 id 속성을 정의한다. id 속성은 사람, 제품 또는 조직과 같은 객체를 모호하지 않게 참조하기 위한 것이다. id 속성을 사용하면 검증가능한 크리덴셜에서 특정 사물에 대한 진술을 표현할 수 있다.

만약 id 속성이 존재한다면:

개발자는 가명성이 필요한 시나리오에서 식별자가 유해할 수 있음을 기억해야 한다. 개발자는 그러한 시나리오를 고려할 때 섹션을 주의 깊게 읽을 것을 권장한다. 섹션에 문서화된 다른 유형의 상관관계 메커니즘도 프라이버시 문제를 일으킨다. 프라이버시가 중요한 고려사항인 경우 id 속성은 생략될 수 있다.

id
id 속성의 값은 반드시 단일 URI이어야 한다. idURI는 역참조될 경우 id에 대한 기계 판독 가능한 정보가 포함된 문서를 반환하는 것이 좋다(RECOMMENDED).
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://www.w3.org/2018/credentials/examples/v1"
  ],
  "id": "http://example.edu/credentials/3732",
  "type": ["VerifiableCredential", "UniversityDegreeCredential"],
  "issuer": "https://example.edu/issuers/565049",
  "issuanceDate": "2010-01-01T00:00:00Z",
  "credentialSubject": {
    "id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
    "degree": {
      "type": "BachelorDegree",
      "name": "Bachelor of Science and Arts"
    }
  },
  "proof": { ... }
}
        

위의 예시는 두 가지 유형의 식별자를 사용한다. 첫 번째 식별자는 검증가능한 크리덴셜을 위한 것이며 HTTP 기반 URL을 사용한다. 두 번째 식별자는 검증가능한 크리덴셜주체(클레임이 관련된 사물)를 위한 것이며 DID라고도 하는 탈중앙 식별자를 사용한다.

이 출판물 기준으로, DID검증가능한 크리덴셜이 유용하기 위해 필요하지 않은 새로운 유형의 식별자이다. 구체적으로, 검증가능한 크리덴셜DID에 의존하지 않으며 DID검증가능한 크리덴셜에 의존하지 않는다. 그러나 많은 검증가능한 크리덴셜DID를 사용할 것으로 예상되며, 이 규격을 구현하는 소프트웨어 라이브러리는 DID를 해석할 필요가 있을 것이다. DID 기반 URL은 주체, 발급자, 보유자, 크리덴셜 상태 목록, 암호화 키 및 검증가능한 크리덴셜과 관련된 기타 기계 판독 가능한 정보와 관련된 식별자를 표현하는 데 사용된다.

타입

이 문서에 지정된 종류의 객체를 처리하는 소프트웨어 시스템은 제공된 검증가능한 크리덴셜 또는 검증가능한 프레젠테이션이 적합한지 여부를 결정하기 위해 타입 정보를 사용한다. 이 규격은 타입 정보 표현을 위한 type 속성을 정의한다.

검증가능한 크리덴셜검증가능한 프레젠테이션은 반드시 type 속성을 가져야 한다. 즉, type 속성이 없는 크리덴셜 또는 프레젠테이션검증 가능하지 않으므로 검증가능한 크리덴셜검증가능한 프레젠테이션도 아니다.

type
type 속성의 값은 반드시 하나 이상의 URI이거나 (@context 속성의 해석을 통해) 하나 이상의 URI에 매핑되어야 한다. 둘 이상의 URI가 제공되는 경우, URI는 순서가 없는 집합으로 해석되어야 한다. 개발자 사용을 용이하게 하기 위해 구문적 편의성이 사용되어야 한다(SHOULD). 이러한 편의성에는 JSON-LD 용어가 포함될 수 있다. type의 각 URI는 역참조될 경우 type에 대한 기계 판독 가능한 정보가 포함된 문서를 반환하는 것이 좋다(RECOMMENDED).
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://www.w3.org/2018/credentials/examples/v1"
  ],
  "id": "http://example.edu/credentials/3732",
  "type": ["VerifiableCredential", "UniversityDegreeCredential"],
  "issuer": "https://example.edu/issuers/565049",
  "issuanceDate": "2010-01-01T00:00:00Z",
  "credentialSubject": {
    "id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
    "degree": {
      "type": "BachelorDegree",
      "name": "Bachelor of Science and Arts"
    }
  },
  "proof": { ... }
}
        

이 규격과 관련하여, 다음 표는 유형을 지정해야 하는 객체를 나열한다.

객체 유형
검증가능한 크리덴셜 객체
(크리덴셜 객체의 하위 클래스)
VerifiableCredential과 선택적으로 더 구체적인 검증가능한 크리덴셜 유형. 예를 들어,
"type": ["VerifiableCredential", "UniversityDegreeCredential"]
크리덴셜 객체 VerifiableCredential과 선택적으로 더 구체적인 검증가능한 크리덴셜 유형. 예를 들어,
"type": ["VerifiableCredential", "UniversityDegreeCredential"]
검증가능한 프레젠테이션 객체
(프레젠테이션 객체의 하위 클래스)
VerifiablePresentation과 선택적으로 더 구체적인 검증가능한 프레젠테이션 유형. 예를 들어,
"type": ["VerifiablePresentation", "CredentialManagerPresentation"]
프레젠테이션 객체 VerifiablePresentation과 선택적으로 더 구체적인 검증가능한 프레젠테이션 유형. 예를 들어,
"type": ["VerifiablePresentation", "CredentialManagerPresentation"]
증명 객체 유효한 증명 유형. 예를 들어,
"type": "RsaSignature2018"
credentialStatus 객체 유효한 크리덴셜 상태 유형. 예를 들어,
"type": "CredentialStatusList2017"
termsOfUse 객체 유효한 이용 약관 유형. 예를 들어,
"type": "OdrlPolicy2017")
evidence 객체 유효한 증거 유형. 예를 들어,
"type": "DocumentVerification2018"

검증가능한 크리덴셜 데이터 모델의 유형 시스템은 [[JSON-LD]]와 동일하며 5.4절: 유형 지정8절: JSON-LD 문법에 상세히 설명되어 있다. JSON-LD 컨텍스트(섹션 참조)를 사용할 때, 이 규격은 JSON-LD 문서를 더 쉽게 이해할 수 있도록 @type 키워드를 type으로 별칭한다. 애플리케이션 개발자와 문서 작성자는 JSON-LD 유형 시스템의 세부 사항을 이해할 필요는 없지만, 상호운용 가능한 확장성을 지원하려는 이 규격의 구현자는 이해해야 한다.

모든 크리덴셜, 프레젠테이션, 캡슐화된 객체는 소프트웨어 시스템이 이 추가 정보를 처리할 수 있도록 반드시 더 좁은 유형(UniversityDegreeCredential 등)과 연결되거나 지정해야 한다(MUST).

이 규격에 정의된 캡슐화된 객체(credentialSubject 객체와 연관되거나 그 안에 깊이 중첩된 객체)를 처리할 때, 소프트웨어 시스템은 계층의 상위에 있는 캡슐화 객체에 지정된 유형 정보를 사용해야 한다(SHOULD). 구체적으로, 크리덴셜과 같은 캡슐화 객체는 검증자가 캡슐화 객체 유형을 기반으로 연관된 객체의 내용을 신속하게 파악할 수 있도록 연관된 객체 유형을 전달해야 한다(SHOULD).

예를 들어, UniversityDegreeCredentialtype을 가진 크리덴셜 객체는 credentialSubject 속성과 연관된 객체가 다음을 위한 식별자를 포함하고 있음을 검증자에게 알린다:

이를 통해 구현자는 검증 목적으로 type 속성과 관련된 값에 의존할 수 있다. 유형과 그와 관련된 속성에 대한 기대는 최소한 사람이 읽을 수 있는 규격에 문서화되어야 하며, 가급적이면 추가적인 기계 판독 가능한 표현으로 문서화되는 것이 좋다.

이 규격에 설명된 데이터 모델에 사용되는 유형 시스템은 데이터와 유형을 연결하는 여러 가지 방법을 허용한다. 구현자와 작성자는 검증가능한 크리덴셜 구현 지침 [[?VC-IMP-GUIDE]]의 유형 지정 섹션을 읽어보는 것이 좋다.

크리덴셜 주체

검증가능한 크리덴셜은 하나 이상의 주체에 대한 클레임을 포함한다. 이 규격은 하나 이상의 주체에 대한 클레임 표현을 위해 credentialSubject 속성을 정의한다.

검증가능한 크리덴셜은 반드시 credentialSubject 속성을 가져야 한다.

credentialSubject
credentialSubject 속성의 값은 각각 검증가능한 크리덴셜주체와 관련된 하나 이상의 속성을 포함하는 객체 집합으로 정의된다. 각 객체는 섹션에 설명된 대로 id를 포함할 수 있다.
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://www.w3.org/2018/credentials/examples/v1"
  ],
  "id": "http://example.edu/credentials/3732",
  "type": ["VerifiableCredential", "UniversityDegreeCredential"],
  "issuer": "https://example.edu/issuers/565049",
  "issuanceDate": "2010-01-01T00:00:00Z",
  "credentialSubject": {
    "id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
    "degree": {
      "type": "BachelorDegree",
      "name": "Bachelor of Science and Arts"
    }
  },
  "proof": { ... }
}
        

검증가능한 크리덴셜에서 여러 주체와 관련된 정보를 표현할 수 있다. 아래 예는 배우자인 두 주체를 지정한다. `credentialSubject` 속성과 여러 주체를 연결하기 위해 배열 표기법을 사용하는 점에 유의하라.

{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://www.w3.org/2018/credentials/examples/v1"
  ],
  "id": "http://example.edu/credentials/3732",
  "type": ["VerifiableCredential", "RelationshipCredential"],
  "issuer": "https://example.com/issuer/123",
  "issuanceDate": "2010-01-01T00:00:00Z",
  "credentialSubject": [{
    "id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
    "name": "Jayden Doe",
    "spouse": "did:example:c276e12ec21ebfeb1f712ebc6f1"
  }, {
    "id": "did:example:c276e12ec21ebfeb1f712ebc6f1",
    "name": "Morgan Doe",
    "spouse": "did:example:ebfeb1f712ebc6f1c276e12ec21"
  }],
  "proof": { ... }
}
        

발급자

이 규격은 검증가능한 크리덴셜발급자를 표현하기 위한 속성을 정의한다.

검증가능한 크리덴셜은 반드시 issuer 속성을 가져야 한다.

issuer
issuer 속성의 값은 반드시 URI 또는 id 속성을 포함하는 객체여야 한다. issuer 또는 그 idURI는 역참조되는 경우 크리덴셜에 표현된 정보를 검증하는 데 사용할 수 있는 발급자에 대한 기계 판독 가능한 정보를 포함하는 문서로 연결되는 것이 권장된다.
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://www.w3.org/2018/credentials/examples/v1"
  ],
  "id": "http://example.edu/credentials/3732",
  "type": ["VerifiableCredential", "UniversityDegreeCredential"],
  "issuer": "https://example.edu/issuers/14",
  "issuanceDate": "2010-01-01T19:23:24Z",
  "credentialSubject": {
    "id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
    "degree": {
      "type": "BachelorDegree",
      "name": "Bachelor of Science and Arts"
    }
  },
  "proof": { ... }
}
        

발급자에 대한 추가 정보를 발급자 속성과 객체를 연결하여 표현할 수도 있다:

{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://www.w3.org/2018/credentials/examples/v1"
  ],
  "id": "http://example.edu/credentials/3732",
  "type": ["VerifiableCredential", "UniversityDegreeCredential"],
  "issuer": {
    "id": "did:example:76e12ec712ebc6f1c221ebfeb1f",
    "name": "Example University"
  },
  "issuanceDate": "2010-01-01T19:23:24Z",
  "credentialSubject": {
    "id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
    "degree": {
      "type": "BachelorDegree",
      "name": "Bachelor of Science and Arts"
    }
  },
  "proof": { ... }
}
        

issuer 속성의 값은 JWK(예: "https://example.com/keys/foo.jwk") 또는 DID(예: "did:example:abfe13f712120431c276e12ecab")일 수도 있다.

발행일

이 규격은 크리덴셜이 유효해지는 날짜와 시간을 표현하기 위해 issuanceDate 속성을 정의한다.

issuanceDate
크리덴셜은 반드시 issuanceDate 속성을 가져야 한다. issuanceDate 속성의 값은 반드시 크리덴셜이 유효해지는 날짜와 시간을 나타내는 \[XMLSCHEMA11-2\] 결합 date-time 문자열 값이어야 하며, 이는 미래의 날짜와 시간일 수 있다. 이 값은 credentialSubject 속성과 연결된 정보가 유효해지는 가장 이른 시점을 나타낸다는 점에 유의하라.
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://www.w3.org/2018/credentials/examples/v1"
  ],
  "id": "http://example.edu/credentials/3732",
  "type": ["VerifiableCredential", "UniversityDegreeCredential"],
  "issuer": "https://example.edu/issuers/14",
  "issuanceDate": "2010-01-01T19:23:24Z",
  "credentialSubject": {
    "id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
    "degree": {
      "type": "BachelorDegree",
      "name": "Bachelor of Science and Arts"
    }
  },
  "proof": { ... }
}
        

이 규격의 다음 버전에서는 validFrom 속성을 추가하고 issuanceDate 속성 대신 새로운 issued 속성을 사용할 예정이다. 두 속성의 값 범위는 \[XMLSCHEMA11-2\] 결합 date-time 문자열로 유지될 것으로 예상된다. 구현자는 validFromissued 속성이 예약되어 있으며 다른 목적으로 사용하는 것은 권장되지 않는다는 점에 유의해야 한다.

증명(서명)

크리덴셜 또는 프레젠테이션검증가능한 크리덴셜 또는 검증가능한 프레젠테이션이 되려면, 즉 검증 가능하려면 최소 하나의 증명 메커니즘과 해당 증명을 평가하는 데 필요한 세부 정보가 반드시 표현되어야 한다.

이 규격은 외부 증명과 내장 증명이라는 두 가지 클래스의 증명 메커니즘을 식별한다. 외부 증명은 섹션 에서 자세히 설명하는 JSON 웹 토큰과 같이 이 데이터 모델의 표현을 감싸는 것이다. 내장 증명은 섹션 에서 자세히 설명하는 연결된 데이터 서명과 같이 증명이 데이터에 포함되는 메커니즘이다.

증명을 내장할 때는 반드시 proof 속성을 사용해야 한다.

proof
변조를 탐지하고 크리덴셜 또는 프레젠테이션의 작성자를 검증하는 데 사용할 수 있는 하나 이상의 암호학적 증명이다. 내장 증명에 사용되는 특정 방법은 반드시 type 속성을 사용하여 포함되어야 한다.

수학적 증명에 사용되는 방법은 표현 언어와 사용된 기술에 따라 다르기 때문에 proof 속성의 값으로 예상되는 이름-값 쌍의 집합도 그에 따라 달라진다. 예를 들어, 증명 메커니즘에 디지털 서명이 사용되는 경우 proof 속성에는 서명, 서명 엔티티에 대한 참조, 서명 날짜의 표현을 포함하는 이름-값 쌍이 있을 것으로 예상된다. 아래 예는 RSA 디지털 서명을 사용한다.

{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://www.w3.org/2018/credentials/examples/v1"
  ],
  "id": "http://example.gov/credentials/3732",
  "type": ["VerifiableCredential", "UniversityDegreeCredential"],
  "issuer": "https://example.edu",
  "issuanceDate": "2010-01-01T19:23:24Z",
  "credentialSubject": {
    "id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
    "degree": {
      "type": "BachelorDegree",
      "name": "Bachelor of Science and Arts"
    }
  },
  "proof": {
    "type": "RsaSignature2018",
    "created": "2018-06-18T21:19:10Z",
    "proofPurpose": "assertionMethod",
    "verificationMethod": "https://example.com/jdoe/keys/1",
    "jws": "eyJhbGciOiJQUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19
      ..DJBMvvFAIC00nSGB6Tn0XKbbF9XrsaJZREWvR2aONYTQQxnyXirtXnlewJMB
      Bn2h9hfcGZrvnC1b6PgWmukzFJ1IiH1dWgnDIS81BH-IxXnPkbuYDeySorc4
      QU9MJxdVkY5EL4HYbcIfwKj6X4LBQ2_ZHZIu1jdqLcRZqHcsDF5KKylKc1TH
      n5VRWy5WhYg_gBnyWny8E6Qkrze53MR7OuAmmNJ1m1nN8SxDrG6a08L78J0-
      Fbas5OjAQz3c17GY8mVuDPOBIOVjMEghBlgl3nOi1ysxbRGhHLEK4s0KKbeR
      ogZdgt1DkQxDFxxn41QWDw_mmMCjs9qxg0zcZzqEJw"
  }
}
        

섹션 에서 논의한 바와 같이 여러 가지 실행 가능한 증명 메커니즘이 있으며, 이 규격은 검증가능한 크리덴셜과 함께 사용할 단일 증명 메커니즘을 표준화하거나 권장하지 않는다. proof 메커니즘에 대한 자세한 내용은 다음 규격을 참조하라: 연결된 데이터 증명 \[\[?LD-PROOFS\]\], 연결된 데이터 암호학적 스위트 레지스트리 \[\[?LDP-REGISTRY\]\], JSON 웹 서명(JWS) 비인코딩 페이로드 옵션 \[\[RFC7797\]\]. 증명 메커니즘 목록은 검증가능한 크리덴셜 확장 레지스트리 \[\[VC-EXTENSION-REGISTRY\]\]에서 확인할 수 있다.

만료

이 규격은 크리덴셜 만료 정보를 표현하기 위해 expirationDate 속성을 정의한다.

expirationDate
존재하는 경우, expirationDate 속성의 값은 반드시 크리덴셜이 유효하지 않게 되는 날짜와 시간을 나타내는 \[XMLSCHEMA11-2\] date-time의 문자열 값이어야 한다.
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://www.w3.org/2018/credentials/examples/v1"
  ],
  "id": "http://example.edu/credentials/3732",
  "type": ["VerifiableCredential", "UniversityDegreeCredential"],
  "issuer": "https://example.edu/issuers/14",
  "issuanceDate": "2010-01-01T19:23:24Z",
  "expirationDate": "2020-01-01T19:23:24Z",
  "credentialSubject": {
    "id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
    "degree": {
      "type": "BachelorDegree",
      "name": "Bachelor of Science and Arts"
    }
  },
  "proof": { ... }
}
        

이 규격의 다음 버전에서는 expirationDate 속성과 이전 버전과의 호환성을 유지하면서도 더 이상 사용되지 않도록 하는 방식으로 validUntil 속성을 추가할 것으로 예상된다. 구현자는 validUntil 속성이 예약되어 있으며 다른 목적으로 사용하는 것은 권장되지 않는다는 점에 유의해야 한다.

상태

이 규격은 검증가능한 크리덴셜의 현재 상태(예: 일시 중지 또는 취소 여부)에 대한 정보를 발견하기 위해 다음과 같은 credentialStatus 속성을 정의한다.

credentialStatus
존재하는 경우, credentialStatus 속성의 값은 반드시 다음을 포함해야 한다:
  • URI여야 하는 id 속성.
  • 크리덴셜 상태 유형(크리덴셜 상태 메서드라고도 함)을 표현하는 type 속성. 이 값은 크리덴셜의 현재 상태를 결정하기에 충분한 정보를 제공할 것으로 예상된다. 예를 들어, 객체에는 크리덴셜이 일시 중지되었는지 또는 취소되었는지 여부를 나타내는 외부 문서에 대한 링크가 포함될 수 있다.

크리덴셜 상태 정보의 정확한 내용은 특정 credentialStatus 유형 정의에 의해 결정되며, 구현이 간단한지 또는 프라이버시를 향상시키는지 여부와 같은 요소에 따라 달라진다.

{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://www.w3.org/2018/credentials/examples/v1"
  ],
  "id": "http://example.edu/credentials/3732",
  "type": ["VerifiableCredential", "UniversityDegreeCredential"],
  "issuer": "https://example.edu/issuers/14",
  "issuanceDate": "2010-01-01T19:23:24Z",
  "credentialSubject": {
    "id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
    "degree": {
      "type": "BachelorDegree",
      "name": "Bachelor of Science and Arts"
    }
  },
  "credentialStatus": {
    "id": "https://example.edu/status/24",
    "type": "CredentialStatusList2017"
  },
  "proof": { ... }
}
        

상태 체계에 대한 데이터 모델, 형식 및 프로토콜 정의는 이 규격의 범위를 벗어난다. 검증가능한 크리덴셜 상태 확인을 구현하고자 하는 구현자를 위해 사용 가능한 상태 체계를 포함하는 검증가능한 크리덴셜 확장 레지스트리 \[\[?VC-EXTENSION-REGISTRY\]\]가 존재한다.

프레젠테이션

프레젠테이션크리덴셜을 결합하고 제시하는 데 사용될 수 있다. 데이터의 저작권이 검증 가능하도록 패키징될 수 있다. 프레젠테이션의 데이터는 종종 동일한 주체에 관한 것이지만, 데이터에 포함될 수 있는 주체 또는 발급자의 수에는 제한이 없다. 여러 검증가능한 크리덴셜의 정보 집계는 검증가능한 프레젠테이션의 전형적인 사용이다.

검증가능한 프레젠테이션은 일반적으로 다음과 같은 속성으로 구성된다:

id
id 속성은 선택 사항이며 프레젠테이션에 대한 고유 식별자를 제공하는 데 사용될 수 있다. 이 속성 사용과 관련된 자세한 내용은 섹션 를 참조하라.
type
type 속성은 필수이며 VerifiablePresentation과 같은 프레젠테이션의 유형을 표현한다. 이 속성 사용과 관련된 자세한 내용은 섹션 를 참조하라.
verifiableCredential
존재하는 경우, verifiableCredential 속성의 값은 반드시 하나 이상의 검증가능한 크리덴셜이나 암호학적으로 검증 가능한 형식의 검증가능한 크리덴셜에서 파생된 데이터로 구성되어야 한다.
holder
존재하는 경우, holder 속성의 값은 프레젠테이션을 생성하는 엔티티에 대한 URI일 것으로 예상된다.
proof
존재하는 경우, proof 속성의 값은 프레젠테이션검증 가능함을 보장한다. 이 속성 사용과 관련된 자세한 내용은 섹션 를 참조하라.

아래 예는 검증가능한 크리덴셜을 내장하는 검증가능한 프레젠테이션을 보여준다.

{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://www.w3.org/2018/credentials/examples/v1"
  ],
  "id": "urn:uuid:3978344f-8596-4c3a-a978-8fcaba3903c5",
  "type": ["VerifiablePresentation", "CredentialManagerPresentation"],
  "verifiableCredential": [{ ... }],
  "proof": [{ ... }]
}
        

위에 표시된 verifiableCredential 속성의 내용은 이 규격에서 설명하는 대로 검증가능한 크리덴셜이다. proof 속성의 내용은 연결된 데이터 증명 \[\[?LD-PROOFS\]\] 규격에서 설명하는 증명이다. JWT 증명 메커니즘을 사용하는 검증가능한 프레젠테이션의 예는 섹션 에 제시되어 있다.

파생 크리덴셜을 사용하는 프레젠테이션

일부 영지식 암호 체계는 보유자검증가능한 크리덴셜 자체를 공개하지 않고도 검증가능한 크리덴셜에서 클레임을 보유하고 있음을 간접적으로 증명할 수 있게 한다. 이러한 체계에서 검증가능한 크리덴셜클레임검증자발급자를 신뢰하는 경우 값을 신뢰할 수 있도록 암호학적으로 주장되는 방식으로 제시된 값을 파생하는 데 사용될 수 있다.

예를 들어, 클레임 생년월일을 포함하는 검증가능한 크리덴셜은 암호학적으로 검증 가능한 방식으로 제시된 값 15세 이상을 파생하는 데 사용될 수 있다. 즉, 검증자발급자를 신뢰하는 경우 파생된 값을 여전히 신뢰할 수 있다.

직접 내장된 검증가능한 크리덴셜 대신 파생된 데이터를 포함하는 ZKP 스타일의 검증가능한 프레젠테이션 예는 섹션 를 참조하라.

영지식 증명을 사용하는 선택적 공개 체계는 이 모델에 표현된 클레임을 사용하여 해당 클레임에 대한 추가 명제를 증명할 수 있다. 예를 들어, 주체의 생년월일을 지정하는 클레임주체의 실제 생년월일을 공개하지 않고도 주체의 나이가 주어진 범위 내에 있음을 증명하고, 따라서 주체가 연령 관련 할인 자격이 있음을 증명하는 데 述語로 사용될 수 있다. 보유자는 원하는 검증가능한 프레젠테이션에 적용 가능한 모든 방식으로 클레임을 사용할 수 있는 유연성을 가진다.

Pat has a property
            dateOfBirth whose value is 2010-01-01
A basic claim expressing that Pat's date of birth is January 1, 2010. Date encoding would be determined by the schema.

고급 개념

섹션 에서 소개된 개념을 기반으로 이 섹션에서는 검증가능한 크리덴셜에 대한 보다 복잡한 주제를 탐구한다.

라이프사이클 세부 정보

섹션 에서는 검증가능한 크리덴셜 생태계에 대한 개요를 제공했다. 이 섹션에서는 생태계가 어떻게 작동할 것으로 예상되는지에 대해 자세히 설명한다.

발급자에서 보유자로, 선택적으로 한 보유자에서 다른 보유자로 크리덴셜이 흐르는 방식과 보유자에서 검증자로 프레젠테이션이 흐르는 방식을 보여주는 다이어그램. 모든 당사자는 논리적 검증가능한 데이터 레지스트리의 정보를 사용할 수 있음
이 규격의 역할과 정보 흐름.

검증가능한 크리덴셜 생태계의 역할과 정보 흐름은 다음과 같다:

위의 작업 순서는 고정되어 있지 않으며 일부 작업은 둘 이상 수행될 수 있다. 이러한 작업 반복은 즉시 또는 나중에 언제든지 발생할 수 있다.

가장 일반적인 작업 순서는 다음과 같이 예상된다:

  1. 발급자보유자에게 발급한다.
  2. 보유자검증자에게 제시한다.
  3. 검증자검증한다.

이 규격은 검증가능한 크리덴셜 또는 검증가능한 프레젠테이션을 전송하기 위한 어떠한 프로토콜도 정의하지 않지만, 다른 규격에서 엔티티 간에 전송되는 방법을 지정한다고 가정하면 이 검증가능한 크리덴셜 데이터 모델이 직접 적용된다.

이 규격은 또한 권한 부여 프레임워크나 검증자보유자, 검증가능한 크리덴셜발급자, 검증가능한 크리덴셜의 내용 및 자체 정책을 고려하여 검증가능한 크리덴셜 또는 검증가능한 프레젠테이션검증한 후 내릴 수 있는 결정을 정의하지 않는다.

특히, 섹션 검증자가 다음을 결정할 수 있는 방법을 지정한다:

신뢰 모델

검증가능한 크리덴셜의 신뢰 모델은 다음과 같다:

이 신뢰 모델은 다음을 보장함으로써 다른 신뢰 모델과 차별화된다:

신원 제공자신뢰 당사자 간의 신뢰를 분리함으로써 시장 경쟁과 고객 선택이 증가하는 보다 유연하고 역동적인 신뢰 모델이 만들어진다.

이 신뢰 모델이 작업 그룹에서 연구한 다양한 위협 모델과 어떻게 상호작용하는지에 대한 자세한 내용은 검증가능한 크리덴셜 사용 사례 문서 \[\[VC-USE-CASES\]\]를 참조하라.

이 규격에 상세히 설명된 데이터 모델은 기존의 인증 기관 신뢰 모델에서 제공하는 것과 같은 전이적 신뢰 모델을 의미하지 않는다. 검증가능한 크리덴셜 데이터 모델에서 검증자발급자를 직접 신뢰하거나 신뢰하지 않는다. 검증가능한 크리덴셜 데이터 모델을 사용하여 전이적 신뢰 모델을 구축할 수 있지만, 구현자는 인증 기관 시스템에서 채택한 방식으로 신뢰를 광범위하게 위임함으로써 발생하는 보안 취약점에 대해 알아보는 것이 좋다.

확장성

검증가능한 크리덴셜 데이터 모델의 목표 중 하나는 허가 없는 혁신을 가능하게 하는 것이다. 이를 달성하기 위해서는 데이터 모델이 여러 가지 방식으로 확장 가능해야 한다. 데이터 모델은 다음을 수행해야 한다:

이러한 데이터 모델링 접근 방식을 종종 개방형 세계 가정이라고 하며, 이는 모든 엔티티가 다른 모든 엔티티에 대해 어떤 것이라도 말할 수 있음을 의미한다. 이러한 접근 방식이 단순하고 예측 가능한 소프트웨어 시스템 구축과 상충되는 것처럼 보일 수 있지만, 확장성과 프로그램 정확성의 균형을 맞추는 것은 폐쇄형 소프트웨어 시스템보다 개방형 세계 가정에서 항상 더 어렵다.

이 섹션의 나머지 부분에서는 일련의 예를 통해 확장성과 프로그램 정확성을 모두 달성하는 방법을 설명한다.

아래에 표시된 검증가능한 크리덴셜로 시작한다고 가정해 보자.

{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://www.w3.org/2018/credentials/examples/v1"
  ],
  "id": "http://example.com/credentials/4643",
  "type": ["VerifiableCredential"],
  "issuer": "https://example.com/issuers/14",
  "issuanceDate": "2018-02-24T05:28:04Z",
  "credentialSubject": {
    "id": "did:example:abcdef1234567",
    "name": "Jane Doe"
  },
  "proof": { ... }
}
        

검증가능한 크리덴셜did:example:abcdef1234567과 연결된 엔티티가 값이 Jane Doename을 가지고 있음을 명시한다.

이제 개발자가 내부 기업 참조 번호와 Jane이 좋아하는 음식이라는 두 가지 추가 정보를 저장하기 위해 검증가능한 크리덴셜을 확장하려고 한다고 가정해 보자.

먼저 아래와 같이 두 개의 새로운 용어를 포함하는 JSON-LD 컨텍스트를 생성해야 한다.

{
  "@context": {
    "referenceNumber": "https://example.com/vocab#referenceNumber",
    "favoriteFood": "https://example.com/vocab#favoriteFood"
  }
}
        

이 JSON-LD 컨텍스트가 생성된 후, 개발자는 검증가능한 크리덴셜을 처리할 검증자가 액세스할 수 있도록 어딘가에 게시한다. 위의 JSON-LD 컨텍스트가 https://example.com/contexts/mycontext.jsonld에 게시되었다고 가정하면, 컨텍스트를 포함하고 새로운 속성크리덴셜 유형검증가능한 크리덴셜에 추가하여 이 예제를 확장할 수 있다.

{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://example.com/contexts/mycontext.jsonld"
  ],
  "id": "http://example.com/credentials/4643",
  "type": ["VerifiableCredential", "CustomExt12"],
  "issuer": "https://example.com/issuers/14",
  "issuanceDate": "2018-02-24T05:28:04Z",
  "referenceNumber": 83294847,
  "credentialSubject": {
    "id": "did:example:abcdef1234567",
    "name": "Jane Doe",
    "favoriteFood": "Papaya"
  },
  "proof": { ... }
}
        

이 예제는 허가 없이 분산된 방식으로 검증가능한 크리덴셜 데이터 모델을 확장하는 것을 보여준다. 또한 표시된 메커니즘은 이러한 방식으로 생성된 검증가능한 크리덴셜이 네임스페이스 충돌과 의미론적 모호성을 방지하는 메커니즘을 제공하도록 보장한다.

이와 같은 동적 확장성 모델은 구현 부담을 증가시킨다. 이러한 시스템을 위해 작성된 소프트웨어는 애플리케이션의 위험 프로파일에 따라 확장된 검증가능한 크리덴셜이 허용되는지 여부를 결정해야 한다. 일부 애플리케이션은 특정 확장만 수용할 수 있는 반면, 높은 보안 환경에서는 어떤 확장도 수용하지 않을 수 있다. 이러한 결정은 이러한 애플리케이션의 개발자에게 달려 있으며 이 규격의 영역이 특별히 아니다.

개발자는 확장 JSON-LD 컨텍스트를 높은 가용성으로 유지하도록 해야 한다. 컨텍스트를 가져올 수 없는 구현은 오류를 발생시킨다. 확장 JSON-LD 컨텍스트를 항상 사용할 수 있도록 하는 전략으로는 컨텍스트에 콘텐츠 주소가 지정된 URL 사용, 컨텍스트 문서를 구현과 번들링, 또는 컨텍스트의 적극적인 캐싱 활성화 등이 있다.

구현자는 섹션 , , , , , 와 같은 이 규격의 확장점에 세심한 주의를 기울일 것을 권장한다. 이 규격은 이러한 확장점에 대한 구체적인 구현을 정의하지 않지만, 검증가능한 크리덴셜 확장 레지스트리 \[\[?VC-EXTENSION-REGISTRY\]\]는 개발자가 이러한 확장점에서 사용할 수 있는 비공식적이고 선별된 확장 목록을 제공한다.

의미론적 상호운용성

이 규격은 JSON 구현에서 JSON-LD 프로세서를 사용할 필요 없이 "일반" JSON과 JSON-LD 구문이 의미론적으로 호환되도록 보장한다. 이를 달성하기 위해 이 규격은 두 구문 모두에 다음과 같은 추가 요구사항을 부과한다:

  • JSON 기반 프로세서는 반드시 @context 키를 처리하고, 처리 중인 크리덴셜 유형에 대해 예상되는 값이 예상되는 순서로 존재하는지 확인해야 한다. 순서가 중요한 이유는 @context와 연결된 값을 사용하여 정의되는 크리덴셜에 사용되는 키가 "먼저 정의된 것이 이김" 메커니즘을 사용하여 정의되기 때문에 순서를 변경하면 다른 키 정의가 "이길" 수 있기 때문이다.
  • JSON-LD 기반 프로세서는 JSON-LD 컨텍스트가 활성 컨텍스트의 모든 용어를 재정의할 때 오류를 생성해야 한다. 기존 용어의 정의를 변경하는 유일한 방법은 해당 새 용어의 범위 내에서 활성 컨텍스트를 지우는 새 용어를 도입하는 것이다. 이 기능에 관심이 있는 작성자는 JSON-LD 1.1 규격의 @protected 기능에 대해 읽어봐야 한다.

상호운용성을 추구하는 모든 구현자는 @context 속성에 대한 값의 예상 순서를 설명하는 사람이 읽을 수 있는 문서를 게시할 것으로 예상된다. 상호운용성을 추구하는 JSON-LD 구현자는 @context 속성에 지정된 URL에 기계 판독 가능한 설명(즉, 일반 JSON-LD 컨텍스트 문서)을 게시할 것으로 예상된다.

위의 요구사항은 @context 메커니즘으로 정의된 용어에 대해 JSON과 JSON-LD 간의 의미론적 상호운용성을 보장한다. JSON-LD 프로세서는 제공된 특정 메커니즘을 사용하고 모든 용어가 올바르게 지정되었는지 확인할 수 있지만, JSON 기반 프로세서는 용어가 올바른지 테스트하지 않고 동일한 용어 집합을 암시적으로 수용한다. 즉, 데이터 교환이 발생하는 컨텍스트는 동일한 메커니즘을 사용하여 JSON과 JSON-LD 모두에 대해 명시적으로 명시된다. JSON 기반 프로세서와 관련하여, 이는 JSON-LD 처리 라이브러리를 사용할 필요 없이 가벼운 방식으로 달성된다.

데이터 스키마

데이터 스키마는 주어진 데이터 집합에 특정 구조를 강제할 때 유용하다. 이 규격에서 고려하는 데이터 스키마는 최소한 두 가지 유형이 있다:

데이터 스키마가 데이터 구조나 데이터 구문을 강제하지 않고 대체 표현 형식에 대한 임의의 인코딩 정의를 가능하게 하지 않는 @context 속성과는 다른 목적을 제공한다는 점을 이해하는 것이 중요하다.

이 규격은 데이터 스키마 표현을 위해 다음 속성을 정의하며, 이는 발급자가 발급하는 검증가능한 크리덴셜에 포함될 수 있다:

credentialSchema
credentialSchema 속성의 값은 반드시 제공된 데이터가 제공된 스키마를 준수하는지 여부를 결정하기에 충분한 정보를 검증자에게 제공하는 하나 이상의 데이터 스키마여야 한다. 각 credentialSchema는 반드시 그 type(예: JsonSchemaValidator2018)과 스키마 파일을 식별하는 URI여야 하는 id 속성을 지정해야 한다. 각 데이터 스키마의 정확한 내용은 특정 유형 정의에 의해 결정된다.

credentialSchema 속성은 유형 정의에 주석을 달거나 어휘의 특정 버전에 잠글 수 있는 기회를 제공한다. 검증가능한 크리덴셜의 작성자는 일부 콘텐츠 무결성 보호 메커니즘에 잠긴 credentialSchema를 사용하여 어휘의 정적 버전을 포함할 수 있다. credentialSchema 속성은 또한 크리덴셜에 대해 구문 검사를 수행하고 JSON 스키마 \[\[JSON-SCHEMA-2018\]\] 유효성 검사와 같은 검증 메커니즘을 사용할 수 있게 한다.

{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://www.w3.org/2018/credentials/examples/v1"
  ],
  "id": "http://example.edu/credentials/3732",
  "type": ["VerifiableCredential", "UniversityDegreeCredential"],
  "issuer": "https://example.edu/issuers/14",
  "issuanceDate": "2010-01-01T19:23:24Z",
  "credentialSubject": {
    "id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
    "degree": {
      "type": "BachelorDegree",
      "name": "Bachelor of Science and Arts"
    }
  },
  "credentialSchema": {
    "id": "https://example.org/examples/degree.json",
    "type": "JsonSchemaValidator2018"
  },
  "proof": { ... }
}
        

위의 예에서 발급자credentialSchema를 지정하는데, 이는 검증자검증가능한 크리덴셜의 형식이 올바른지 여부를 결정하는 데 사용할 수 있는 \[\[?JSON-SCHEMA-2018\]\] 파일을 가리킨다.

JSON 스키마 \[\[JSON-SCHEMA-2018\]\] 또는 기타 선택적 검증 메커니즘에 대한 연결에 대한 정보는 검증가능한 크리덴셜 구현 지침 \[\[VC-IMP-GUIDE\]\] 문서를 참조하라.

데이터 스키마는 또한 영지식 증명을 수행하는 데 사용되는 것과 같은 다른 이진 형식에 대한 매핑을 지정하는 데 사용될 수 있다. 영지식 증명과 함께 credentialSchema 속성을 사용하는 방법에 대한 자세한 내용은 섹션 를 참조하라.

{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://www.w3.org/2018/credentials/examples/v1"
  ],
  "id": "http://example.edu/credentials/3732",
  "type": ["VerifiableCredential", "UniversityDegreeCredential"],
  "issuer": "https://example.edu/issuers/14",
  "issuanceDate": "2010-01-01T19:23:24Z",
  "credentialSubject": {
    "id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
    "degree": {
      "type": "BachelorDegree",
      "name": "Bachelor of Science and Arts"
    }
  },
  "credentialSchema": {
    "id": "https://example.org/examples/degree.zkp",
    "type": "ZkpExampleSchema2018"
  },
  "proof": { ... }
}
        

위의 예에서 발급자는 입력 데이터를 검증자검증가능한 크리덴셜과 함께 제공된 증명이 유효한지 여부를 결정하는 데 사용할 수 있는 형식으로 변환할 수 있는 영지식 압축 이진 데이터 형식을 가리키는 credentialSchema를 지정한다.

갱신

시스템에서 만료된 검증가능한 크리덴셜의 수동 또는 자동 갱신을 가능하게 하는 것이 유용하다. 만료된 검증가능한 크리덴셜에 대한 자세한 내용은 섹션 을 참조하라. 이 규격은 발급자가 갱신 서비스에 대한 링크를 포함할 수 있도록 하는 refreshService 속성을 정의한다.

발급자검증자 또는 보유자(또는 둘 다)를 위한 것인 경우 검증가능한 크리덴셜 내부에, 보유자만을 위한 것인 경우 검증가능한 프레젠테이션 내부에 갱신 서비스를 요소로 포함할 수 있다. 후자의 경우 이를 통해 보유자검증자와 공유할 검증가능한 프레젠테이션을 생성하기 전에 검증가능한 크리덴셜을 갱신할 수 있다. 전자의 경우 검증가능한 크리덴셜 내부에 갱신 서비스를 포함하면 보유자 또는 검증자가 향후 크리덴셜을 업데이트할 수 있다.

갱신 서비스는 크리덴셜이 만료되었거나 발급자크리덴셜 상태 정보를 게시하지 않는 경우에만 사용될 것으로 예상된다. 발급자는 공개 정보를 포함하지 않거나 갱신 서비스가 어떤 식으로든 보호되지 않는 검증가능한 크리덴셜refreshService 속성을 넣지 않는 것이 좋다.

검증자가 사용할 수 있도록 검증가능한 크리덴셜refreshService 속성을 배치하면 보유자의 제어 및 동의를 제거하고 검증가능한 크리덴셜보유자를 무시하고 검증자에게 직접 발급할 수 있게 한다.

refreshService
refreshService 속성의 값은 반드시 수신자의 소프트웨어에 수신자가 검증가능한 크리덴셜을 갱신할 수 있을 만큼 충분한 정보를 제공하는 하나 이상의 갱신 서비스여야 한다. 각 refreshService 값은 반드시 해당 type(예: ManualRefreshService2018)과 서비스의 URIid를 지정해야 한다. 각 갱신 서비스의 정확한 내용은 특정 refreshService 유형 정의에 의해 결정된다.
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://www.w3.org/2018/credentials/examples/v1"
  ],
  "id": "http://example.edu/credentials/3732",
  "type": ["VerifiableCredential", "UniversityDegreeCredential"],
  "issuer": "https://example.edu/issuers/14",
  "issuanceDate": "2010-01-01T19:23:24Z",
  "credentialSubject": {
    "id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
    "degree": {
      "type": "BachelorDegree",
      "name": "Bachelor of Science and Arts"
    }
  },
  "refreshService": {
    "id": "https://example.edu/refresh/3732"
    "type": "ManualRefreshService2018",
  },
  "proof": { ... }
}
        

위의 예에서 발급자보유자 또는 검증자https://example.edu/refresh/3732로 안내하여 사용할 수 있는 수동 refreshService를 지정한다.

사용 약관

사용 약관은 발급자 또는 보유자검증가능한 크리덴셜 또는 검증가능한 프레젠테이션이 발급된 조건을 전달하는 데 사용될 수 있다. 발급자검증가능한 크리덴셜 내부에 자신의 사용 약관을 배치한다. 보유자검증가능한 프레젠테이션 내부에 자신의 사용 약관을 배치한다. 이 규격은 사용 약관 정보를 표현하기 위한 termsOfUse 속성을 정의한다.

termsOfUse 속성의 값은 검증자검증가능한 크리덴셜 또는 검증가능한 프레젠테이션을 수락하기 위해 수행해야 하는 작업(의무), 수행해서는 안 되는 작업(금지) 또는 수행할 수 있는 작업(허가)을 알려준다.

보유자가 아닌 주체가 자신의 검증가능한 크리덴셜에 사용 약관을 배치하는 방법을 결정하려면 추가 연구가 필요하다. 한 가지 방법은 주체발급자에게 발급된 검증가능한 크리덴셜 내부에 사용 약관을 배치하도록 요청하는 것이다. 다른 방법은 주체검증가능한 크리덴셜보유자에게 위임하고 위임된 검증가능한 크리덴셜에 사용 약관 제한을 배치하는 것이다.

termsOfUse
termsOfUse 속성의 값은 반드시 제작자가 크리덴셜 또는 프레젠테이션을 발급한 하나 이상의 사용 약관 정책을 지정해야 한다. 수신자(보유자 또는 검증자)가 명시된 사용 약관을 준수할 의사가 없는 경우, 자신의 책임하에 그렇게 해야 하며 명시된 사용 약관을 위반하면 법적 책임을 질 수 있다. 각 termsOfUse 값은 반드시 그 유형, 예를 들어 IssuerPolicy를 지정해야 하며 인스턴스 id를 지정할 수 있다. 각 사용 약관의 정확한 내용은 특정 termsOfUse 유형 정의에 의해 결정된다.
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://www.w3.org/2018/credentials/examples/v1"
  ],
  "id": "http://example.edu/credentials/3732",
  "type": ["VerifiableCredential", "UniversityDegreeCredential"],
  "issuer": "https://example.edu/issuers/14",
  "issuanceDate": "2010-01-01T19:23:24Z",
  "credentialSubject": {
    "id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
    "degree": {
      "type": "BachelorDegree",
      "name": "Bachelor of Science and Arts"
    }
  },
  "termsOfUse": [{
    "type": "IssuerPolicy",
    "id": "http://example.com/policies/credential/4",
    "profile": "http://example.com/profiles/credential",
    "prohibition": [{
      "assigner": "https://example.edu/issuers/14",
      "assignee": "AllVerifiers",
      "target": "http://example.edu/credentials/3732",
      "action": ["Archival"]
    }]
  },
  "proof": { ... }
}
        

In the example above, the issuer (the assigner) is prohibiting verifiers (the assignee) from storing the data in an archive.

{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://www.w3.org/2018/credentials/examples/v1",
    {
        "@protected": true,
        "VerifiablePresentationTermsOfUseExtension": {
          "@id": "https://www.w3.org/2018/credentials/examples#VerifiablePresentationExtension",
          "@context": {
            "@protected": true,
            "termsOfUse": {
              "@id": "https://www.w3.org/2018/credentials#termsOfUse",
              "@type": "@id"
            }
          }
        }
    }
  ],
  "id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
  "type": ["VerifiablePresentation", "VerifiablePresentationTermsOfUseExtension"],
  "verifiableCredential": [{
    "@context": [
      "https://www.w3.org/2018/credentials/v1",
      "https://www.w3.org/2018/credentials/examples/v1"
    ],
    "id": "http://example.edu/credentials/3732",
    "type": ["VerifiableCredential", "UniversityDegreeCredential"],
    "issuer": "https://example.edu/issuers/14",
    "issuanceDate": "2010-01-01T19:23:24Z",
    "credentialSubject": {
      "id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
      "degree": {
      "type": "BachelorDegree",
      "name": "Bachelor of Science and Arts"
    }
    },
    "proof": { ... }
  }],
  "termsOfUse": [{
    "type": "HolderPolicy",
    "id": "http://example.com/policies/credential/6",
    "profile": "http://example.com/profiles/credential",
    "prohibition": [{
      "assigner": "did:example:ebfeb1f712ebc6f1c276e12ec21",
      "assignee": "https://wineonline.example.org/",
      "target": "http://example.edu/credentials/3732",
      "action": ["3rdPartyCorrelation"]
    }]
  }],
  "proof": [ ... ]
}
        

경고: termsOfUse 속성은 VerifiablePresentation 범위 컨텍스트 내에서 잘못 정의되었다. 이는 버전 1 컨텍스트의 버그이며 버전 2 컨텍스트에서 수정될 예정이다. 그 동안 이 기능을 사용하고자 하는 구현자는 termsOfUse 속성을 정의하는 추가 용어로 검증가능한 프레젠테이션의 컨텍스트를 확장해야 한다. 그런 다음 이 용어를 검증가능한 프레젠테이션 유형 속성과 함께 사용하여 JSON-LD 프로세서에서 의미적으로 인식될 수 있다.

위의 예시에서, 주체이기도 한 보유자(assigner)는 검증자(assignee, https://wineonline.example.org)가 제공된 정보를 사용하여 제3자 서비스를 통해 보유자 또는 주체를 연관시키는 것을 금지하는 사용 약관을 표현했다. 만약 검증자가 제3자 서비스를 사용하여 연관시킨다면, 그들은 보유자프레젠테이션을 생성한 조건을 위반하게 될 것이다.

이 기능은 또한 정부 발행 검증가능한 크리덴셜에서 민감한 데이터의 예기치 않은 사용으로부터 시민을 보호하기 위해 디지털 지갑에 유사한 정부 기관으로 사용을 제한하도록 지시하는 데 사용될 것으로 예상된다. 유사하게, 민간 산업에서 발행한 일부 검증가능한 크리덴셜은 조직 내 부서 또는 업무 시간 내로 사용을 제한할 것으로 예상된다. 구현자는 검증가능한 크리덴셜 구현 지침 [[?VC-IMP-GUIDE]] 문서의 해당 섹션에서 이 빠르게 진화하는 기능에 대해 자세히 읽어볼 것을 권장한다.

증거

발급자검증가능한 크리덴셜에 추가 지원 정보를 검증자에게 제공하기 위해 증거를 포함할 수 있다. 이는 검증자검증가능한 크리덴셜의 클레임을 신뢰하는 확신을 설정하는 데 사용될 수 있다.

예를 들어, 발급자크리덴셜을 발급하기 전에 주체가 제공한 물리적 문서를 확인하거나 일련의 배경 조사를 수행할 수 있다. 특정 시나리오에서 이 정보는 검증자가 특정 크리덴셜에 의존하는 것과 관련된 위험을 결정할 때 유용하다.

이 규격은 증거 정보를 표현하기 위한 evidence 속성을 정의한다.

evidence
evidence 속성의 값은 반드시 검증자발급자가 수집한 증거가 크리덴셜을 신뢰하기 위한 신뢰 요구사항을 충족하는지 여부를 결정하기에 충분한 정보를 제공하는 하나 이상의 증거 체계여야 한다. 각 증거 체계는 유형으로 식별된다. id 속성은 선택 사항이지만, 존재하는 경우 이 증거 인스턴스에 대한 더 많은 정보를 찾을 수 있는 곳을 가리키는 URL을 포함해야 한다(SHOULD). 각 증거 체계의 정확한 내용은 특정 evidence 유형 정의에 의해 결정된다.

크리덴셜 및 비크리덴셜 데이터에 대한 첨부 파일 및 참조가 규격에 의해 어떻게 지원될 수 있는지에 대한 정보는 검증가능한 크리덴셜 구현 지침 [[VC-IMP-GUIDE]] 문서를 참조하시오.

{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://www.w3.org/2018/credentials/examples/v1"
  ],
  "id": "http://example.edu/credentials/3732",
  "type": ["VerifiableCredential", "UniversityDegreeCredential"],
  "issuer": "https://example.edu/issuers/14",
  "issuanceDate": "2010-01-01T19:23:24Z",
  "credentialSubject": {
    "id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
    "degree": {
      "type": "BachelorDegree",
      "name": "Bachelor of Science and Arts"
    }
  },
  "evidence": [{
    "id": "https://example.edu/evidence/f2aeec97-fc0d-42bf-8ca7-0548192d4231",
    "type": ["DocumentVerification"],
    "verifier": "https://example.edu/issuers/14",
    "evidenceDocument": "DriversLicense",
    "subjectPresence": "Physical",
    "documentPresence": "Physical",
    "licenseNumber": "123AB4567"
  }],
  "proof": { ... }
}
        

evidence 예시에서, 발급자는 명시된 면허 번호를 가진 운전면허증의 실물 사본과 크리덴셜주체를 물리적으로 일치시켰다고 주장하고 있다. 이 운전면허증은 발급 과정에서 "Example University"가 크리덴셜 발급 전에 주체를 어떻게 검증했는지(물리적 검증) 확인하는 데 사용되었다.

evidence 속성proof 속성과는 다르고 상호 보완적인 정보를 제공한다. evidence 속성검증가능한 크리덴셜의 무결성과 관련된 증거 자료와 같은 지원 정보를 표현하는 데 사용된다. 반면에 proof 속성발급자의 진위성 및 검증가능한 크리덴셜의 무결성과 관련된 기계 검증 가능한 수학적 증명을 표현하는 데 사용된다. proof 속성에 대한 자세한 내용은 섹션을 참조하시오.

영지식 증명

영지식 증명은 실제 값을 공개하지 않고 한 엔티티가 다른 엔티티에게 특정 값을 알고 있음을 증명할 수 있는 암호학적 방법이다. 실제 예로는 신원이나 학위에 포함된 기타 개인 식별 정보를 공개하지 않고 공인된 대학에서 학위를 취득했음을 증명하는 것이 있다.

영지식 증명 메커니즘에 의해 도입된 주요 기능은 보유자가 다음을 수행할 수 있다는 점이다:

이 규격은 영지식 증명 메커니즘의 사용과 함께 선택적 공개를 지원하는 데이터 모델을 설명한다. 아래 예시는 데이터 모델을 사용하여 영지식 검증가능한 크리덴셜을 발급, 제시 및 검증하는 방법을 보여준다.

보유자가 영지식 검증가능한 프레젠테이션을 사용하기 위해서는 발급자보유자가 원래 발급된 검증가능한 크리덴셜에서 증명을 유도할 수 있는 방식으로 검증가능한 크리덴셜을 발급해야 한다. 이를 통해 보유자는 프라이버시 보호 방식으로 정보를 검증자에게 제시할 수 있다. 이는 보유자가 서명된 값을 공개하지 않거나 선택된 특정 값만 공개하면서 발급자 서명의 유효성을 증명할 수 있음을 의미한다. 표준 관행은 서명 자체를 공개하지 않고 서명에 대한 지식을 증명하는 것이다. 검증가능한 크리덴셜을 영지식 증명 시스템에서 사용할 때는 두 가지 요구사항이 있다.

다음 예시는 검증가능한 크리덴셜을 영지식으로 사용하는 한 가지 방법을 보여준다. 이는 Camenisch-Lysyanskaya 서명 [[?CL-SIGNATURES]]을 사용하는데, 이를 통해 검증가능한 크리덴셜 값의 선택적 공개를 통해 보유자주체의 프라이버시를 지원하는 방식으로 검증가능한 크리덴셜을 제시할 수 있다. 속성을 선택적으로 공개하기 위해 영지식 증명에 의존하는 다른 일부 암호화 시스템은 [[?LDP-REGISTRY]]에서도 찾을 수 있다.

{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://www.w3.org/2018/credentials/examples/v1"
  ],
  "type": ["VerifiableCredential", "UniversityDegreeCredential"],
  "credentialSchema": {
    "id": "did:example:cdf:35LB7w9ueWbagPL94T9bMLtyXDj9pX5o",
    "type": "did:example:schema:22KpkXgecryx9k7N6XN1QoN3gXwBkSU8SfyyYQG"
  },
  "issuer": "did:example:Wz4eUg7SetGfaUVCn8U9d62oDYrUJLuUtcy619",
  "credentialSubject": {
    "givenName": "Jane",
    "familyName": "Doe",
    "degree": {
      "type": "BachelorDegree",
      "name": "Bachelor of Science and Arts",
      "college": "College of Engineering"
    }
  },
  "proof": {
    "type": "CLSignature2019",
    "issuerData": "5NQ4TgzNfSQxoLzf2d5AV3JNiCdMaTgm...BXiX5UggB381QU7ZCgqWivUmy4D",
    "attributes": "pPYmqDvwwWBDPNykXVrBtKdsJDeZUGFA...tTERiLqsZ5oxCoCSodPQaggkDJy",
    "signature": "8eGWSiTiWtEA8WnBwX4T259STpxpRKuk...kpFnikqqSP3GMW7mVxC4chxFhVs",
    "signatureCorrectnessProof": "SNQbW3u1QV5q89qhxA1xyVqFa6jCrKwv...dsRypyuGGK3RhhBUvH1tPEL8orH"
  }
}
        

위의 예시는 credentialSchema 속성과 Camenisch-Lysyanskaya 영지식 증명 시스템에서 사용 가능한 특정 증명을 사용하여 검증가능한 크리덴셜 정의를 제공한다.

다음 예시는 위의 검증가능한 크리덴셜을 활용하여 프라이버시 보존 증명이 포함된 새로운 파생 검증가능한 크리덴셜을 생성한다. 그런 다음 파생 검증가능한 크리덴셜검증가능한 프레젠테이션에 배치되어 보유자가 의도한 클레임과 추가 크리덴셜 메타데이터만 공개한다. 이를 위해서는 다음 요구사항이 모두 충족되어야 한다:

{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://www.w3.org/2018/credentials/examples/v1"
  ],
  "type": "VerifiablePresentation",
  "verifiableCredential": [
    {
      "@context": [
        "https://www.w3.org/2018/credentials/v1",
        "https://www.w3.org/2018/credentials/examples/v1"
      ],
      "type": ["VerifiableCredential", "UniversityDegreeCredential"],
      "credentialSchema": {
        "id": "did:example:cdf:35LB7w9ueWbagPL94T9bMLtyXDj9pX5o",
        "type": "did:example:schema:22KpkXgecryx9k7N6XN1QoN3gXwBkSU8SfyyYQG"
      },
      "issuer": "did:example:Wz4eUg7SetGfaUVCn8U9d62oDYrUJLuUtcy619",
      "credentialSubject": {
        "degreeType": "BachelorDegree",
        "degreeSchool": "College of Engineering"
      },
      "proof": {
        "type": "AnonCredDerivedCredentialv1",
        "primaryProof": "cg7wLNSi48K5qNyAVMwdYqVHSMv1Ur8i...Fg2ZvWF6zGvcSAsym2sgSk737",
        "nonRevocationProof": "mu6fg24MfJPU1HvSXsf3ybzKARib4WxG...RSce53M6UwQCxYshCuS3d2h"
      }
  }],
  "proof": {
    "type": "AnonCredPresentationProofv1",
    "proofValue": "DgYdYMUYHURJLD7xdnWRinqWCEY5u5fK...j915Lt3hMzLHoPiPQ9sSVfRrs1D"
  }
}
        
Verifiable
            Credential 1 and Verifiable Credential 2 on the left map
            to Derived Credential 1 and Derived Credential 2 inside a
            Presentation on the right.  Verifiable Credential 1
            contains Context, Type, ID, Issuer, Issue Date, Expiration
            Date, CredentialSubject, and Proof, where
            CredentialSubject contains GivenName, FamilyName, and
            Birthdate and Proof contains Signature, Proof of
            Correctness, and Attributes.  Verifiable Credential 2
            contains Context, Type, ID, Issuer, Issue Date, Expiration
            Date, CredentialSubject, and Proof, where
            CredentialSubject contains University, which contains
            Department, which contains DegreeAwarded, and Proof contains Signature, Proof of
            Correctness, and Attributes.  The Presentation diagram on
            the right contains Context, Type, ID,
            VerifiableCredential, and Proof, where
            VerifiableCredential contains Derived Credential 1 and
            Derived Credential 2 and Proof contains Common Link
            Secret.  Derived Credential 1 contains Context, Type, ID,
            Issuer, Issue Date, CredentialSubject, and Proof, where
            CredentialSubject contains AgeOver18 and Proof contains
            Knowledge of Signature.  Derived Credential 2 contains
            Context, Type, ID, Issuer, Issue Date, CredentialSubject,
            and Proof, where CredentialSubject contains Degree and
            Proof contains Knowledge of Signature.  A line links
            Birthdate in Verifiable Credential 1 to AgeOver18 in
            Derived Credential 1.  A line links DegreeAwarded in
            Verifiable Credential 2 to Degree in Derived Credential 2.
A visual example of the relationship between credentials and derived credentials in a ZKP presentation.

크리덴셜 정의 및 증명의 형식과 관련된 중요한 세부 사항은 이 문서의 범위를 벗어나므로 의도적으로 생략되었다. 이 섹션의 목적은 검증가능한 크리덴셜검증가능한 프레젠테이션을 확장하여 영지식 증명 시스템을 지원하려는 구현자를 안내하는 것이다.

분쟁

발급자가 발급한 크리덴셜에 이의를 제기하려는 엔티티의 경우 고려해야 할 두 가지 사례가 있다:

DisputeCredential을 발급하는 메커니즘은 일반 크리덴셜과 동일하지만, DisputeCredential 속성credentialSubject 식별자는 분쟁 중인 크리덴셜의 식별자이다.

예를 들어, 식별자가 https://example.org/credentials/245크리덴셜에 이의가 제기되는 경우, 주체는 아래와 같은 크리덴셜을 발급하고 분쟁 중인 크리덴셜과 함께 검증자에게 제시할 수 있다.

{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://www.w3.org/2018/credentials/examples/v1"
  ],
  "id": "http://example.com/credentials/123",
  "type": ["VerifiableCredential", "DisputeCredential"],
  "credentialSubject": {
    "id": "http://example.com/credentials/245",
    "currentStatus": "Disputed",
    "statusReason": {
      "value": "Address is out of date.",
      "lang": "en"
    },
  },
  "issuer": "https://example.com/people#me",
  "issuanceDate": "2017-12-05T14:27:42Z",
  "proof": { ... }
}
        

위의 검증가능한 크리덴셜에서 발급자는 분쟁 중인 검증가능한 크리덴셜의 주소가 잘못되었다고 주장하고 있다.

크리덴셜에 식별자가 없는 경우, 콘텐츠 기반 식별자를 사용하여 분쟁 중인 크리덴셜을 식별할 수 있다. 마찬가지로, 콘텐츠 기반 식별자를 사용하여 개별 클레임을 고유하게 식별할 수 있다.

이 연구 분야는 빠르게 발전하고 있으며, 다른 크리덴셜의 진실성에 이의를 제기하는 크리덴셜을 게시하는 데 관심이 있는 개발자는 검증가능한 크리덴셜 구현 지침 \[\[VC-IMP-GUIDE\]\] 문서의 분쟁 관련 섹션을 읽어보는 것이 좋다.

권한 부여

검증가능한 크리덴셜주체를 안정적으로 식별하기 위한 수단으로 의도되었다. 역할 기반 접근 제어(RBAC)와 속성 기반 접근 제어(ABAC)가 주체에게 리소스에 대한 접근 권한을 부여하는 수단으로 이러한 식별에 의존한다는 점은 인정되지만, 이 규격은 RBAC 또는 ABAC에 대한 완전한 솔루션을 제공하지 않는다. 권한 부여는 수반되는 권한 부여 프레임워크 없이는 이 규격에 적합한 사용법이 아니다.

작업 그룹은 이 규격 작성 과정에서 권한 부여 사용 사례를 고려했으며, 이 규격 위에 구축된 아키텍처 계층으로 해당 작업을 추진하고 있다.

구문

, , 섹션에 설명된 데이터 모델은 검증가능한 크리덴셜 또는 검증가능한 프레젠테이션의 표준 구조적 표현이다. 모든 직렬화는 특정 형식으로 해당 데이터 모델을 표현한 것이다. 이 섹션에서는 데이터 모델이 JSON-LD와 일반 JSON에서 어떻게 실현되는지 명시한다. 구문적 매핑은 이 두 가지 구문에 대해서만 제공되지만, 애플리케이션과 서비스는 데이터 모델을 표현할 수 있는 다른 데이터 표현 구문(예: XML, YAML 또는 CBOR)을 사용할 수 있다. 검증유효성 검사 요구사항이 데이터 모델 측면에서 정의되므로, 모든 직렬화 구문은 처리, 유효성 검사 또는 비교를 위해 데이터 모델로 결정적으로 변환되어야 한다. 이 규격은 특정 직렬화 형식에 대한 지원을 요구하지 않는다.

이 규격에서 속성 값의 예상 아리티(arity)와 그러한 값을 포함하는 결과 데이터 유형은 속성에 따라 달라질 수 있다. 존재하는 경우, 다음 속성은 단일 값으로 표현된다:

존재하는 경우, 다른 모든 속성은 단일 값 또는 값의 배열로 표현된다.

JSON

섹션에 설명된 데이터 모델은 속성 값을 다음과 같이 JSON 유형에 매핑하여 Javascript Object Notation (JSON) \[\[!RFC8259\]\]로 인코딩할 수 있다:

여기에 나열된 변환에는 잠재적으로 호환되지 않는 해석이 있으므로, 결정적 변환을 제공하려면 JSON 형식에 대한 추가 프로파일링이 필요하다.

JSON-LD

[[!JSON-LD]]는 링크드 데이터를 직렬화하는 데 사용되는 JSON 기반 형식이다. 이 구문은 이미 JSON을 사용하고 있는 배포된 시스템에 쉽게 통합되도록 설계되었으며, JSON에서 [[!JSON-LD]]로 원활한 업그레이드 경로를 제공한다. 이는 주로 웹 기반 프로그래밍 환경에서 링크드 데이터를 사용하고, 상호운용 가능한 웹 서비스를 구축하며, JSON 기반 스토리지 엔진에 링크드 데이터를 저장하는 방법으로 사용하기 위한 것이다.

[[!JSON-LD]]는 이 규격에 설명된 데이터 모델을 확장할 때 유용하다. 데이터 모델의 인스턴스는 @context 속성이 추가된 것을 제외하고는 JSON(섹션 )으로 인코딩되는 방식과 동일한 방식으로 [[!JSON-LD]]로 인코딩된다. JSON-LD 컨텍스트는 [[!JSON-LD]] 규격에 자세히 설명되어 있으며, 그 사용법은 섹션에서 자세히 설명된다.

여러 컨텍스트를 사용하거나 결합하여 관용적인 JSON으로 검증가능한 크리덴셜에 대한 임의의 정보를 표현할 수 있다. https://www.w3.org/2018/credentials/v1에서 사용할 수 있는 JSON-LD 컨텍스트는 절대 업데이트되지 않는 정적 문서이므로 클라이언트 측에서 다운로드하여 캐시할 수 있다. 검증가능한 크리덴셜 데이터 모델과 관련된 어휘 문서는 https://www.w3.org/2018/credentials에서 확인할 수 있다.

구문적 편의성

일반적으로 이 문서에 설명된 데이터 모델과 구문은 개발자가 예제를 복사하여 붙여넣기만 하면 검증가능한 크리덴셜을 소프트웨어 시스템에 통합할 수 있도록 설계되었다. 이러한 접근 방식의 설계 목표는 이기종 소프트웨어 시스템 간의 글로벌 상호운용성을 보장하면서도 진입 장벽을 낮추는 것이다. 이 섹션에서는 대부분의 개발자가 눈치채지 못하겠지만 구현자에게는 관심사가 될 이러한 접근 방식 중 일부에 대해 설명한다. [[!JSON-LD]]에서 제공하는 가장 주목할 만한 구문적 편의성은 다음과 같다:

  • @id@type 키워드는 각각 idtype으로 별칭되어, 개발자가 이 규격을 관용적인 JSON으로 사용할 수 있게 한다.
  • 정수, 날짜, 측정 단위, URL과 같은 데이터 유형은 자동으로 유형화되어 이를 필요로 하는 사용 사례에 더 강력한 유형 보장을 제공한다.
  • verifiableCredentialproof 속성그래프 컨테이너로 취급된다. 즉, 서로 다른 엔티티가 주장하는 데이터 집합을 분리하는 데 사용되는 메커니즘이다. 예를 들어, 이는 각 발급자가 제공한 데이터 그래프와 검증가능한 크리덴셜을 제시하는 보유자가 제공한 데이터 그래프 간의 적절한 암호화 분리를 보장하여 각 그래프의 정보 출처가 보존되도록 한다.
  • [[!JSON-LD]] 1.1의 @protected 속성 기능은 이 규격에서 정의한 용어를 재정의할 수 없도록 하는 데 사용된다. 이는 검증가능한 크리덴셜 또는 검증가능한 프레젠테이션의 맨 위에 동일한 @context 선언이 이루어지는 한, [[!JSON-LD]] 프로세서를 사용하는지 여부에 관계없이 데이터 모델 사용자가 이해하는 모든 용어에 대해 상호운용성이 보장됨을 의미한다.

증명 형식

이 규격에 설명된 데이터 모델은 증명 형식에 구애받지 않도록 설계되었다. 이 규격은 규범적으로 특정 디지털 증명이나 서명 형식을 요구하지 않는다. 데이터 모델은 검증가능한 크리덴셜 또는 검증가능한 프레젠테이션의 표준 표현이지만, 이에 대한 증명 메커니즘은 종종 당사자 간 문서 전송에 사용되는 구문과 연결된다. 따라서 각 증명 메커니즘은 증명의 유효성 검사가 전송된 문서의 상태, 변환된 데이터 모델 또는 다른 형식에 대해 계산되는지 여부를 지정해야 한다. 출판 당시, 구현자가 활발히 사용하고 있는 증명 형식이 최소 두 가지 있었으며, 작업 그룹은 이러한 증명 형식이 무엇이고 어떻게 사용되고 있는지를 문서화하는 것이 구현자에게 도움이 될 것이라고 생각했다. 검증가능한 크리덴셜 발행에 활발히 활용되고 있는 현재의 증명 형식에 대해 자세히 설명하는 섹션은 다음과 같다:

JSON Web Token

JSON Web Token (JWT) [[!RFC7519]]은 두 당사자 간에 전송할 클레임을 표현하는 널리 사용되는 수단이다. JWT에 대한 검증가능한 크리덴셜 데이터 모델의 표현을 제공함으로써 기존 시스템과 라이브러리가 섹션에 설명된 생태계에 참여할 수 있다. JWT는 JSON 객체로 클레임 집합을 인코딩하며, 이는 JSON Web Signature (JWS) [[!RFC7515]] 또는 JWE [[?RFC7516]]에 포함된다. 이 규격에서 JWE의 사용은 범위에서 제외된다.

검증가능한 크리덴셜 데이터 모델과의 관계

이 규격은 검증가능한 크리덴셜 데이터 모델을 JWT와 JWS로 인코딩하는 규칙을 정의한다. 또한 JWT 기반 시스템이 이 규격을 준수할 수 있도록 특정 JWT 등록 클레임 이름과 특정 JWS 등록 헤더 매개변수 이름을 사용하는 시기와 방법에 대한 처리 규칙을 정의한다. 이러한 특정 클레임 이름과 헤더 매개변수가 있는 경우, 중복을 피하기 위해 표준 검증가능한 크리덴셜검증가능한 프레젠테이션에서 각각의 대응 항목을 생략할 수 있다(MAY).

JSON Web Token 확장

이 규격은 두 개의 새로운 등록된 클레임 이름을 도입하는데, 이는 JWT에 대한 명시적인 인코딩 규칙이 존재하지 않는 표준 검증가능한 크리덴셜검증가능한 프레젠테이션의 일부를 포함한다. 이러한 객체는 다음과 같이 JWT 페이로드에 포함된다:

JWT와 JWS 고려사항

JWT 인코딩

검증가능한 크리덴셜을 JWT로 인코딩하려면 이 규격에서 도입한 특정 속성은 반드시 다음 중 하나여야 한다:

  • 표준 JOSE 헤더 매개변수로 인코딩되거나,
  • 등록된 JWT 클레임 이름으로 인코딩되거나,
  • JWS 서명 부분에 포함된다.

명시적인 규칙이 지정되지 않은 경우, 속성은 표준 검증가능한 크리덴셜과 동일한 방식으로 인코딩되며 vc JWT 클레임에 추가된다. 모든 JWT와 마찬가지로, JWT 구문으로 표현된 검증가능한 크리덴셜의 JWS 기반 서명은 디코딩 또는 변환 규칙이 적용되기 전에 전선을 통해 제시된 리터럴 JWT 문자열 값에 대해 계산된다. 다음 단락에서는 이러한 인코딩 규칙에 대해 설명한다.

JWS가 존재하는 경우, 디지털 서명은 검증가능한 크리덴셜발급자를 참조하거나 검증가능한 프레젠테이션의 경우 검증가능한 크리덴셜보유자를 참조한다. JWS는 JWT의 발급자가 포함된 JWT 페이로드에 서명했음을 증명하므로 proof 속성은 생략될 수 있다.

JWS가 존재하지 않는 경우, proof 속성이 반드시 제공되어야 한다. proof 속성은 생성자가 발급자와 다른 경우 또는 작업 증명과 같이 디지털 서명에 기반하지 않는 증명이 필요한 경우와 같이 보다 복잡한 증명을 나타내는 데 사용될 수 있다. 발급자는 JWS와 proof 속성을 모두 포함할 수 있다. 이전 버전과의 호환성을 위해 발급자는 디지털 서명에 기반한 증명을 나타내기 위해 반드시 JWS를 사용해야 한다.

이 규격의 맥락에서 JOSE 헤더에는 다음 규칙이 적용된다:

  • 디지털 서명의 경우 alg를 반드시 설정해야 한다. 선택한 서명 방법에 proof 속성만 필요한 경우(즉, 해당 방법 내에 알고리즘 선택이 없는 경우), alg 헤더는 반드시 none으로 설정되어야 한다.
  • JWT의 발급자와 연관된 키가 여러 개인 경우 kid를 사용할 수 있다(MAY). 키 검색은 이 규격의 범위를 벗어난다. 예를 들어, kidDID 문서의 키를 참조하거나 JWKS 내부의 키 식별자일 수 있다.
  • typ이 있는 경우 반드시 JWT로 설정되어야 한다.

JWT 프로세서와의 이전 버전 호환성을 위해 다음 등록된 JWT 클레임 이름은 각각의 표준 검증가능한 크리덴셜 대응 항목 대신 또는 그에 더하여 반드시 사용되어야 한다:

여기에 지정되지 않은 다른 JOSE 헤더 매개변수와 JWT 클레임 이름은 그 사용이 명시적으로 권장되지 않는 한 사용할 수 있다. 추가 검증가능한 크리덴셜 클레임은 반드시 JWT의 credentialSubject 속성에 추가되어야 한다.

여기에 지정되지 않은 JOSE 헤더 매개변수 및/또는 JWT 클레임 이름 사용에 대한 자세한 내용은 검증가능한 크리덴셜 구현 지침 [[?VC-IMP-GUIDE]] 문서를 참조하시오.

이 버전의 규격은 고급 개념 섹션에 설명된 개념(refreshService, termsOfUse, evidence 등)에 대한 JWT 특정 인코딩 규칙을 정의하지 않는다. 이러한 개념은 변환 없이 그대로 인코딩될 수 있으며 vc JWT 클레임에 추가될 수 있다.

구현자는 JWT가 여러 주체를 인코딩할 수 없으므로 둘 이상의 주체가 있는 검증가능한 크리덴셜을 인코딩할 수 없다는 점에 주의해야 한다. JWT는 향후 여러 주체를 지원할 수 있으며, 구현자는 다중 주체 JWT 클레임 이름에 대해 JSON Web Token Claim Registry를 참조하거나 Nested JSON Web Token 규격을 참조하는 것이 좋다.

JWT 디코딩

JWT를 표준 검증가능한 크리덴셜로 디코딩하려면 다음과 같은 변환이 반드시 수행되어야 한다:

  1. JSON 객체를 생성한다.
  2. vc 클레임의 내용을 새 JSON 객체에 추가한다.
  3. 나머지 JWT 특정 헤더와 클레임을 변환하고, 그 결과를 새 JSON 객체에 추가한다.

JWT 특정 헤더와 클레임을 변환하려면 다음을 반드시 수행해야 한다:

  • exp가 있는 경우, UNIX 타임스탬프는 반드시 [XMLSCHEMA11-2] date-time으로 변환되어야 하며, 새 JSON 객체의 credentialSubjectexpirationDate 속성 값을 설정하는 데 반드시 사용되어야 한다.
  • iss가 있는 경우, 그 값은 반드시 새 검증가능한 크리덴셜 JSON 객체의 issuer 속성 또는 새 검증가능한 프레젠테이션 JSON 객체의 holder 속성을 설정하는 데 사용되어야 한다.
  • nbf가 있는 경우, UNIX 타임스탬프는 반드시 [XMLSCHEMA11-2] date-time으로 변환되어야 하며, 새 JSON 객체의 issuanceDate 속성 값을 설정하는 데 반드시 사용되어야 한다.
  • sub가 있는 경우, 그 값은 반드시 새 JSON 객체의 credentialSubjectid 속성 값을 설정하는 데 사용되어야 한다.
  • jti가 있는 경우, 그 값은 반드시 새 JSON 객체의 id 속성 값을 설정하는 데 사용되어야 한다.
{
    "alg": "RS256",
    "typ": "JWT",
    "kid": "did:example:abfe13f712120431c276e12ecab#keys-1"
}
            

위의 예시에서 검증가능한 크리덴셜JWS 디지털 서명에 기반한 proof를 사용하며, 해당 검증 키는 kid 헤더 매개변수를 사용하여 얻을 수 있다.

{
  "sub": "did:example:ebfeb1f712ebc6f1c276e12ec21",
  "jti": "http://example.edu/credentials/3732",
  "iss": "https://example.com/keys/foo.jwk",
  "nbf": 1541493724,
  "iat": 1541493724,
  "exp": 1573029723,
  "nonce": "660!6345FSer",
  "vc": {
    "@context": [
      "https://www.w3.org/2018/credentials/v1",
      "https://www.w3.org/2018/credentials/examples/v1"
    ],
    "type": ["VerifiableCredential", "UniversityDegreeCredential"],
    "credentialSubject": {
      "degree": {
        "type": "BachelorDegree",
        "name": "Bachelor of Science and Arts"
      }
    }
  }
}
            

위의 예시에서 vc는 JWT 인코딩이 jti 속성을 고유 식별자로 사용하기 때문에 id 속성을 포함하지 않는다. sub 속성은 credentialSubjectid 속성으로 표현되는 정보를 인코딩한다.

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImRpZDpleGFtcGxlOmFiZmUxM2Y3MTIxMjA0
MzFjMjc2ZTEyZWNhYiNrZXlzLTEifQ.eyJzdWIiOiJkaWQ6ZXhhbXBsZTplYmZlYjFmNzEyZWJjNmYxY
zI3NmUxMmVjMjEiLCJqdGkiOiJodHRwOi8vZXhhbXBsZS5lZHUvY3JlZGVudGlhbHMvMzczMiIsImlzc
yI6Imh0dHBzOi8vZXhhbXBsZS5jb20va2V5cy9mb28uandrIiwibmJmIjoxNTQxNDkzNzI0LCJpYXQiO
jE1NDE0OTM3MjQsImV4cCI6MTU3MzAyOTcyMywibm9uY2UiOiI2NjAhNjM0NUZTZXIiLCJ2YyI6eyJAY
29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vd
3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL2V4YW1wbGVzL3YxIl0sInR5cGUiOlsiVmVyaWZpYWJsZ
UNyZWRlbnRpYWwiLCJVbml2ZXJzaXR5RGVncmVlQ3JlZGVudGlhbCJdLCJjcmVkZW50aWFsU3ViamVjd
CI6eyJkZWdyZWUiOnsidHlwZSI6IkJhY2hlbG9yRGVncmVlIiwibmFtZSI6IjxzcGFuIGxhbmc9J2ZyL
UNBJz5CYWNjYWxhdXLDqWF0IGVuIG11c2lxdWVzIG51bcOpcmlxdWVzPC9zcGFuPiJ9fX19.KLJo5GAy
BND3LDTn9H7FQokEsUEi8jKwXhGvoN3JtRa51xrNDgXDb0cq1UTYB-rK4Ft9YVmR1NI_ZOF8oGc_7wAp
8PHbF2HaWodQIoOBxxT-4WNqAxft7ET6lkH-4S6Ux3rSGAmczMohEEf8eCeN-jC8WekdPl6zKZQj0YPB
1rx6X0-xlFBs7cl6Wt8rfBP_tZ9YgVWrQmUWypSioc0MUyiphmyEbLZagTyPlUyflGlEdqrZAv6eSe6R
txJy6M1-lD7a5HTzanYTWBPAUHDZGyGKXdJw-W_x0IWChBzI8t3kpG253fg6V3tPgHeKXE94fz_QpYfg
--7kLsyBAfQGbg
            
{
  "alg": "RS256",
  "typ": "JWT",
  "kid": "did:example:ebfeb1f712ebc6f1c276e12ec21#keys-1"
}
            

위의 예시에서 검증가능한 프레젠테이션JWS 디지털 서명에 기반한 proof를 사용하며, 해당 검증 키는 kid 헤더 매개변수를 사용하여 얻을 수 있다.

{
  "iss": "did:example:ebfeb1f712ebc6f1c276e12ec21",
  "jti": "urn:uuid:3978344f-8596-4c3a-a978-8fcaba3903c5",
  "aud": "did:example:4a57546973436f6f6c4a4a57573",
  "nbf": 1541493724,
  "iat": 1541493724,
  "exp": 1573029723,
  "nonce": "343s$FSFDa-",
  "vp": {
    "@context": [
      "https://www.w3.org/2018/credentials/v1",
      "https://www.w3.org/2018/credentials/examples/v1"
    ],
    "type": ["VerifiablePresentation"],
    // base64url-encoded JWT as string
    "verifiableCredential": ["..."]
  }
}
            

위의 예시에서 vp는 JWT 인코딩이 jti 속성을 고유 식별자로 사용하기 때문에 id 속성을 포함하지 않는다. verifiableCredential은 JWT 컴팩트 직렬화를 사용하는 검증가능한 크리덴셜의 문자열 배열을 포함한다.


eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImRpZDpleGFtcGxlOjB4YWJjI2tleTEifQ.e
yJpc3MiOiJkaWQ6ZXhhbXBsZTplYmZlYjFmNzEyZWJjNmYxYzI3NmUxMmVjMjEiLCJqdGkiOiJ1cm46d
XVpZDozOTc4MzQ0Zi04NTk2LTRjM2EtYTk3OC04ZmNhYmEzOTAzYzUiLCJhdWQiOiJkaWQ6ZXhhbXBsZ
To0YTU3NTQ2OTczNDM2ZjZmNmM0YTRhNTc1NzMiLCJuYmYiOjE1NDE0OTM3MjQsImlhdCI6MTU0MTQ5M
zcyNCwiZXhwIjoxNTczMDI5NzIzLCJub25jZSI6IjM0M3MkRlNGRGEtIiwidnAiOnsiQGNvbnRleHQiO
lsiaHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMvdjEiLCJodHRwczovL3d3dy53My5vc
mcvMjAxOC9jcmVkZW50aWFscy9leGFtcGxlcy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVQcmVzZW50Y
XRpb24iLCJDcmVkZW50aWFsTWFuYWdlclByZXNlbnRhdGlvbiJdLCJ2ZXJpZmlhYmxlQ3JlZGVudGlhb
CI6WyJleUpoYkdjaU9pSlNVekkxTmlJc0luUjVjQ0k2SWtwWFZDSXNJbXRwWkNJNkltUnBaRHBsZUdGd
GNHeGxPbUZpWm1VeE0yWTNNVEl4TWpBME16RmpNamMyWlRFeVpXTmhZaU5yWlhsekxURWlmUS5leUp6Z
FdJaU9pSmthV1E2WlhoaGJYQnNaVHBsWW1abFlqRm1OekV5WldKak5tWXhZekkzTm1VeE1tVmpNakVpT
ENKcWRHa2lPaUpvZEhSd09pOHZaWGhoYlhCc1pTNWxaSFV2WTNKbFpHVnVkR2xoYkhNdk16Y3pNaUlzS
W1semN5STZJbWgwZEhCek9pOHZaWGhoYlhCc1pTNWpiMjB2YTJWNWN5OW1iMjh1YW5kcklpd2libUptS
WpveE5UUXhORGt6TnpJMExDSnBZWFFpT2pFMU5ERTBPVE0zTWpRc0ltVjRjQ0k2TVRVM016QXlPVGN5T
Xl3aWJtOXVZMlVpT2lJMk5qQWhOak0wTlVaVFpYSWlMQ0oyWXlJNmV5SkFZMjl1ZEdWNGRDSTZXeUpvZ
EhSd2N6b3ZMM2QzZHk1M015NXZjbWN2TWpBeE9DOWpjbVZrWlc1MGFXRnNjeTkyTVNJc0ltaDBkSEJ6T
2k4dmQzZDNMbmN6TG05eVp5OHlNREU0TDJOeVpXUmxiblJwWVd4ekwyVjRZVzF3YkdWekwzWXhJbDBzS
W5SNWNHVWlPbHNpVm1WeWFXWnBZV0pzWlVOeVpXUmxiblJwWVd3aUxDSlZibWwyWlhKemFYUjVSR1ZuY
21WbFEzSmxaR1Z1ZEdsaGJDSmRMQ0pqY21Wa1pXNTBhV0ZzVTNWaWFtVmpkQ0k2ZXlKa1pXZHlaV1VpT
25zaWRIbHdaU0k2SWtKaFkyaGxiRzl5UkdWbmNtVmxJaXdpYm1GdFpTSTZJanh6Y0dGdUlHeGhibWM5S
jJaeUxVTkJKejVDWVdOallXeGhkWExEcVdGMElHVnVJRzExYzJseGRXVnpJRzUxYmNPcGNtbHhkV1Z6U
EM5emNHRnVQaUo5ZlgxOS5LTEpvNUdBeUJORDNMRFRuOUg3RlFva0VzVUVpOGpLd1hoR3ZvTjNKdFJhN
TF4ck5EZ1hEYjBjcTFVVFlCLXJLNEZ0OVlWbVIxTklfWk9GOG9HY183d0FwOFBIYkYySGFXb2RRSW9PQ
nh4VC00V05xQXhmdDdFVDZsa0gtNFM2VXgzclNHQW1jek1vaEVFZjhlQ2VOLWpDOFdla2RQbDZ6S1pRa
jBZUEIxcng2WDAteGxGQnM3Y2w2V3Q4cmZCUF90WjlZZ1ZXclFtVVd5cFNpb2MwTVV5aXBobXlFYkxaY
WdUeVBsVXlmbEdsRWRxclpBdjZlU2U2UnR4Snk2TTEtbEQ3YTVIVHphbllUV0JQQVVIRFpHeUdLWGRKd
y1XX3gwSVdDaEJ6STh0M2twRzI1M2ZnNlYzdFBnSGVLWEU5NGZ6X1FwWWZnLS03a0xzeUJBZlFHYmciX
X19.ft_Eq4IniBrr7gtzRfrYj8Vy1aPXuFZU-6_ai0wvaKcsrzI4JkQEKTvbJwdvIeuGuTqy7ipO-EYi
7V4TvonPuTRdpB7ZHOlYlbZ4wA9WJ6mSVSqDACvYRiFvrOFmie8rgm6GacWatgO4m4NqiFKFko3r58Lu
eFfGw47NK9RcfOkVQeHCq4btaDqksDKeoTrNysF4YS89INa-prWomrLRAhnwLOo1Etp3E4ESAxg73CR2
kA5AoMbf5KtFueWnMcSbQkMRdWcGC1VssC0tB0JffVjq7ZV6OTyV4kl1-UVgiPLXUTpupFfLRhf9QpqM
BjYgP62KvhIvW8BbkGUelYMetA
            

연결된 데이터 증명

이 규격은 연결된 데이터를 활용하여 URL 및 JSON-LD와 같은 표준을 사용하여 주체 및 관련 속성을 식별하여 웹에 정보를 게시한다. 이러한 방식으로 정보를 제시할 때, 다른 관련 정보를 쉽게 발견할 수 있고 새로운 정보를 기존 지식 그래프에 쉽게 병합할 수 있다. 연결된 데이터는 분산된 방식으로 확장 가능하므로 대규모 통합에 대한 장벽을 크게 줄일 수 있다. 이 규격의 데이터 모델은 이 규격에 의해 설명된 데이터 모델을 보호하도록 설계된 연결된 데이터 증명과 관련 연결된 데이터 암호화 제품군과 잘 작동한다.

JSON Web Token 사용과 달리 추가적인 사전 또는 사후 처리가 필요하지 않다. 연결된 데이터 증명 형식은 검증가능한 크리덴셜검증가능한 프레젠테이션을 간단하고 쉽게 보호하도록 설계되었다. 검증가능한 크리덴셜 또는 검증가능한 프레젠테이션을 보호하는 것은 이 규격의 유효한 예시를 연결된 데이터 서명 구현에 전달하고 디지털 서명을 생성하는 것만큼 간단하다.

다양한 구문 형식(예: JSON+JWT, JSON-LD+JWT 또는 JSON-LD+LD-Proofs)의 서로 다른 품질에 대한 자세한 내용은 검증가능한 크리덴셜 구현 지침 \[\[VC-IMP-GUIDE\]\] 문서를 참조하시오.

개인정보 보호 고려사항

이 섹션에서는 검증가능한 크리덴셜 데이터 모델을 프로덕션 환경에 배포할 때의 일반적인 프라이버시 고려사항과 구체적인 프라이버시 영향에 대해 자세히 설명한다.

프라이버시 스펙트럼

가명에서 강력하게 식별된 상태에 이르기까지 프라이버시 스펙트럼이 있다는 점을 인식하는 것이 중요하다. 사용 사례에 따라, 사람들은 자신이 기꺼이 제공하고자 하는 정보와 제공된 정보에서 파생될 수 있는 정보에 대해 서로 다른 편안함을 느낀다.

왼쪽에 빨간색, 중간에 주황색, 오른쪽에 녹색이 있는 수평 막대. 빨간색에는 '높은 상관관계(글로벌 ID), 예: 정부 ID, 배송 주소, 신용카드 번호'라는 텍스트가 있다. 주황색에는 '공모를 통한 상관관계(개인 식별 정보), 예: 이름, 생일, 우편번호'라는 텍스트가 있다. 녹색에는 '상관관계 없음(가명), 예: 21세 이상'이라는 텍스트가 있다.
가명에서 완전히 식별된 상태에 이르는 프라이버시 스펙트럼.

예를 들어, 대부분의 사람들은 알코올을 구매할 때 익명으로 남기를 원할 것이다. 왜냐하면 요구되는 규제 검사는 오로지 특정 연령 이상인지 여부에 기반하기 때문이다. 반대로, 의사가 환자에게 쓴 의료 처방전의 경우, 처방전을 이행하는 약국은 의료 전문가와 환자를 보다 강력하게 식별해야 한다. 따라서 모든 사용 사례에 적용되는 프라이버시에 대한 단일 접근 방식은 없다. 프라이버시 솔루션은 사용 사례에 따라 다르다.

알코올 구매 시 익명으로 남고 싶어하는 사람들의 경우에도, 상인에게 적절한 보증을 제공하기 위해 사진이 부착된 신분증이 여전히 필요할 수 있다. 상인은 (특정 연령 이상이라는 것 외에) 이름이나 기타 세부 정보를 알 필요가 없을 수 있지만, 많은 경우 단순한 연령 증명만으로는 규정을 충족하기에 여전히 불충분할 수 있다.

검증가능한 크리덴셜 데이터 모델은 전체 프라이버시 스펙트럼을 지원하기 위해 노력하며, 특정 거래에 대한 올바른 익명성 수준에 대한 철학적 입장을 취하지 않는다. 다음 섹션에서는 프라이버시에 적대적인 특정 시나리오를 피하려는 구현자를 위한 지침을 제공한다.

개인 식별 정보

credential.credentialSubject 필드에 저장된 검증가능한 크리덴셜과 관련된 데이터는 검증자와 공유될 때 프라이버시 침해에 취약하다. 정부 발행 식별자, 배송 주소, 성명과 같은 개인 식별 데이터는 엔티티를 쉽게 식별, 추적 및 연관시키는 데 사용될 수 있다. 생년월일과 우편번호의 조합과 같이 개인 식별이 불가능해 보이는 정보조차도 매우 강력한 상관관계와 익명성 제거 능력을 가지고 있다.

구현자는 이러한 특성을 가진 데이터를 공유할 때 보유자에게 경고하는 것이 강력히 권고된다. 발급자는 가능한 경우 프라이버시를 보호하는 검증가능한 크리덴셜을 제공하는 것이 강력히 권고된다. 예를 들어, 검증자엔티티의 나이가 18세 이상인지 여부를 확인하고자 할 때 생년월일 검증가능한 크리덴셜 대신 ageOver 검증가능한 크리덴셜을 발급하는 것이다.

검증가능한 크리덴셜에는 종종 개인 식별 정보(PII)가 포함되어 있으므로, 구현자는 검증가능한 크리덴셜을 저장하고 전송하는 동안 액세스해서는 안 되는 사람들로부터 데이터를 보호하는 메커니즘을 사용하는 것이 강력히 권고된다. 고려될 수 있는 메커니즘에는 전송 계층 보안(TLS) 또는 전송 중 데이터를 암호화하는 다른 수단, 그리고 검증가능한 크리덴셜의 데이터를 보호하기 위한 암호화 또는 데이터 액세스 제어 메커니즘 등이 있다.

식별자 기반 연관

검증가능한 크리덴셜주체credential.credentialSubject.id 필드를 사용하여 식별된다. 주체를 식별하는 데 사용되는 식별자는 식별자가 장기간 사용되거나 둘 이상의 웹 도메인에서 사용될 때 더 큰 연관 위험을 초래한다.

마찬가지로, 크리덴셜 식별자(credential.id)를 공개하면 여러 검증자 또는 발급자검증자가 공모하여 보유자를 연관시킬 수 있는 상황으로 이어진다. 보유자가 연관성을 줄이고 싶다면, 검증가능한 프레젠테이션 중에 식별자를 숨길 수 있는 검증가능한 크리덴셜 체계를 사용해야 한다. 이러한 체계는 보유자가 식별자를 생성하고 심지어 식별자를 검증가능한 크리덴셜에 포함되고 서명된 상태로 유지하면서도 발급자로부터 식별자를 숨길 수 있도록 한다.

검증가능한 크리덴셜 시스템에서 강력한 반연관 속성이 요구사항인 경우, 식별자가 다음 중 하나여야 한다:

서명 기반 연관

검증가능한 크리덴셜의 내용은 credential.proof 필드를 사용하여 보호된다. 이 필드의 속성은 동일한 값이 둘 이상의 세션 또는 도메인에서 사용되고 값이 변경되지 않을 때 더 큰 연관 위험을 초래한다. 예로는 verificationMethod, created, proofPurpose, jws 필드가 있다.

강력한 반연관 속성이 요구되는 경우, 서명 값과 메타데이터를 제3자 쌍별 서명, 영지식 증명 또는 그룹 서명과 같은 기술을 사용하여 매번 재생성하는 것이 좋다.

반연관 서명을 사용하더라도 사용된 암호화의 반연관 속성을 무력화하는 정보가 여전히 검증가능한 크리덴셜에 포함될 수 있다.

장기 식별자 기반 연관

검증가능한 크리덴셜에는 개인을 연관시키는 데 사용될 수 있는 장기 식별자가 포함될 수 있다. 이러한 유형의 식별자에는 주체 식별자, 이메일 주소, 정부 발행 식별자, 조직 발행 식별자, 주소, 의료 필수 정보, 검증가능한 크리덴셜 전용 JSON-LD 컨텍스트 및 기타 많은 종류의 장기 식별자가 포함된다.

보유자에게 소프트웨어를 제공하는 조직은 개인을 연관시키는 데 사용될 수 있는 정보가 포함된 검증가능한 크리덴셜의 필드를 식별하고, 이 정보가 공유될 때 보유자에게 경고하기 위해 노력해야 한다.

기기 핑거프린팅

인터넷과 웹에서 개인을 추적하고 연관시키는 데 사용되는 검증가능한 크리덴셜 외부의 메커니즘이 있다. 이러한 메커니즘에는 인터넷 프로토콜(IP) 주소 추적, 웹 브라우저 핑거프린팅, 에버쿠키, 광고 네트워크 추적기, 모바일 네트워크 위치 정보, 애플리케이션 내 GPS(Global Positioning System) API 등이 있다. 검증가능한 크리덴셜을 사용한다고 해서 이러한 다른 추적 기술의 사용을 막을 수는 없다. 또한 이러한 기술이 검증가능한 크리덴셜과 함께 사용될 때 새로운 연관 가능한 정보가 발견될 수 있다. 예를 들어, 생일과 GPS 위치를 결합하면 여러 웹사이트에서 개인을 강력하게 연관시키는 데 사용될 수 있다.

프라이버시를 존중하는 시스템은 검증가능한 크리덴셜이 사용될 때 이러한 다른 추적 기술의 사용을 방지하는 것이 좋다. 경우에 따라 보유자를 대신하여 검증가능한 크리덴셜을 전송하는 장치에서 추적 기술을 비활성화해야 할 수도 있다.

추상적인 클레임 선호

검증가능한 크리덴셜의 수신자가 거래에 필요한 것보다 더 많은 PII를 공개하지 않고 다양한 상황에서 사용할 수 있도록 하기 위해, 발급자크리덴셜에 게시된 정보를 예상되는 목적에 필요한 최소한의 집합으로 제한하는 것을 고려해야 한다. 크리덴셜에 PII를 넣지 않는 한 가지 방법은 주체에 대한 구체적인 정보를 제공하지 않고 검증자의 요구사항을 충족하는 추상적인 속성을 사용하는 것이다.

예를 들어, 이 문서는 훨씬 더 강력한 PII인 특정 생년월일 대신 ageOver 속성을 사용한다. 특정 시장의 소매업체가 일반적으로 구매자의 연령이 특정 연령 이상일 것을 요구하는 경우, 해당 시장에서 신뢰받는 발급자는 특정 생년월일에 대한 클레임이 포함된 검증가능한 크리덴셜을 제공하는 대신 주체가 해당 요구사항을 충족했다고 주장하는 검증가능한 크리덴셜을 제공하는 것을 선택할 수 있다. 이를 통해 개별 고객은 특정 PII를 공개하지 않고 구매할 수 있다.

데이터 최소화 원칙

한 맥락에서 공개된 정보가 다른 맥락으로 유출될 때 프라이버시 침해가 발생한다. 이러한 위반을 방지하기 위한 인정된 모범 사례는 요청하고 수신하는 정보를 절대적으로 필요한 최소한으로 제한하는 것이다. 이 데이터 최소화 접근 방식은 미국의 건강 보험 이동성 및 책임법(HIPAA)과 유럽 연합의 일반 데이터 보호 규정(GDPR)을 포함한 여러 관할 구역의 규정에서 요구된다.

검증가능한 크리덴셜에서 발급자에 대한 데이터 최소화는 검증가능한 크리덴셜의 내용을 예상되는 사용을 위해 잠재적 검증자에게 필요한 최소한으로 제한하는 것을 의미한다. 검증자의 경우 데이터 최소화는 서비스 액세스에 요청되거나 필요한 정보의 범위를 제한하는 것을 의미한다.

예를 들어, 운전자 ID 번호, 키, 체중, 생일, 집 주소를 포함하는 운전면허증은 해당 사람이 특정 연령 이상임을 확인하는 데 필요한 것보다 더 많은 정보를 포함하는 크리덴셜이다.

발급자가 정보를 원자화하거나 선택적 공개를 허용하는 서명 체계를 사용하는 것이 모범 사례로 간주된다. 예를 들어, 운전면허증의 발급자는 운전면허증에 나타나는 모든 속성을 포함하는 검증가능한 크리덴셜과 함께 각 검증가능한 크리덴셜이 생일과 같은 단일 속성만 포함하는 검증가능한 크리덴셜 집합을 발급할 수 있다. 또한 ageOver 속성만 포함하는 검증가능한 크리덴셜과 같이 보다 추상적인 검증가능한 크리덴셜을 발급할 수도 있다. 한 가지 가능한 적응 방식은 발급자검증가능한 크리덴셜의 가명 사용을 촉진하는 일회용 bearer 크리덴셜을 검색하기 위한 보안 HTTP 엔드포인트를 제공하는 것이다. 이를 비실용적이거나 안전하지 않다고 생각하는 구현자는 증명 시점에서 발급자에 대한 의존성을 제거하고 발급자로부터의 시간적 상관관계 위험을 줄이는 선택적 공개 체계를 사용하는 것을 고려해야 한다.

검증자는 특정 트랜잭션 발생에 절대적으로 필요한 정보만 요청하는 것이 좋다. 이것은 최소한 두 가지 이유로 중요하다:

최소 공개 원칙을 실천하는 것이 가능하지만, 단일 세션 또는 여러 세션에 걸쳐 특정 사용 사례에 대해 개인을 강력하게 식별하는 것을 피하는 것은 불가능할 수 있다. 이 문서의 저자들은 실제 시나리오에서 이 원칙을 충족하는 것이 얼마나 어려운지 강조할 수 없다.

Bearer 크리덴셜

bearer 크리덴셜은 콘서트 티켓과 같이 bearer 크리덴셜의 보유자에게 보유자에 대한 민감한 정보를 공개하지 않고 특정 리소스에 대한 자격을 부여하는 프라이버시 강화 정보이다. bearer 크리덴셜은 종종 bearer 크리덴셜의 공유가 우려되지 않거나 큰 경제적 또는 명성 손실로 이어지지 않는 저위험 사용 사례에 사용된다.

bearer 크리덴셜검증가능한 크리덴셜credentialSubject 속성에 중첩된 id 속성을 사용하여 표현되는 주체 식별자를 지정하지 않음으로써 가능해진다. 예를 들어, 다음 검증가능한 크리덴셜bearer 크리덴셜이다:

{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://www.w3.org/2018/credentials/examples/v1"
  ],
  "id": "http://example.edu/credentials/temporary/28934792387492384",
  "type": ["VerifiableCredential", "UniversityDegreeCredential"],
  "issuer": "https://example.edu/issuers/14",
  "issuanceDate": "2017-10-22T12:23:48Z",
  "credentialSubject": {
    // note that the 'id' property is not specified for bearer credentials
    "degree": {
      "type": "BachelorDegree",
      "name": "Bachelor of Science and Arts"
    }
  },
  "proof": { ... }
}
      

bearer 크리덴셜은 프라이버시를 강화할 수 있지만, bearer 크리덴셜보유자가 예상하는 것보다 더 많은 정보를 실수로 누설하지 않도록 신중하게 작성되어야 한다. 예를 들어, 동일한 bearer 크리덴셜을 여러 사이트에서 반복적으로 사용하면 이러한 사이트가 잠재적으로 공모하여 보유자를 부당하게 추적하거나 연관시킬 수 있다. 마찬가지로 생년월일 및 우편번호와 같은 정보는 식별되지 않는 것처럼 보일 수 있지만, 동일한 bearer 크리덴셜 또는 세션에서 함께 사용될 때 통계적으로 개인을 식별하는 데 사용될 수 있다.

bearer 크리덴셜발급자bearer 크리덴셜이 다음과 같은 프라이버시 강화 이점을 제공하도록 해야 한다:

민감한 정보가 포함된 bearer 크리덴셜이 발급되거나 요청되는 경우 또는 하나 이상의 세션에서 둘 이상의 bearer 크리덴셜을 결합할 때 상관관계 위험이 있는 경우 보유자에게 소프트웨어에 의해 경고되어야 한다. 모든 상관관계 위험을 탐지하는 것은 불가능할 수 있지만, 일부는 분명히 탐지 가능할 수 있다.

검증자보유자를 부당하게 연관시키는 데 사용될 수 있는 bearer 크리덴셜을 요청해서는 안 된다.

유효성 검사

검증가능한 크리덴셜을 처리할 때 검증자는 부록 에 나열된 많은 검사와 다양한 특정 비즈니스 프로세스 검사를 수행할 것으로 예상된다. 유효성 검사에는 다음 사항을 확인하는 것이 포함될 수 있다:

이러한 검사를 수행하는 과정에서 보유자의 프라이버시 침해로 이어지는 정보 유출이 발생할 수 있다. 예를 들어, 폐기 목록을 확인하는 것과 같은 간단한 작업으로 인해 특정 비즈니스가 보유자와 상호 작용할 가능성이 있음을 발급자에게 알릴 수 있다. 이를 통해 발급자가 공모하여 개인의 알지 못한 채로 연관시킬 수 있다.

발급자검증 프로세스 동안 프라이버시 위반으로 이어질 수 있는 크리덴셜당 고유한 크리덴셜 폐기 목록과 같은 메커니즘을 사용하지 않도록 해야 한다. 보유자에게 소프트웨어를 제공하는 조직은 검증 프로세스 중에 프라이버시 침해로 이어질 수 있는 정보가 크리덴셜에 포함된 경우 경고해야 한다. 검증자는 프라이버시 침해를 유발하거나 잘못된 프라이버시 관행을 가능하게 하는 크리덴셜을 거부하는 것을 고려해야 한다.

저장소 제공자 및 데이터 마이닝

보유자발급자로부터 검증가능한 크리덴셜을 받으면 검증가능한 크리덴셜은 어딘가에 저장되어야 한다(예: 크리덴셜 리포지토리). 보유자검증가능한 크리덴셜의 정보가 본질적으로 민감하고 매우 개별화되어 데이터 마이닝의 높은 가치 목표가 된다는 점에 주의해야 한다. 검증가능한 크리덴셜의 무료 저장소를 광고하는 서비스는 실제로 개인 데이터를 마이닝하고 개인 및 조직에 대한 개별 프로파일을 구축하려는 조직에 판매할 수 있다.

보유자크리덴셜 리포지토리의 서비스 약관, 특히 검증가능한 크리덴셜을 서비스 제공자와 함께 저장하는 사람들을 위해 마련된 상관관계 및 데이터 마이닝 보호를 인식해야 한다.

데이터 마이닝 및 프로파일링에 대한 몇 가지 효과적인 완화 방법은 다음을 사용하는 것이다:

크리덴셜 집계

동일한 주체에 대한 두 가지 정보를 보유하는 것은 정보가 서로 다른 채널을 통해 전달되더라도 거의 항상 단순히 두 가지 정보의 합보다 주체에 대해 더 많은 것을 드러낸다. 검증가능한 크리덴셜의 집계는 프라이버시 위험이며 생태계의 모든 참여자는 데이터 집계의 위험을 인식해야 한다.

예를 들어, 한 세션에서 이메일 주소에 대한 bearer 크리덴셜을, 그 다음 세션에서 보유자가 21세 이상이라는 bearer 크리덴셜을 제공하는 경우, 정보의 검증자는 이제 해당 개인에 대한 고유 식별자와 연령 관련 정보를 모두 가지게 된다. 이제 시간이 지남에 따라 더 많은 정보가 유출되도록 보유자에 대한 프로파일을 쉽게 만들고 구축할 수 있다. 크리덴셜의 집계는 서로 공모하는 여러 사이트에서 수행될 수도 있으며, 이는 프라이버시 침해로 이어진다.

기술적 관점에서 정보의 집계를 방지하는 것은 해결하기 매우 어려운 프라이버시 문제이다. 영지식 증명과 같은 새로운 암호화 기술이 집계 및 상관관계 문제에 대한 해결책으로 제안되고 있지만, 장기 식별자와 브라우저 추적 기술의 존재는 가장 현대적인 암호화 기술조차도 무력화시킨다.

상관관계 또는 집계의 프라이버시 영향에 대한 해결책은 기술적인 것이 아니라 정책 중심인 경향이 있다. 따라서 보유자가 자신에 대한 정보가 집계되는 것을 원하지 않는 경우, 이를 전송하는 검증가능한 프레젠테이션에 명시해야 한다.

사용 패턴

프라이버시를 보장하기 위한 최선의 노력에도 불구하고, 검증가능한 크리덴셜을 실제로 사용하면 잠재적으로 익명성 해제와 프라이버시 손실로 이어질 수 있다. 이러한 상관관계는 다음과 같은 경우에 발생할 수 있다:

부분적으로 다음과 같은 방법으로 이러한 익명성 해제와 프라이버시 손실을 완화할 수 있다:

이러한 완화 기술이 항상 실용적이거나 심지어 필요한 사용과 호환되는 것은 아니라는 점을 이해한다. 때로는 상관관계가 요구사항이다.

예를 들어, 일부 처방약 모니터링 프로그램에서는 사용 모니터링이 요구사항이다. 집행 기관은 개인이 통제 물질에 대한 여러 처방전을 얻기 위해 시스템을 속이지 않는다는 것을 확인할 수 있어야 한다. 이러한 법적 또는 규제적 사용 상관관계 필요성은 개인 프라이버시 우려보다 우선한다.

검증가능한 크리덴셜은 또한 여러 서비스에 로그인하기 위해 공통 페르소나를 사용할 때와 같이 서비스 전반에서 개인을 의도적으로 연관시키는 데 사용될 것이다. 따라서 이러한 각 서비스의 모든 활동이 의도적으로 동일한 개인에게 연결된다. 이러한 각 서비스가 예상되는 방식으로 상관관계를 사용하는 한 이것은 프라이버시 문제가 아니다.

크리덴셜 사용의 프라이버시 위험은 크리덴셜 제시로 인해 의도하지 않거나 예상치 못한 상관관계가 발생할 때 발생한다.

잘못된 당사자와 정보 공유

보유자검증자와 정보를 공유하기로 선택한 경우, 검증자가 악의를 가지고 행동하고 보유자에게 해를 끼치는 데 사용될 수 있는 정보를 요청하는 경우일 수 있다. 예를 들어, 검증자는 은행 계좌 번호를 요청할 수 있으며, 이는 다른 정보와 함께 사용하여 보유자 또는 은행을 속일 수 있다.

발급자보유자가 실수로 크리덴셜을 잘못된 검증자에게 전송하더라도 상황이 치명적이지 않도록 가능한 한 많은 정보를 토큰화하도록 노력해야 한다.

예를 들어, 개인의 은행 잔고를 확인하기 위해 은행 계좌 번호를 포함하는 대신 검증자가 잔고가 특정 금액 이상인지 확인할 수 있는 토큰을 제공한다. 이 경우 은행은 잔고 확인 토큰이 포함된 검증가능한 크리덴셜보유자에게 발급할 수 있다. 그러면 보유자검증가능한 프레젠테이션검증가능한 크리덴셜을 포함하고 디지털 서명을 사용하여 토큰을 신용 조회 기관에 바인딩한다. 그러면 검증자검증가능한 프레젠테이션을 자신의 디지털 서명으로 래핑하고 다시 발급자에게 전달하여 계좌 잔고를 동적으로 확인할 수 있다.

이 접근 방식을 사용하면 보유자가 계좌 잔고 토큰을 잘못된 당사자와 공유하더라도 공격자는 은행 계좌 번호나 계좌의 정확한 값을 알아낼 수 없다. 그리고 역서명의 유효 기간을 감안할 때 몇 분 이상 토큰에 대한 액세스 권한을 얻지 못한다.

클레임 발급 빈도

섹션 에 자세히 설명된 대로 사용 패턴은 특정 유형의 행동과 상관관계가 있을 수 있다. 이러한 상관관계의 일부는 보유자발급자의 지식 없이 검증가능한 크리덴셜을 사용할 때 완화된다. 그러나 발급자검증가능한 크리덴셜의 수명을 짧게 하고 갱신을 자동으로 함으로써 이러한 보호를 무력화할 수 있다.

예를 들어, ageOver 검증가능한 크리덴셜은 바에 접근하는 데 유용하다. 발급자가 매우 짧은 만료 기간과 자동 갱신 메커니즘으로 이러한 검증가능한 크리덴셜을 발급하는 경우, 발급자보유자에게 부정적인 영향을 미치는 방식으로 보유자의 행동을 연관시킬 수 있다.

보유자에게 소프트웨어를 제공하는 조직은 행동 상관관계를 초래할 수 있는 수명이 짧은 크리덴셜을 반복적으로 사용하는 경우 경고해야 한다. 발급자는 사용 패턴을 연관시킬 수 있는 방식으로 크리덴셜을 발급하는 것을 피해야 한다.

일회용 크리덴셜 선호

이상적인 프라이버시 존중 시스템은 검증자와의 상호 작용에 필요한 정보만 보유자가 공개하도록 요구할 것이다. 그런 다음 검증자는 공개 요구사항이 충족되었음을 기록하고 공개된 민감한 정보를 잊어버릴 것이다. 많은 경우 규제 부담과 같은 경쟁 우선순위로 인해 이 이상적인 시스템이 채택되지 못하고 있다. 다른 경우에는 장기 식별자가 일회성 사용을 방해한다. 그러나 검증가능한 크리덴셜 생태계의 설계는 가능한 한 일회용 검증가능한 크리덴셜을 선호함으로써 가능한 한 프라이버시를 존중하도록 노력해야 한다.

일회용 검증가능한 크리덴셜을 사용하면 여러 가지 이점이 있다. 첫 번째 이점은 검증자검증가능한 크리덴셜의 데이터가 새로운 것임을 확신할 수 있다는 것이다. 두 번째 이점은 검증가능한 크리덴셜에 장기 식별자가 없는 경우 검증가능한 크리덴셜 자체를 사용하여 보유자를 온라인에서 추적하거나 연관시킬 수 없다는 것을 아는 보유자에게 있다. 마지막으로 공격자가 훔칠 것이 없어 전체 생태계를 더 안전하게 운영할 수 있다.

프라이빗 브라우징

이상적인 프라이빗 브라우징 시나리오에서는 PII가 공개되지 않는다. 많은 크리덴셜에 PII가 포함되어 있기 때문에 보유자에게 소프트웨어를 제공하는 조직은 프라이빗 브라우징 모드에서 크리덴셜프레젠테이션을 사용하려는 경우 이 정보가 공개될 가능성에 대해 경고해야 한다. 각 브라우저 공급업체가 프라이빗 브라우징을 다르게 처리하고 일부 브라우저에는 이 기능이 전혀 없을 수 있으므로 구현자는 이러한 차이점을 인식하고 그에 따라 솔루션을 구현하는 것이 중요하다.

보안 고려사항

발급자, 보유자, 검증자가 이 규격에서 설명하는 데이터를 처리할 때 알고 있어야 할 몇 가지 보안 고려사항이 있다. 이 섹션의 의미를 무시하거나 이해하지 않으면 보안 취약점이 발생할 수 있다.

이 섹션에서는 광범위한 보안 고려사항을 강조하려고 하지만, 완전한 목록은 아니다. 구현자는 이 규격에 설명된 기술을 사용하여 미션 크리티컬 시스템을 구현할 때 보안 및 암호학 전문가의 조언을 구할 것을 권장한다.

암호 스위트 및 라이브러리

이 규격에 설명된 데이터 모델의 일부 측면은 암호학을 사용하여 보호할 수 있다. 구현자가 크리덴셜프레젠테이션을 생성하고 처리하는 데 사용되는 암호 스위트와 라이브러리를 이해하는 것이 중요하다. 일반적으로 암호 시스템을 구현하고 감사하려면 상당한 경험이 필요하다. 효과적인 레드 팀은 또한 보안 검토에서 편견을 제거하는 데 도움이 될 수 있다.

암호 스위트와 라이브러리에는 수명이 있으며 결국 새로운 공격과 기술 발전에 의해 무너진다. 프로덕션 품질 시스템은 이를 고려해야 하며, 만료되거나 손상된 암호 스위트와 라이브러리를 쉽고 선제적으로 업그레이드하고 기존 크리덴셜을 무효화하고 교체할 수 있는 메커니즘이 존재해야 한다. 정기적인 모니터링은 크리덴셜을 처리하는 시스템의 장기적인 생존력을 보장하는 데 중요하다.

콘텐츠 무결성 보호

검증가능한 크리덴셜은 종종 검증가능한 크리덴셜 자체 외부에 있는 데이터에 대한 URL을 포함한다. 이미지, JSON-LD 컨텍스트 및 기타 기계 판독 가능한 데이터와 같이 검증가능한 크리덴셜 외부에 존재하는 연결된 콘텐츠는 데이터가 검증가능한 크리덴셜증명 보호 외부에 있기 때문에 변조로부터 보호되지 않는 경우가 많다. 예를 들어, 다음 강조 표시된 링크는 콘텐츠 무결성이 보호되지 않지만 아마도 보호되어야 한다:

{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://www.w3.org/2018/credentials/examples/v1"
  ],
  "id": "http://example.edu/credentials/58473",
  "type": ["VerifiableCredential", "AlumniCredential"],
  "credentialSubject": {
    "id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
    "image": "https://example.edu/images/58473",
    "alumniOf": {
      "id": "did:example:c276e12ec21ebfeb1f712ebc6f1",
      "name": [{
        "value": "Example University",
        "lang": "en"
      }, {
        "value": "Exemple d'Université",
        "lang": "fr"
      }]
    }
  },
  "proof": { ... }
}
      

이 규격은 특정한 콘텐츠 무결성 보호를 권장하지는 않지만, 콘텐츠에 대한 링크의 무결성을 보호하고 싶은 문서 작성자는 콘텐츠 무결성을 강제하는 URL 체계를 사용하는 것이 좋다. 이러한 두 가지 체계로는 [[HASHLINK]] 규격과 [[IPFS]]가 있다. 아래 예시는 이전 예시를 변형하고 [[HASHLINK]] 규격을 사용하여 JSON-LD 컨텍스트에 콘텐츠 무결성 보호를 추가하고, [[IPFS]] 링크를 사용하여 이미지에 콘텐츠 무결성 보호를 추가한다.

{
  "@context": [
    "https://www.w3.org/2018/credentials/v1?hl=z3aq31uzgnZBuWNzUB",
    "https://www.w3.org/2018/credentials/examples/v1?hl=z8guWNzUBnZBu3aq31"
  ],
  "id": "http://example.edu/credentials/58473",
  "type": ["VerifiableCredential", "AlumniCredential"],
  "credentialSubject": {
    "id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
    "image": "ipfs:/ipfs/QmXfrS3pHerg44zzK6QKQj6JDk8H6cMtQS7pdXbohwNQfK/image",
    "alumniOf": {
      "id": "did:example:c276e12ec21ebfeb1f712ebc6f1",
      "name": [{
        "value": "Example University",
        "lang": "en"
      }, {
        "value": "Exemple d'Université",
        "lang": "fr"
      }]
    }
  },
  "proof": { ... }
}
      

프로덕션 구현에서는 중요한 JSON-LD 컨텍스트의 정적 사본과 함께 제공될 것으로 예상되므로 위의 JSON-LD 컨텍스트에 보호가 필요한지 여부는 논란의 여지가 있다.

위의 예는 콘텐츠 무결성 보호를 달성하는 한 가지 방법이지만, 특정 애플리케이션에 더 적합할 수 있는 다른 솔루션이 있다. 구현자는 콘텐츠 무결성이 보호되지 않은 외부 기계 판독 가능 콘텐츠에 대한 링크가 어떻게 자신의 애플리케이션에 대한 성공적인 공격으로 이어질 수 있는지 이해해야 한다.

서명되지 않은 클레임

이 규격은 어떤 종류의 서명이나 증명도 포함하지 않는 크리덴셜을 생성할 수 있게 한다. 이러한 유형의 크리덴셜은 종종 중간 저장소나 웹 페이지에서 양식을 작성하는 것과 유사한 자가 주장 정보에 유용하다. 구현자는 이러한 유형의 크리덴셜은 작성자가 알려지지 않았거나 신뢰할 수 없기 때문에 검증 가능하지 않다는 점을 알아야 한다.

토큰 바인딩

검증자는 자신이 검증가능한 프레젠테이션의 의도된 수신자이며 중간자 공격의 대상이 아님을 확인해야 할 수 있다. 검증가능한 프레젠테이션에 대한 요청을 응답에 연결하는 토큰 바인딩 [[RFC8471]]과 같은 접근 방식은 프로토콜을 보호할 수 있다. 보안되지 않은 모든 프로토콜은 중간자 공격에 취약하다.

종속 클레임 번들링

발급자크리덴셜의 정보를 원자화하거나 선택적 공개를 허용하는 서명 체계를 사용하는 것이 모범 사례로 간주된다. 원자화의 경우 발급자에 의해 안전하게 수행되지 않으면 보유자발급자가 의도하지 않은 방식으로 서로 다른 크리덴셜을 함께 번들링할 수 있다.

예를 들어, 대학은 한 사람에게 각각 두 개의 속성을 포함하는 두 개의 검증가능한 크리덴셜을 발급할 수 있는데, 이는 "컴퓨팅 학과"의 "직원" 또는 "경제학과"의 "대학원생"과 같이 주어진 "학과"에서 그 사람의 "역할"을 지정하기 위해 함께 취해져야 한다. 이러한 검증가능한 크리덴셜이 이러한 속성 중 하나만 각 크리덴셜에 넣도록 원자화되면, 대학은 그 사람에게 "직원", "대학원생", "컴퓨팅 학과", "경제학과" 중 하나의 지정을 포함하는 네 개의 크리덴셜을 발급할 것이다. 그러면 보유자는 "직원"과 "경제학과"의 검증가능한 크리덴셜검증자에게 전송할 수 있으며, 이는 함께 거짓 클레임을 구성할 것이다.

고도로 동적인 정보

고도로 동적인 정보에 대해 검증가능한 크리덴셜이 발급되는 경우, 구현자는 만료 시간을 적절하게 설정해야 한다. 검증가능한 크리덴셜이 유효한 시간 프레임보다 더 긴 만료 기간은 악용 가능한 보안 취약점을 만들 수 있다. 검증가능한 크리덴셜로 표현된 정보가 유효한 시간 프레임보다 더 짧은 만료 기간은 보유자검증자에게 부담을 준다. 따라서 사용 사례와 검증가능한 크리덴셜에 포함된 정보의 예상 수명에 적합한 검증가능한 크리덴셜의 유효 기간을 설정하는 것이 중요하다.

장치 도난 및 사칭

검증가능한 크리덴셜이 장치에 저장되어 있고 해당 장치를 분실하거나 도난당한 경우, 공격자가 피해자의 검증가능한 크리덴셜을 사용하여 시스템에 액세스할 수 있다. 이러한 유형의 공격을 완화하는 방법은 다음과 같다:

접근성 고려사항

구현자가 이 규격에 설명된 데이터를 처리할 때 알고 있어야 할 몇 가지 접근성 고려사항이 있다. 모든 웹 표준이나 프로토콜의 구현과 마찬가지로, 접근성 문제를 무시하면 인구의 상당 부분이 이 정보를 사용할 수 없게 된다. 모든 사람이 능력에 관계없이 이 데이터를 사용할 수 있도록 하려면 [[WCAG21]]과 같은 접근성 지침과 표준을 따르는 것이 중요하다. 이는 특히 역사적으로 보조 기술에 문제를 야기해 온 암호화를 활용하는 시스템을 구축할 때 특히 중요하다.

이 섹션에서는 이 데이터 모델을 활용할 때 고려해야 할 일반적인 접근성 고려사항에 대해 자세히 설명한다.

데이터 우선 접근법

정부 신분증과 같이 오늘날 사용되는 많은 물리적 크리덴셜은 작은 인쇄, 작고 고해상도 이미지에 대한 의존, 시각 장애인을 위한 편의 시설 부족 등을 포함한 열악한 접근성 특성을 가지고 있다.

이 데이터 모델을 활용하여 검증가능한 크리덴셜을 만들 때, 데이터 모델 설계자는 데이터 우선 접근 방식을 사용하는 것이 좋다. 예를 들어, 크리덴셜을 표현하기 위해 데이터나 그래픽 이미지를 사용하는 선택권이 주어진 경우, 설계자는 기관명이나 전문 크리덴셜과 같은 이미지의 모든 요소를 뷰어의 이미지 해석에 의존하는 대신 기계 판독 가능한 방식으로 표현해야 한다. 데이터 우선 접근 방식을 사용하는 것이 선호되는 이유는 다양한 능력을 가진 사람들을 위한 다양한 인터페이스를 구축하는 기본 요소를 제공하기 때문이다.

국제화 고려사항

구현자는 이 규격에 설명된 데이터를 게시할 때 고려해야 할 여러 국제화 사항에 유의해야 한다. 모든 웹 표준 또는 프로토콜 구현과 마찬가지로, 국제화를 무시하면 서로 다른 언어와 사회에서 데이터를 생성하고 사용하기 어려워지므로 규격의 적용 가능성이 제한되고 표준으로서의 가치가 크게 감소한다.

구현자는 W3C 국제화 활동에서 발행한 웹에서의 문자열: 언어 및 방향 메타데이터 문서 [[STRING-META]]를 읽어볼 것을 강력히 권장한다. 이 문서는 국제화를 지원하기 위해 텍스트에 대한 신뢰할 수 있는 메타데이터를 제공해야 할 필요성에 대해 자세히 설명한다. 구현자는 최신 국제화 고려사항에 대한 정보를 얻기 위해 검증가능한 크리덴셜 구현 지침 [[VC-IMP-GUIDE]] 문서를 읽어볼 것을 권장한다.

이 섹션에서는 이 데이터 모델을 활용할 때 고려해야 할 일반적인 국제화 고려사항을 간략히 설명하며, 구현자가 관심 있어 할 웹에서의 문자열: 언어 및 방향 메타데이터 문서 [[STRING-META]]의 특정 부분을 강조하기 위한 것이다.

언어와 기본 방향

데이터 게시자는 [[JSON-LD]], [[JSON]], CBOR [[?RFC7049]]와 같은 여러 표현 구문에서 언어 및 기본 방향 정보의 표현이 가능하도록 하기 위해 웹에서의 문자열: 언어 및 방향 메타데이터 문서 [[STRING-META]]의 교차 구문 표현 섹션을 읽는 것이 좋다.

일반적인 설계 패턴은 언어 및 선택적으로 특정 기본 방향으로 태그된 텍스트 문자열을 표현할 때 다음 마크업 템플릿을 사용하는 것이다.

"property": {
  "value": "The string value",
  "lang": "LANGUAGE"
  "dir": "DIRECTION"
}
      

위의 설계 패턴을 사용하여 다음 예제는 텍스트 방향을 지정하지 않고 영어로 된 책의 제목을 표현한다.

"title": {
  "value": "HTML and CSS: Designing and Creating Websites",
  "lang": "en"
}
      

다음 예제는 오른쪽에서 왼쪽으로의 기본 방향으로 아랍어로 표현된 유사한 제목을 사용한다.

"title": {
  "value": "HTML و CSS: تصميم و إنشاء مواقع الويب",
  "lang": "ar"
  "dir": "rtl"
}
      

많은 시스템이 텍스트 문자열의 첫 번째 문자를 사용하여 텍스트 방향을 결정하기 때문에, 위의 텍스트는 언어와 방향을 명시적으로 표현하지 않으면 왼쪽에서 오른쪽으로 잘못 렌더링될 가능성이 높다.

JSON-LD를 활용하는 구현자는 국제화된 속성을 정의하는 JSON-LD 컨텍스트를 확장하고 JSON-LD의 범위 지정 컨텍스트 기능을 사용하여 @value, @language, @direction 키워드를 각각 value, lang, dir로 별칭하는 것이 좋다. 이를 수행하는 JSON-LD 컨텍스트 스니펫의 예는 아래에 나와 있다.

"title": {
  "@context": {"value": "@value", "lang": "@language", "dir": "@direction"},
  "@id": "https://www.w3.org/2018/credentials/examples#title"
}
      

복잡한 언어 마크업

단일 자연어 문자열에 여러 언어, 기본 방향 및 주석이 사용되는 경우 일반적으로 더 복잡한 메커니즘이 필요하다. HTML과 같은 마크업 언어를 사용하여 여러 언어와 기본 방향으로 텍스트를 인코딩할 수 있다. 또한 rdf:HTML 데이터 유형을 사용하여 JSON-LD에서 이러한 값을 정확하게 인코딩할 수 있다.

HTML로 정보를 인코딩할 수 있음에도 불구하고 구현자는 다음과 같은 이유로 이렇게 하지 않는 것이 좋다:

구현자가 특정 사용 사례를 해결하기 위해 실행 가능한 스크립트를 포함할 수 있는 HTML이나 기타 마크업 언어를 사용해야 한다고 생각하는 경우, 공격자가 마크업을 사용하여 마크업 소비자에 대한 주입 공격을 수행하는 방법을 분석한 다음 식별된 공격에 대한 완화책을 배포하는 것이 좋다.

유효성 검사

이 규격은 검증가능한 크리덴셜 또는 검증가능한 프레젠테이션유효성 검사 프로세스에 대한 적합성 기준을 제공하지 않지만, 독자는 검증자유효성 검사 프로세스 중에 이 데이터 모델의 정보를 어떻게 활용할 것으로 예상되는지 궁금할 수 있다. 이 섹션에서는 검증자가 이 규격의 데이터 필드를 사용할 것으로 예상되는 방식과 관련하여 작업 그룹이 나눈 대화 중 일부를 다룬다.

크리덴셜 주체

보유자가 제시한 검증가능한 크리덴셜에서 각 credentialSubjectid 속성과 연결된 값은 검증자에게 주체를 식별할 것으로 예상된다. 보유자주체이기도 한 경우, 검증자보유자와 관련된 공개 키 메타데이터를 가지고 있다면 보유자를 인증할 수 있다. 그런 다음 검증자검증가능한 프레젠테이션에 포함된 보유자가 생성한 서명을 사용하여 보유자를 인증할 수 있다. id 속성은 선택 사항이다. 검증자검증가능한 크리덴셜의 다른 속성을 사용하여 주체를 고유하게 식별할 수 있다.

검증가능한 크리덴셜에서 인증 및 WebAuthn이 어떻게 작동하는지에 대한 정보는 검증가능한 크리덴셜 구현 지침 [[VC-IMP-GUIDE]] 문서를 참조하라.

발급자

issuer 속성과 연결된 값은 검증자에게 알려지고 신뢰할 수 있는 발급자를 식별할 것으로 예상된다.

issuer 속성과 관련된 메타데이터는 검증자에게 제공될 것으로 예상된다. 예를 들어, 발급자는 자신이 발급한 검증가능한 크리덴셜에 디지털 서명하는 데 사용하는 공개 키를 포함하는 정보를 게시할 수 있다. 이 메타데이터는 검증가능한 크리덴셜의 증명을 확인할 때 관련이 있다.

발행일

issuanceDate검증자에게 예상되는 범위 내에 있을 것으로 예상된다. 예를 들어, 검증자검증가능한 크리덴셜의 발행일이 미래가 아닌지 확인할 수 있다.

증명(서명)

검증가능한 크리덴셜 또는 검증가능한 프레젠테이션의 정보가 변조되지 않았음을 증명하는 데 사용되는 암호학적 메커니즘을 증명이라고 한다. 디지털 서명, 영지식 증명, 작업 증명, 지분 증명 등 여러 유형의 암호학적 증명이 있다. 일반적으로 증명을 검증할 때 구현은 다음을 보장해야 한다:

일부 증명은 디지털 서명이다. 일반적으로 디지털 서명을 검증할 때 구현은 다음을 보장해야 한다:

디지털 서명은 변조 저항성 이외에도 즉시 명확하지 않은 여러 보호 기능을 제공한다. 예를 들어, 연결된 데이터 서명 created 속성크리덴셜검증된 것으로 간주되어서는 안 되는 날짜와 시간을 설정한다. verificationMethod 속성은 예를 들어 디지털 서명을 검증하는 데 사용할 수 있는 공개 키를 지정한다. 공개 키 URL을 역참조하면 키 컨트롤러에 대한 정보가 드러나며, 이는 크리덴셜의 발급자와 대조하여 확인할 수 있다. proofPurpose 속성은 증명의 목적을 명확하게 표현하고 이 정보가 서명에 의해 보호되도록 한다. 증명은 일반적으로 인증 목적으로 검증가능한 프레젠테이션에 첨부되고 주장 방법으로 검증가능한 크리덴셜에 첨부된다.

만료

expirationDate검증자에게 예상되는 범위 내에 있을 것으로 예상된다. 예를 들어, 검증자검증가능한 크리덴셜의 만료 날짜가 과거가 아닌지 확인할 수 있다.

상태

credentialStatus 속성을 사용할 수 있는 경우, 검증가능한 크리덴셜의 상태는 검증가능한 크리덴셜에 대한 credentialStatus 유형 정의와 검증자 자체의 상태 평가 기준에 따라 검증자에 의해 평가될 것으로 예상된다. 예를 들어, 검증자검증가능한 크리덴셜의 상태가 "발급자에 의해 취소되지 않았음"을 확인할 수 있다.

용도 적합성

용도 적합성은 검증가능한 크리덴셜의 사용자 정의 속성검증자의 목적에 적합한지 여부에 관한 것이다. 예를 들어, 검증자주체의 나이가 21세 이상인지 확인해야 하는 경우 특정 birthdate 속성이나 ageOver와 같은 더 추상적인 속성에 의존할 수 있다.

검증자발급자가 해당 클레임을 만드는 것을 신뢰한다. 예를 들어, 프랜차이즈 패스트푸드 레스토랑 체인점은 프랜차이즈 본사가 만든 할인 쿠폰 클레임을 신뢰한다. 보유자검증자는 정책을 무시함으로써 발생하는 책임을 수용하지 않는 한 검증가능한 크리덴셜에서 발급자가 표현한 정책 정보를 존중해야 한다.

Contexts, Types, and Credential Schemas

기반 컨텍스트

https://www.w3.org/2018/credentials/v1에 위치하고 SHA-256 다이제스트가 ab4ddd9a531758807a79a5b450510d61ae8d147eab966cc9a200c07095b0cdcc인 기반 컨텍스트는 로컬 캐시된 사본을 구현하는 데 사용될 수 있다. 편의를 위해 이 섹션에서도 기반 컨텍스트를 제공한다.

{
  "@context": {
    "@version": 1.1,
    "@protected": true,

    "id": "@id",
    "type": "@type",

    "VerifiableCredential": {
      "@id": "https://www.w3.org/2018/credentials#VerifiableCredential",
      "@context": {
        "@version": 1.1,
        "@protected": true,

        "id": "@id",
        "type": "@type",

        "cred": "https://www.w3.org/2018/credentials#",
        "sec": "https://w3id.org/security#",
        "xsd": "http://www.w3.org/2001/XMLSchema#",

        "credentialSchema": {
          "@id": "cred:credentialSchema",
          "@type": "@id",
          "@context": {
            "@version": 1.1,
            "@protected": true,

            "id": "@id",
            "type": "@type",

            "cred": "https://www.w3.org/2018/credentials#",

            "JsonSchemaValidator2018": "cred:JsonSchemaValidator2018"
          }
        },
        "credentialStatus": {"@id": "cred:credentialStatus", "@type": "@id"},
        "credentialSubject": {"@id": "cred:credentialSubject", "@type": "@id"},
        "evidence": {"@id": "cred:evidence", "@type": "@id"},
        "expirationDate": {"@id": "cred:expirationDate", "@type": "xsd:dateTime"},
        "holder": {"@id": "cred:holder", "@type": "@id"},
        "issued": {"@id": "cred:issued", "@type": "xsd:dateTime"},
        "issuer": {"@id": "cred:issuer", "@type": "@id"},
        "issuanceDate": {"@id": "cred:issuanceDate", "@type": "xsd:dateTime"},
        "proof": {"@id": "sec:proof", "@type": "@id", "@container": "@graph"},
        "refreshService": {
          "@id": "cred:refreshService",
          "@type": "@id",
          "@context": {
            "@version": 1.1,
            "@protected": true,

            "id": "@id",
            "type": "@type",

            "cred": "https://www.w3.org/2018/credentials#",

            "ManualRefreshService2018": "cred:ManualRefreshService2018"
          }
        },
        "termsOfUse": {"@id": "cred:termsOfUse", "@type": "@id"},
        "validFrom": {"@id": "cred:validFrom", "@type": "xsd:dateTime"},
        "validUntil": {"@id": "cred:validUntil", "@type": "xsd:dateTime"}
      }
    },

    "VerifiablePresentation": {
      "@id": "https://www.w3.org/2018/credentials#VerifiablePresentation",
      "@context": {
        "@version": 1.1,
        "@protected": true,

        "id": "@id",
        "type": "@type",

        "cred": "https://www.w3.org/2018/credentials#",
        "sec": "https://w3id.org/security#",

        "holder": {"@id": "cred:holder", "@type": "@id"},
        "proof": {"@id": "sec:proof", "@type": "@id", "@container": "@graph"},
        "verifiableCredential": {"@id": "cred:verifiableCredential", "@type": "@id", "@container": "@graph"}
      }
    },

    "EcdsaSecp256k1Signature2019": {
      "@id": "https://w3id.org/security#EcdsaSecp256k1Signature2019",
      "@context": {
        "@version": 1.1,
        "@protected": true,

        "id": "@id",
        "type": "@type",

        "sec": "https://w3id.org/security#",
        "xsd": "http://www.w3.org/2001/XMLSchema#",

        "challenge": "sec:challenge",
        "created": {"@id": "http://purl.org/dc/terms/created", "@type": "xsd:dateTime"},
        "domain": "sec:domain",
        "expires": {"@id": "sec:expiration", "@type": "xsd:dateTime"},
        "jws": "sec:jws",
        "nonce": "sec:nonce",
        "proofPurpose": {
          "@id": "sec:proofPurpose",
          "@type": "@vocab",
          "@context": {
            "@version": 1.1,
            "@protected": true,

            "id": "@id",
            "type": "@type",

            "sec": "https://w3id.org/security#",

            "assertionMethod": {"@id": "sec:assertionMethod", "@type": "@id", "@container": "@set"},
            "authentication": {"@id": "sec:authenticationMethod", "@type": "@id", "@container": "@set"}
          }
        },
        "proofValue": "sec:proofValue",
        "verificationMethod": {"@id": "sec:verificationMethod", "@type": "@id"}
      }
    },

    "EcdsaSecp256r1Signature2019": {
      "@id": "https://w3id.org/security#EcdsaSecp256r1Signature2019",
      "@context": {
        "@version": 1.1,
        "@protected": true,

        "id": "@id",
        "type": "@type",

        "sec": "https://w3id.org/security#",
        "xsd": "http://www.w3.org/2001/XMLSchema#",

        "challenge": "sec:challenge",
        "created": {"@id": "http://purl.org/dc/terms/created", "@type": "xsd:dateTime"},
        "domain": "sec:domain",
        "expires": {"@id": "sec:expiration", "@type": "xsd:dateTime"},
        "jws": "sec:jws",
        "nonce": "sec:nonce",
        "proofPurpose": {
          "@id": "sec:proofPurpose",
          "@type": "@vocab",
          "@context": {
            "@version": 1.1,
            "@protected": true,

            "id": "@id",
            "type": "@type",

            "sec": "https://w3id.org/security#",

            "assertionMethod": {"@id": "sec:assertionMethod", "@type": "@id", "@container": "@set"},
            "authentication": {"@id": "sec:authenticationMethod", "@type": "@id", "@container": "@set"}
          }
        },
        "proofValue": "sec:proofValue",
        "verificationMethod": {"@id": "sec:verificationMethod", "@type": "@id"}
      }
    },

    "Ed25519Signature2018": {
      "@id": "https://w3id.org/security#Ed25519Signature2018",
      "@context": {
        "@version": 1.1,
        "@protected": true,

        "id": "@id",
        "type": "@type",

        "sec": "https://w3id.org/security#",
        "xsd": "http://www.w3.org/2001/XMLSchema#",

        "challenge": "sec:challenge",
        "created": {"@id": "http://purl.org/dc/terms/created", "@type": "xsd:dateTime"},
        "domain": "sec:domain",
        "expires": {"@id": "sec:expiration", "@type": "xsd:dateTime"},
        "jws": "sec:jws",
        "nonce": "sec:nonce",
        "proofPurpose": {
          "@id": "sec:proofPurpose",
          "@type": "@vocab",
          "@context": {
            "@version": 1.1,
            "@protected": true,

            "id": "@id",
            "type": "@type",

            "sec": "https://w3id.org/security#",

            "assertionMethod": {"@id": "sec:assertionMethod", "@type": "@id", "@container": "@set"},
            "authentication": {"@id": "sec:authenticationMethod", "@type": "@id", "@container": "@set"}
          }
        },
        "proofValue": "sec:proofValue",
        "verificationMethod": {"@id": "sec:verificationMethod", "@type": "@id"}
      }
    },

    "RsaSignature2018": {
      "@id": "https://w3id.org/security#RsaSignature2018",
      "@context": {
        "@version": 1.1,
        "@protected": true,

        "challenge": "sec:challenge",
        "created": {"@id": "http://purl.org/dc/terms/created", "@type": "xsd:dateTime"},
        "domain": "sec:domain",
        "expires": {"@id": "sec:expiration", "@type": "xsd:dateTime"},
        "jws": "sec:jws",
        "nonce": "sec:nonce",
        "proofPurpose": {
          "@id": "sec:proofPurpose",
          "@type": "@vocab",
          "@context": {
            "@version": 1.1,
            "@protected": true,

            "id": "@id",
            "type": "@type",

            "sec": "https://w3id.org/security#",

            "assertionMethod": {"@id": "sec:assertionMethod", "@type": "@id", "@container": "@set"},
            "authentication": {"@id": "sec:authenticationMethod", "@type": "@id", "@container": "@set"}
          }
        },
        "proofValue": "sec:proofValue",
        "verificationMethod": {"@id": "sec:verificationMethod", "@type": "@id"}
      }
    },

    "proof": {"@id": "https://w3id.org/security#proof", "@type": "@id", "@container": "@graph"}
  }
}

주체-보유자 관계

이 섹션에서는 주체보유자 사이의 가능한 관계와 검증가능한 크리덴셜 데이터 모델이 이러한 관계를 어떻게 표현하는지 설명한다. 다음 다이어그램은 이러한 관계를 보여주며, 이어지는 섹션에서는 데이터 모델에서 이러한 각 관계가 어떻게 처리되는지 설명한다.

Long decision tree
          from top to bottom.  For the first question, 'Subject
          Present?', No means Bearer Credential and Yes points to the
          rest of the tree.  From this point on until the very end,
          each Yes points to an answer and each No points to another
          question.  The first question here is 'Subject = Holder?',
          with Yes meaning Most Common Use Case.  If No, 'Credential
          Uniquely Identifies Subject?' with Yes meaning Irrelevant who
          Holder is.  If No, 'Subject Passes VC to Holder?' with Yes
          meaning, e.g., Power of Attorney, Employee.  If No, 'Issuer
          Independently Authorizes Holder?' with Yes meaning, e.g., Law
          Enforcement.  If No, 'Holder Acts for Subject?' with Yes
          meaning, e.g., Parent, Pet Owner, Travel Agent.  If No,
          'Holder Acts for Verifier?' with Yes meaning, e.g., Recruiter
          passing on VC of job applicant to employer and No meaning
          'Random Holder with no relationship to Subject, Issuer or Verifier
Subject-Holder Relationships in Verifiable Credentials.

주체가 보유자인 경우

가장 일반적인 관계는 주체보유자인 경우이다. 이 경우, 검증가능한 프레젠테이션보유자에 의해 디지털 서명되고 포함된 모든 검증가능한 크리덴셜보유자와 동일한 것으로 식별될 수 있는 주체에 관한 것이라면, 검증자주체보유자임을 쉽게 추론할 수 있다.

credentialSubject검증가능한 프레젠테이션검증가능한 크리덴셜을 삽입할 수 있는 경우, 발급자는 아래 설명된 대로 nonTransferable 속성검증가능한 크리덴셜에 삽입할 수 있다.

nonTransferable 속성

nonTransferable 속성검증가능한 크리덴셜이 반드시 credentialSubject에 의해 발급된 증명이 있는 검증가능한 프레젠테이션에만 캡슐화되어야 함을 나타낸다. nonTransferable 속성을 포함하는 검증가능한 크리덴셜이 포함된 검증가능한 프레젠테이션의 증명 생성자가 credentialSubject가 아닌 경우, 해당 프레젠테이션은 유효하지 않다.

{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://www.w3.org/2018/credentials/examples/v1"
  ],
  "id": "http://example.edu/credentials/3732",
  "type": ["VerifiableCredential", "ProofOfAgeCredential"],
  "issuer": "https://example.edu/issuers/14",
  "issuanceDate": "2010-01-01T19:23:24Z",
  "credentialSubject": {
    "id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
    "ageOver": 21
    },
  "nonTransferable": true,
  "proof": { ..
  "verificationMethod": "did:example:ebfeb1f712ebc6f1c276e12ec21",
  ... }
}
          

크리덴셜이 주체를 고유하게 식별하는 경우

이 경우, credentialSubject 속성에는 주체에 대한 설명의 측면을 제공하는 여러 속성이 포함될 수 있으며, 이들이 결합되어 주체를 명확하게 식별한다. 일부 사용 사례에서는 의사(주체)가 이사회 인증을 받았는지 확인하는 것과 같이 보유자를 전혀 식별할 필요가 없을 수 있다. 다른 사용 사례에서는 검증자가 대역외 지식을 사용하여 주체보유자 사이의 관계를 판단해야 할 수 있다.

{
  "@context": ["https://www.w3.org/2018/credentials/v1", "https://schema.org/"]
  "id": "http://example.edu/credentials/332",
  "type": ["VerifiableCredential", "IdentityCredential"],
  "issuer": "https://example.edu/issuers/4",
  "issuanceDate": "2017-02-24T19:73:24Z",
  "credentialSubject": {
    "name": "J. Doe",
    "address": {
      "streetAddress": "10 Rue de Chose",
      "postalCode": "98052",
      "addressLocality": "Paris",
      "addressCountry": "FR"
    },
    "birthDate": "1989-03-15"
    ...
  },
  "proof": { ... }
}
        

위의 예시는 개인의 이름, 주소, 생년월일을 사용하여 주체를 고유하게 식별한다.

주체가 검증가능한 크리덴셜을 보유자에게 전달하는 경우

일반적으로 검증가능한 크리덴셜주체에 의해 검증자에게 제시된다. 그러나 경우에 따라 주체검증가능한 크리덴셜의 전부 또는 일부를 다른 보유자에게 전달해야 할 수 있다. 예를 들어, 환자(주체)가 너무 아파서 처방전(검증가능한 크리덴셜)을 약사(검증자)에게 가져갈 수 없는 경우, 친구가 처방전을 가져가서 약을 받아올 수 있다.

데이터 모델은 주체가 새로운 검증가능한 크리덴셜을 발급하고 이를 새로운 보유자에게 주어 보유자가 두 검증가능한 크리덴셜을 모두 검증자에게 제시할 수 있도록 함으로써 이를 허용한다. 그러나 이 두 번째 검증가능한 크리덴셜의 내용은 애플리케이션마다 다를 가능성이 높으므로 이 규격에서는 이 두 번째 검증가능한 크리덴셜의 내용을 표준화할 수 없다. 그럼에도 불구하고, 부록 에 비규범적인 예시가 제공된다.

보유자가 주체를 대신하여 행동하는 경우

검증가능한 크리덴셜 데이터 모델은 적어도 다음과 같은 방식으로 주체를 대신하여 보유자가 행동하는 것을 지원한다:

위에 나열된 메커니즘은 보유자주체 사이의 관계를 설명하고 검증자가 해당 관계가 주어진 사용 사례에 대해 충분히 표현되었는지 결정하는 데 도움이 된다.

발급자 또는 검증자주체보유자 사이의 관계를 검증하기 위해 사용하는 추가 메커니즘은 이 규격의 범위를 벗어난다.

{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://www.w3.org/2018/credentials/examples/v1"
  ],
  "id": "http://example.edu/credentials/3732",
  "type": ["VerifiableCredential", "AgeCredential", "RelationshipCredential"],
  "issuer": "https://example.edu/issuers/14",
  "issuanceDate": "2010-01-01T19:23:24Z",
  "credentialSubject": {
    "id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
    "ageUnder": 16,
    "parent": {
      "id": "did:example:ebfeb1c276e12ec211f712ebc6f",
      "type": "Mother"
    }
  },
  "proof": { ... }  // the proof is generated by the DMV
}
        

위의 예시에서 발급자는 자녀와 부모 사이의 관계를 표현하여 검증자가 자녀나 부모가 제공하는 경우 크리덴셜을 수락할 가능성이 높다.

{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://www.w3.org/2018/credentials/examples/v1"
  ],
  "id": "http://example.edu/credentials/3732",
  "type": ["VerifiableCredential", "RelationshipCredential"],
  "issuer": "https://example.edu/issuers/14",
  "issuanceDate": "2010-01-01T19:23:24Z",
  "credentialSubject": {
    "id": "did:example:ebfeb1c276e12ec211f712ebc6f",
    "child": {
      "id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
      "type": "Child"
    }
  },
  "proof": { ... } // the proof is generated by the DMV
}
        

위의 예시에서 발급자는 별도의 크리덴셜에 자녀와 부모 사이의 관계를 표현하여 검증자가 자녀가 제공하거나 위의 크리덴셜이 자녀의 크리덴셜과 함께 제공되는 경우 자녀의 크리덴셜을 수락할 가능성이 높다.

{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://www.w3.org/2018/credentials/examples/v1"
  ],
  "id": "http://example.org/credentials/23894",
  "type": ["VerifiableCredential", "RelationshipCredential"],
  "issuer": "http://example.org/credentials/23894",
  "issuanceDate": "2010-01-01T19:23:24Z",
  "credentialSubject": {
    "id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
    "parent": {
      "id": "did:example:ebfeb1c276e12ec211f712ebc6f",
      "type": "Mother"
    }
  },
  "proof": { ... } // the proof is generated by the child
}
        

위의 예시에서 자녀는 별도의 크리덴셜에 자녀와 부모 사이의 관계를 표현하여 위의 크리덴셜이 제공되는 경우 검증자가 자녀의 크리덴셜을 수락할 가능성이 높다.

마찬가지로, 위 예시에서 설명한 전략은 위임장, 애완동물 소유권, 환자 처방전 수령 등 다른 많은 유형의 사용 사례에 사용될 수 있다.

주체가 검증가능한 크리덴셜을 다른 사람에게 전달하는 경우

주체검증가능한 크리덴셜을 다른 보유자에게 전달할 때, 주체는 다음과 같은 새로운 검증가능한 크리덴셜보유자에게 발급할 수 있다:

이제 보유자는 이 두 검증가능한 크리덴셜을 포함하는 검증가능한 프레젠테이션을 생성하여 검증자주체가 원래의 검증가능한 크리덴셜보유자에게 제공했음을 검증할 수 있도록 한다.

{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://www.w3.org/2018/credentials/examples/v1"
  ],
  "id": "https://example.com/VP/0987654321",
  "type": ["VerifiablePresentation"],
  "verifiableCredential": [
    {
     "@context": [
       "https://www.w3.org/2018/credentials/v1",
       "https://www.w3.org/2018/credentials/examples/v1"
      ],
      "id": "http://pharma.example.com/credentials/3732",
      "type": ["VerifiableCredential", "PrescriptionCredential"],
      "issuer": "https://pharma.example.com/issuer/4",
      "issuanceDate": "2010-01-01T19:23:24Z",
      "credentialSubject": {
        "id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
        "prescription": {....}
      },
      "credentialStatus": {
        "id": "https://pharma.example.com/credentials/status/3#94567",
        "type": "RevocationList2020Status",
        "revocationListIndex": "94567",
        "revocationListCredential": "https://pharma.example.com/credentials/status/3"
      },
      "proof": {....}
    },
    {
      "@context": [
        "https://www.w3.org/2018/credentials/v1",
        "https://www.w3.org/2018/credentials/examples/v1"
      ],
      "id": "https://example.com/VC/123456789",
      "type": ["VerifiableCredential", "PrescriptionCredential"],
      "issuer": "did:example:ebfeb1f712ebc6f1c276e12ec21",
      "issuanceDate": "2010-01-03T19:53:24Z",
      "credentialSubject": {
        "id": "did:example:76e12ec21ebhyu1f712ebc6f1z2",
        "prescription": {....}
      },
      "proof": {
        "type": "RsaSignature2018",
        "created": "2018-06-17T10:03:48Z",
        "proofPurpose": "assertionMethod",
        "jws": "pYw8XNi1..Cky6Ed=",
        "verificationMethod": "did:example:ebfeb1f712ebc6f1c276e12ec21/keys/234"
      }
    }
  ],
  "proof": [{
    "type": "RsaSignature2018",
    "created": "2018-06-18T21:19:10Z",
    "proofPurpose": "authentication",
    "verificationMethod": "did:example:76e12ec21ebhyu1f712ebc6f1z2/keys/2",
    "challenge": "c0ae1c8e-c7e7-469f-b252-86e6a0e7387e",
    "jws": "BavEll0/I1..W3JT24="
  }]
}
      

위의 예시에서, 환자(원래의 주체)는 처방전(원래의 검증가능한 크리덴셜)을 친구에게 전달하고, 친구에게 새로운 검증가능한 크리덴셜을 발급했는데, 이 크리덴셜에서 친구가 주체이고, 원래 검증가능한 크리덴셜주체발급자이며, 크리덴셜은 원래 처방전의 사본이다.

발급자가 보유자에게 권한을 부여하는 경우

발급자보유자가 아닌 주체를 설명하는 크리덴셜을 소유하도록 보유자에게 권한을 부여하고자 하고, 보유자주체와 알려진 관계가 없는 경우, 발급자주체크리덴셜발급자 자신과 보유자의 관계를 삽입할 수 있다.

검증가능한 크리덴셜은 권한 부여 프레임워크가 아니므로 위임은 이 규격의 범위를 벗어난다. 그러나 검증가능한 크리덴셜이 권한 부여 및 위임 시스템을 구축하는 데 사용될 가능성이 있다는 점은 이해하고 있다. 다음은 일부 사용 사례에 적합할 수 있는 한 가지 접근 방식이다.


{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://www.w3.org/2018/credentials/examples/v1"
  ],
  "id": "http://example.edu/credentials/3732",
  "type": ["VerifiableCredential", "NameAndAddress"],
  "issuer": "https://example.edu/issuers/14",
  "holder": {
    "type": "LawEnforcement",
    "id": "did:example:ebfeb1276e12ec21f712ebc6f1c"
  },
  "issuanceDate": "2010-01-01T19:23:24Z",
  "credentialSubject": {
    "id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
    "name": "Mr John Doe",
    "address": "10 Some Street, Anytown, ThisLocal, Country X"
  },
  "proof": {
    "type": "RsaSignature2018",
    "created": "2018-06-17T10:03:48Z",
    "proofPurpose": "assertionMethod",
    "verificationMethod": "https://example.edu/issuers/14/keys/234",
    "jws": "pY9...Cky6Ed = "
  }
}
        

보유자가 검증자를 대신하여 행동하거나, 주체, 발급자 또는 검증자와 관계가 없는 경우

검증가능한 크리덴셜 데이터 모델은 현재 이러한 시나리오를 지원하지 않는다. 이들이 어떻게 지원될 수 있는지에 대해서는 추가 연구가 필요하다.

IANA Considerations

This section will be submitted to the Internet Engineering Steering Group (IESG) for review, approval, and registration with IANA in the "JSON Web Token Claims Registry".

Revision History

This section contains the substantive changes that have been made since the publication of v1.0 of this specification as a W3C Recommendation.

Changes since the Recommendation :

Acknowledgements

The Working Group thanks the following individuals not only for their contributions toward the content of this document, but also for yeoman's work in this standards community that drove changes, discussion, and consensus among a sea of varied opinions: Matt Stone, Gregg Kellogg, Ted Thibodeau Jr, Oliver Terbu, Joe Andrieu, David I. Lehn, Matthew Collier, and Adrian Gropper.

Work on this specification has been supported by the Rebooting the Web of Trust community facilitated by Christopher Allen, Shannon Appelcline, Kiara Robles, Brian Weller, Betty Dhamers, Kaliya Young, Manu Sporny, Drummond Reed, Joe Andrieu, Heather Vescent, Kim Hamilton Duffy, Samantha Chase, and Andrew Hughes. The participants in the Internet Identity Workshop, facilitated by Phil Windley, Kaliya Young, Doc Searls, and Heidi Nobantu Saul, also supported the refinement of this work through numerous working sessions designed to educate about, debate on, and improve this specification.

The Working Group also thanks our Chairs, Dan Burnett, Matt Stone, Brent Zundel, and Wayne Chang, as well as our W3C Staff Contacts, Kazuyuki Ashimura and Ivan Herman, for their expert management and steady guidance of the group through the W3C standardization process.

Portions of the work on this specification have been funded by the United States Department of Homeland Security's Science and Technology Directorate under contract HSHQDC-17-C-00019. The content of this specification does not necessarily reflect the position or the policy of the U.S. Government and no official endorsement should be inferred.

The Working Group would like to thank the following individuals for reviewing and providing feedback on the specification (in alphabetical order):

Christopher Allen, David Ammouial, Joe Andrieu, Bohdan Andriyiv, Ganesh Annan, Kazuyuki Ashimura, Tim Bouma, Pelle Braendgaard, Dan Brickley, Allen Brown, Jeff Burdges, Daniel Burnett, ckennedy422, David Chadwick, Chaoxinhu, Kim (Hamilton) Duffy, Lautaro Dragan, enuoCM, Ken Ebert, Eric Elliott, William Entriken, David Ezell, Nathan George, Reto Gmür, Ryan Grant, glauserr, Adrian Gropper, Joel Gustafson, Amy Guy, Lovesh Harchandani, Daniel Hardman, Dominique Hazael-Massieux, Jonathan Holt, David Hyland-Wood, Iso5786, Renato Iannella, Richard Ishida, Ian Jacobs, Anil John, Tom Jones, Rieks Joosten, Gregg Kellogg, Kevin, Eric Korb, David I. Lehn, Michael Lodder, Dave Longley, Christian Lundkvist, Jim Masloski, Pat McBennett, Adam C. Migus, Liam Missin, Alexander Mühle, Anthony Nadalin, Clare Nelson, Mircea Nistor, Grant Noble, Darrell O'Donnell, Nate Otto, Matt Peterson, Addison Phillips, Eric Prud'hommeaux, Liam Quin, Rajesh Rathnam, Drummond Reed, Yancy Ribbens, Justin Richer, Evstifeev Roman, RorschachRev, Steven Rowat, Pete Rowley, Markus Sabadello, Kristijan Sedlak, Tzviya Seigman, Reza Soltani, Manu Sporny, Orie Steele, Matt Stone, Oliver Terbu, Ted Thibodeau Jr, John Tibbetts, Mike Varley, Richard Varn, Heather Vescent, Christopher Lemmer Webber, Benjamin Young, Kaliya Young, Dmitri Zagidulin, and Brent Zundel.