검증 가능한 자격 증명 렌더링 방법 v1.0

W3C 작업 초안

이 문서에 대한 자세한 정보
이 버전:
https://www.w3.org/TR/2026/WD-vc-render-method-20260405/
최신 공개 버전:
https://www.w3.org/TR/vc-render-method/
최신 편집자 초안:
https://w3c.github.io/vc-render-method/
이력:
https://www.w3.org/standards/history/vc-render-method/
커밋 이력
편집자:
Dmitri Zagidulin (MIT 디지털 자격 증명 컨소시엄)
Manu Sporny (Digital Bazaar)
Patrick St. Louis (Open Security and Identity)
Hendry POH (싱가포르 정보통신미디어개발청)
Isaac KOH (싱가포르 정보통신미디어개발청)
저자:
Manu Sporny (Digital Bazaar)
Dmitri Zagidulin (MIT 디지털 자격 증명 컨소시엄)
Calvin Cheng (싱가포르 정부기술청)
Kyle Huang Junyuan (싱가포르 정부기술청)
Patrick St. Louis (Open Security and Identity)
피드백:
GitHub w3c/vc-render-method (풀 요청, 새 이슈, 열린 이슈)

초록

이 명세는 시각, 청각 또는 촉각 매체를 통해 검증 가능한 자격 증명을 표현하는 데 사용할 수 있는 검증 가능한 자격 증명 데이터 모델의 확장 메커니즘을 설명합니다. 이는 검증 가능한 자격 증명을 물리적 문서, 디지털 이미지, 스크린 리더 또는 점자 출력으로 렌더링하는 것을 다룹니다.

이 문서의 상태

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

이것은 실험적 명세이며 정기적으로 개정되고 있습니다. 이는 프로덕션 배포에 적합하지 않습니다.

이 문서는 검증 가능한 자격 증명 작업 그룹권고안 트랙을 사용하여 작업 초안으로 발행했습니다.

작업 초안으로 발행되었다고 해서 W3C 및 그 회원의 승인을 의미하지는 않습니다.

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

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

이 문서는 2025년 8월 18일 W3C 프로세스 문서의 적용을 받습니다.

1. 소개

렌더링 방법은 발행자가 시각, 청각 또는 촉각 메커니즘을 통해 관찰자에게 검증 가능한 자격 증명을 표현하려는 특정 방식이 있을 때 사용할 수 있습니다. 예를 들어, 직원 배지 자격 증명의 발행자는 회사 로고의 풍부한 이미지와 배지의 특정 영역에 직원 정보를 특정 방식으로 배치하는 내용을 포함하고자 할 수 있습니다. 또한 시력과 관련된 접근성 요구가 있는 개인을 위해 배지의 중요한 측면을 음성으로 읽어 주는 기능을 제공하고자 할 수도 있습니다.

1.1 용어

다음 용어는 이 명세의 개념을 설명하는 데 사용됩니다.

클레임
주체에 대해 이루어진 주장입니다.
자격 증명
발행자가 만든 하나 이상의 클레임 집합입니다. 자격 증명 안의 클레임은 서로 다른 주체에 관한 것일 수 있습니다.

이 문서의 자격 증명 정의는 NIST의 자격 증명 정의와 다릅니다.

데이터 최소화
작업이나 목표를 성공적으로 달성하는 데 필요한 최소한의 양으로 공유 데이터를 엄격히 제한하는 행위입니다.
분산 식별자
DID라고도 하며, 엔터티와 연결된 이동 가능한 URL 기반 식별자입니다. 이러한 식별자는 검증 가능한 자격 증명에서 가장 자주 사용되며, 주체와 연결됩니다. 따라서 검증 가능한 자격 증명 자체를 자격 증명 저장소 간에 쉽게 이동할 수 있으며, 이때 자격 증명을 다시 발행할 필요가 없습니다. DID의 예는 did:example:123456abcdef입니다.
분산 식별자 문서
DID 문서라고도 하며, 이는 검증 가능한 데이터 레지스트리를 사용하여 접근할 수 있는 문서로, 관련 자격 증명 저장소 및 공개 키 정보와 같은, 특정 분산 식별자와 관련된 정보를 포함합니다.
기본 그래프
명명된 그래프의 일부로 명시적으로 포함되지 않은 모든 클레임을 포함하는 그래프입니다.
파생 술어
검증 가능한 자격 증명 안의 다른 속성 값에 대한 검증 가능한 불리언 주장입니다. 이는 정보 공개를 제한할 수 있기 때문에, 영지식 증명 방식의 검증 가능한 프레젠테이션에서 유용합니다. 예를 들어, 검증 가능한 자격 증명이 센티미터 단위의 특정 키를 표현하는 속성을 포함하는 경우, 파생 술어는 검증 가능한 자격 증명 안의 키 속성을 참조하여 발행자가 특정 키 값을 실제로 공개하지 않고도 키 값이 최소 키 요건을 충족한다는 점을 증명할 수 있습니다. 예를 들어, 주체가 150센티미터보다 크다는 것입니다.
디지털 서명
디지털 메시지의 진정성을 입증하기 위한 수학적 방식입니다.
엔터티
진술에서 추상 명사 또는 구체 명사로 참조될 수 있는 모든 것입니다. 엔터티에는 사람, 조직, 물리적 사물, 문서, 추상 개념, 허구의 등장인물 및 임의의 텍스트가 포함되지만 이에 국한되지는 않습니다. 어떤 엔터티든 수행할 능력이 있다면 생태계에서 역할을 수행할 수 있습니다. 다만 일부 엔터티는 본질적으로 행동을 수행할 수 없습니다. 예를 들어 문자열 "abc"는 자격 증명을 발행할 수 없습니다.
그래프
주체와 그들이 다른 주체 또는 데이터와 갖는 관계로 구성된 정보 네트워크를 형성하는 클레임 집합입니다. 각 클레임은 그래프의 일부입니다. 이는 명명된 그래프의 경우 명시적이며, 기본 그래프의 경우 암시적입니다.
보유자
하나 이상의 검증 가능한 자격 증명을 소유하고, 그것들로부터 검증 가능한 프레젠테이션을 생성함으로써 엔터티가 수행할 수 있는 역할입니다. 보유자는 종종, 그러나 항상 그런 것은 아니지만, 자신이 보유한 검증 가능한 자격 증명주체입니다. 보유자는 자신의 자격 증명자격 증명 저장소에 저장합니다.
신원
여러 맥락에 걸쳐 엔터티를 추적하기 위한 수단입니다. 디지털 신원은 일반적으로 식별자와 속성을 사용하여 디지털 맥락 전반에서 엔터티 상호작용의 추적 및 맞춤화를 가능하게 합니다. 의도하지 않은 신원 정보의 배포나 사용은 개인정보 보호를 침해할 수 있습니다. 그러한 정보의 수집과 사용은 데이터 최소화 원칙을 따라야 합니다.
신원 제공자
때때로 IdP로 축약되는 신원 제공자는, 연합 또는 분산 네트워크 내의 의존 당사자 애플리케이션에 인증 서비스를 제공하면서 보유자를 위한 신원 정보를 생성, 유지 및 관리하는 시스템입니다. 이 경우 보유자는 항상 주체입니다. 검증 가능한 자격 증명이 무기명 자격 증명인 경우에도, 검증 가능한 자격 증명주체에게 남아 있다고 가정하며, 그렇지 않은 경우 공격자에게 도난당한 것으로 간주합니다. 이 명세는 이 문서의 개념을 다른 명세와 비교하거나 매핑하는 경우를 제외하고는 이 용어를 사용하지 않습니다. 이 명세는 신원 제공자 개념을 두 개의 별개 개념, 즉 발행자보유자로 분리합니다.
발행자
하나 이상의 주체에 관한 클레임을 주장하고, 이러한 클레임으로부터 검증 가능한 자격 증명을 생성한 뒤, 그 검증 가능한 자격 증명보유자에게 전송함으로써 엔터티가 수행할 수 있는 역할입니다.
명명된 그래프
verifiableCredential와 같은 특정 속성과 연결된 그래프입니다. 이러한 속성은 해당 JSON 객체에 정의된 모든 클레임을 포함하는 별도의 그래프를 생성합니다.
프레젠테이션
하나 이상의 검증 가능한 자격 증명에서 파생되고, 하나 이상의 발행자가 발행했으며, 특정 검증자와 공유되는 데이터입니다.
자격 증명 저장소
저장 금고나 개인 검증 가능한 자격 증명 지갑과 같은 프로그램으로, 보유자검증 가능한 자격 증명에 대한 접근을 저장하고 보호합니다.
선택적 공개
보유자가 어떤 정보를 공유할지 세밀하게 결정할 수 있는 능력입니다.
주체
클레임이 만들어지는 대상입니다.
사용자 에이전트
브라우저나 기타 웹 클라이언트와 같은 프로그램으로, 보유자, 발행자, 검증자 사이의 통신을 중개합니다.
검증 확인
특정 발행자클레임이 특정 사용에 대해 검증자의 비즈니스 요구사항을 충족한다는 보증입니다. 이 명세는 검증자가 검증 가능한 자격 증명검증 가능한 프레젠테이션을 검증하는 방법을 정의합니다.
또한 이 명세는 검증자검증 가능한 자격 증명에 의존하기 전에 그 안의 클레임을 검증 확인해야 한다고 명시합니다. 그러나 그러한 검증 확인의 수단은 매우 다양하며 이 명세의 범위를 벗어납니다. 검증자는 특정 클레임에 대해 특정 발행자를 신뢰하고, 어떤 자격 증명 안의 어떤 클레임이 자신의 시스템에서 사용하기에 적합한지 결정하기 위해 자체 규칙을 적용할 것으로 예상됩니다.
검증 가능한 자격 증명
검증 가능한 자격 증명은 저자성을 암호학적으로 검증할 수 있는 변조 증거성을 갖춘 자격 증명입니다. 검증 가능한 자격 증명은 검증 가능한 프레젠테이션을 만드는 데 사용할 수 있으며, 이러한 프레젠테이션 역시 암호학적으로 검증할 수 있습니다.
검증 가능한 데이터 레지스트리
식별자, 키 및 기타 관련 데이터의 생성과 검증을 중개함으로써 시스템이 수행할 수 있는 역할입니다. 여기에는 검증 가능한 자격 증명 스키마, 폐기 레지스트리, 발행자 공개 키 등 검증 가능한 자격 증명을 사용하는 데 필요할 수 있는 데이터가 포함됩니다. 일부 구성에서는 주체에 대한 상관 가능한 식별자가 필요할 수 있습니다. UUID 및 공개 키용 레지스트리와 같은 일부 레지스트리는 식별자를 위한 이름공간 역할만 할 수도 있습니다.
검증 가능한 프레젠테이션
검증 가능한 프레젠테이션은 암호학적 검증 과정을 거친 뒤 데이터의 저자성을 신뢰할 수 있도록 인코딩된 변조 증거성을 갖춘 프레젠테이션입니다. 특정 유형의 검증 가능한 프레젠테이션은 원본 검증 가능한 자격 증명에서 합성되었지만 원본 자체는 포함하지 않는 데이터를 포함할 수 있습니다 (예: 영지식 증명).
검증
검증 가능한 자격 증명 또는 검증 가능한 프레젠테이션이 각각 발행자 또는 제시자의 진정하고 최신인 진술인지 평가하는 것입니다. 여기에는 다음 사항을 확인하는 것이 포함됩니다. 자격 증명(또는 프레젠테이션)이 명세에 부합하는지, 증명 방법이 충족되는지, 그리고 존재하는 경우 상태 확인이 성공하는지입니다. 자격 증명의 검증은 그 자격 증명에 인코딩된 클레임의 진실성 평가를 의미하지 않습니다.
검증자
처리를 위해 하나 이상의 검증 가능한 자격 증명을, 선택적으로 검증 가능한 프레젠테이션 안에 포함된 형태로 수신함으로써 엔터티가 수행하는 역할입니다. 다른 명세에서는 이 개념을 의존 당사자라고 부를 수 있습니다.
검증 자료
암호학적 공개 키이거나 증명을 검증하는 데 사용되는 기타 데이터일 수 있는 정보입니다.
URL
[URL]에 정의된 Uniform Resource Locator입니다. URL은 역참조될 수 있으며, 그 결과 문서와 같은 리소스가 반환될 수 있습니다. URL을 역참조하거나 가져오는 규칙은 URL 스킴에 의해 정의됩니다. 이 명세는 URI 또는 IRI라는 용어를 사용하지 않습니다. 이러한 용어는 웹 개발자에게 혼란스럽다고 여겨졌기 때문입니다.

1.2 적합성

비규범으로 표시된 절뿐 아니라, 이 명세의 모든 작성 지침, 도표, 예제 및 참고 사항은 비규범입니다. 이 명세의 그 밖의 모든 내용은 규범입니다.

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

적합한 렌더 방법은 이 명세의 규범적 문장을 준수하는 데이터 모델의 구체적 표현입니다. 구체적으로, 이 문서의 2. 데이터 모델2.2.4.2 알고리즘 절에 있는 모든 관련 규범적 문장은 MUST 적용되어야 합니다.

적합한 처리기적합한 렌더 방법을 생성하거나 소비하는, 소프트웨어 및/또는 하드웨어로 실현된 모든 알고리즘입니다. 적합한 처리기는 부적합 문서가 소비될 때 오류를 생성해야 MUST 합니다.

이 문서에는 JSON 및 JSON-LD 콘텐츠를 포함하는 예제도 들어 있습니다. 이러한 예제 중 일부에는 인라인 주석(//)이나 예제에 거의 가치를 더하지 않는 정보를 나타내기 위한 생략 부호(...) 사용처럼 유효하지 않은 JSON 문자가 포함되어 있습니다. 구현자는 이 정보를 유효한 JSON 또는 JSON-LD로 사용하려는 경우 이러한 콘텐츠를 제거해야 함에 유의해야 합니다.

2. 데이터 모델

다음 절에서는 이 명세가 렌더링 방법에 사용하는 데이터 모델을 개괄합니다.

2.1 renderMethod 속성

renderMethod 속성은 검증 가능한 자격 증명 데이터 모델 명세 [VC-DATA-MODEL-2.0]의 예약된 확장 지점입니다. 발행자는 이 속성을 검증 가능한 자격 증명에서 사용하여 하나 이상의 선호 렌더링 방법을 표현할 수 있습니다.

renderMethod
renderMethod 속성의 값은 소프트웨어가 시각, 청각 또는 촉각 메커니즘을 사용하여 검증 가능한 자격 증명을 표현하는 데 사용할 수 있는 하나 이상의 렌더링 방법을 지정해야 MUST 합니다. 각 renderMethod 값은 예를 들어 TemplateRenderMethod와 같이 자신의 type을 지정해야 MUST 합니다. 각 렌더링 힌트의 정확한 내용은 특정 renderMethod type 정의에 의해 결정됩니다.

2.2 TemplateRenderMethod

발행자검증 가능한 자격 증명에 대한 템플릿 기반 렌더링 지침을 지정하려는 경우, 아래에 설명된 데이터 모델을 사용하는 renderMethod 속성을 추가할 수 MAY 있습니다.

속성 설명
id URL 표준을 따르며, 가져올 때 렌더 템플릿으로 역참조되는 OPTIONAL 문자열입니다.
type 값이 TemplateRenderMethod여야 MUST 하는 REQUIRED 문자열입니다.
renderSuite 구체적인 렌더링을 생성하는 데 사용되는 알고리즘을 식별하는 REQUIRED 문자열입니다.
name 수행될 렌더링 유형에 대한 힌트를 제공하기 위해 표시될 수 있는 사람이 읽을 수 있는 OPTIONAL 문자열입니다. 이 속성은 개인이 여러 프레젠테이션 모드 중에서 선택할 수 있도록 하는 그래픽 인터페이스에서 사용될 수 있습니다.
description 특정 렌더링이 언제 유용할 수 있는지에 대해 name보다 더 상세한 설명을 제공하는 사람이 읽을 수 있는 OPTIONAL 문자열입니다.
renderProperty 이 특정 렌더 방법을 사용할 때 검증 가능한 자격 증명에서 어떤 속성이 노출되는지를 지정하는, JavaScript Object Notation (JSON) Pointer 구문을 각각 따르는 문자열 값의 OPTIONAL 목록입니다. renderProperty가 제공되지 않으면 렌더 방법이 사용될 때 전체 검증 가능한 자격 증명이 공유되는 것으로 간주됩니다.
template 렌더링을 수행하는 데 사용될 템플릿을 제공하거나 참조하는 OPTIONAL URL 또는 입니다. 값이 URL인 경우, 템플릿 코드를 포함하는 data: URL [RFC2397]일 수 MAY 있습니다. 값이 인 경우, 다음 규칙을 따라야 MUST 합니다.
속성 설명
id URL 표준을 따르며, 가져올 때 SVG 또는 PDF 파일과 같은 템플릿으로 역참조되는 REQUIRED 문자열입니다.
mediaType 미디어 유형 명세 및 등록 절차에 지정된 대로 id 값의 미디어 유형을 식별하는 RECOMMENDED 문자열입니다.
digestMultibase 템플릿 파일의 multibase 인코딩 Multihash인 OPTIONAL 값입니다. multibase 값은 u(base64url-nopad)여야 MUST 하며, multihash 값은 256비트 출력(0x12)을 갖는 SHA-2여야 MUST 합니다.
digestMultibase id가 지정된 경우 참조된 렌더 방법의 multibase 인코딩 Multihash인 OPTIONAL 값입니다. multibase 값은 u(base64url-nopad)여야 MUST 하며, multihash 값은 256비트 출력(0x12)을 갖는 SHA-2여야 MUST 합니다.

위에 표시된 데이터 모델은 아래 예제의 검증 가능한 자격 증명 안에 표현됩니다.

예제 1: 발행자가 render 속성을 사용하는 방식
{
  "@context": [
    "https://www.w3.org/ns/credentials/v2",
    "https://www.w3.org/ns/credentials/examples/v2",
    "https://w3id.org/vc/render-method/v1"
  ],
  "id": "http://example.edu/credentials/3732",
  "type": ["VerifiableCredential", "UniversityDegreeCredential"],
  "issuer": "https://example.edu/issuers/14",
  "validFrom": "2010-01-01T19:23:24Z",
  "credentialSubject": {
    "id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
    "degree": {
      "type": "BachelorDegree",
      "name": "Bachelor of Science and Arts"
    }
  },
  "renderMethod": {
    "type": "TemplateRenderMethod",
    "renderSuite": "svg-mustache",
    "template": {
      "id": "https://example.edu/credential-templates/BachelorDegree",
      "mediaType": "image/svg+xml",
      "digestMultibase": "zQmerWC85Wg6wFl9znFCwYxApG270iEu5h6JqWAPdhyxz2dR",
      "renderProperty": [
        "/issuer", "/validFrom", "/credentialSubject/degree/name"
      ]
    }
  }
  
}

위 예제에서 발행자renderProperty에 나열된 검증 가능한 자격 증명의 특정 정보로 채워질 학사 학위용 Mustache 기반 SVG 렌더링 템플릿을 제공했습니다.

2.2.1 svg-mustache 렌더 제품군

svg-mustache 렌더 제품군은 Mustache 템플릿 언어를 사용하여 SVG 파일을 수정하고, 이 파일은 이후 검증 가능한 자격 증명의 시각적 표현을 렌더링하는 데 사용됩니다.

아래 예제에서는 완전히 포함된 SVG 파일이 렌더링 템플릿으로 사용됩니다.

예제 2: svg-mustache 렌더 제품군의 기본 사용법
{
  ...
  "renderMethod": {
    "type": "TemplateRenderMethod",
    "renderSuite": "svg-mustache",
    // the SVG file is embedded in the VC
    "template": "data:image/svg+xml;base64,Qjei89...3jZpW"
  }
}

다음 예제는 웹의 SVG 파일에 연결하고 digestMultibase 속성을 사용하여 수정되지 않도록 보호합니다.

예제 3: SVG 렌더 템플릿을 위한 원격 호스팅 SVG 파일
{
...
"renderMethod": {
  "type": "TemplateRenderMethod",
  "renderSuite": "svg-mustache",
  "template": {
    // this SVG file is fetched from the Web
    "id": "https://degree.example/credential-templates/bachelors",
    "mediaType": "image/svg+xml",
    "digestMultibase": "zQmerWC85Wg6wFl9znFCwYxApG270iEu5h6JqWAPdhyxz2dR"
  }
}

다음 예제는 웹의 렌더링 템플릿에 연결하고 digestMultibase 속성을 사용하여 이를 보호합니다.

예제 4: 원격 호스팅 SVG 렌더 방법
{
...
"renderMethod": {
  // this render method is fetched from the Web
  "id": "https://degrees.example/bachelors-svg.jsonld",
  "mediaType": "application/ld+json",
  "type": "TemplateRenderMethod",
  "renderSuite": "svg-mustache",
  "digestMultibase": "zQmG270iEu5h6JqWAPdhyxz2dRerWC85Wg6wFl9znFCwYxAp"
}

2.2.2 pdf-mustache 렌더 제품군

pdf-mustache 렌더 제품군은 Mustache 템플릿 언어를 사용하여 PDF 파일을 수정하고, 이 파일은 이후 검증 가능한 자격 증명의 시각적 표현을 렌더링하는 데 사용됩니다.

아래 예제에서는 완전히 포함된 PDF 파일이 렌더링 템플릿으로 사용됩니다.

예제 5: pdf-mustache 렌더 제품군의 기본 사용법
{
  ...
  "renderMethod": {
    "type": "TemplateRenderMethod",
    "renderSuite": "pdf-mustache",
    // this PDF file is embedded in the VC
    "template": "data:application/pdf;base64,k309SK...pwK83b"
  }
}

다음 예제는 웹의 PDF 파일에 연결하고 digestMultibase 속성을 사용하여 수정되지 않도록 보호합니다.

예제 6: PDF 렌더링 템플릿을 위한 원격 호스팅 PDF 파일
{
...
"renderMethod": {
  "type": "TemplateRenderMethod",
  "renderSuite": "pdf-mustache",
  "template": {
    // this PDF file is fetched from the Web
    "id": "https://degree.example/bachelors.pdf",
    "mediaType": "application/pdf",
    "digestMultibase": "zQmznFCwYxApG270iEu5h6JqWAPdhyxz2dRerWC85Wg6wFl9"
  }
}

다음 예제는 웹의 렌더링 템플릿에 연결하고 digestMultibase 속성을 사용하여 이를 보호합니다.

예제 7: 원격 호스팅 PDF 렌더링 템플릿
{
...
"renderMethod": {
  // this render method is fetched from the Web
  "id": "https://degrees.example/bachelors-pdf.jsonld",
  "type": "TemplateRenderMethod",
  "renderSuite": "pdf-mustache",
  "digestMultibase": "zQmEu5h6JqWAPdhyxmz2dRerWC85Wg6wFl9znFCwYxApG270"
}

2.2.3 nfc 렌더 제품군

nfc 렌더 제품군은 검증 가능한 자격 증명을 나타내는 이진 페이로드를 무선 NFC 연결을 통해 전송합니다.

아래 예제에서는 자격 증명과 연결된 바코드 식별자만 공개하는, 완전히 포함된 NFC 페이로드가 렌더링 템플릿으로 사용됩니다.

예제 8: nfc 렌더 제품군의 사용법
{
  ...
  "renderMethod": {
    "type": "TemplateRenderMethod",
    "renderSuite": "nfc",
    "name": "Tap to send",
    // the NFC payload is embedded
    "template": "data:application/octet-stream;base64,2QZkpQGDG...G8XJWnROcY4Biw",
    // only the barcode is transmitted over NFC
    "renderProperty": ["/credentialSubject/barcode"]
  }
  ...
}

2.2.4 html 렌더 제품군

html 렌더 제품군은 템플릿 작성자가 검증 가능한 자격 증명을 렌더링하기 위한 HTML 템플릿을 제공할 수 있게 합니다. HTML은 template 또는 template.id(template 값이 객체인 경우)의 값으로 원격에서 참조되거나 data: URL을 통해 참조될 수 있습니다. HTML 조각 내의 JavaScript는 HTML 템플릿과 함께 샌드박스 처리된 iframe에 호스팅된 HTML 데이터 블록 (즉 <script type="application/vc"></script>)을 통해 제공되는 필터링된 검증 가능한 자격 증명 데이터를 렌더링하는 역할을 합니다.

예제 9: HTML 렌더 제품군을 사용하는 VC 예제
{
  "@context": [
    "https://www.w3.org/ns/credentials/v2",
    "https://www.w3.org/ns/credentials/examples/v2"
  ],
  "type": [
    "VerifiableCredential",
    "NameCredential"
  ],
  "issuer": {
    "id": "did:example:1234",
    "name": "The Issuer"
  },
  "credentialSubject": {
    "name": "Example Name",
    "notRendered": "should not appear"
  },
  "renderMethod": {
    "type": "TemplateRenderMethod",
    "renderSuite": "html",
    "renderProperty": [
      "/issuer/name",
      "/credentialSubject/name"
    ],
    "template": {
      "id": "https://test.example/credential-templates/NameCredential.html",
      "mediaType": "text/html",
      "digestMultibase": "zQmerWC85Wg6wFl9znFCwYxApG270iEu5h6JqWAPdhyxz2dR"
    },
    "outputPreference": {
      "mode": [
        "visual"
      ],
      "mediaType": "application/html",
      "style": {
        "width": "800px",
        "height": "800px"
      }
    }
  }
}

구현은 필터링된 검증 가능한 자격 증명 데이터를 사용하여 JavaScript가 HTML 템플릿을 안전하게 렌더링할 수 있는 환경을 제공해야 MUST 합니다. 이 환경을 설명하기 위해 다음 용어가 사용됩니다.

호스트 페이지
HTML 템플릿을 렌더링하기 위한 보안 환경을 제공합니다.
템플릿 코드
렌더 방법 내에서 제공되거나 원격으로 참조되는 HTML 조각입니다.
래퍼 코드
추가 보안 제한과 호스트 페이지와의 통신을 제공하기 위해 HTML 템플릿을 감싸는 코드입니다.

최소한 환경은 추적 및 기타 개인정보 보호 침해를 방지하기 위해 탐색, 외부 콘텐츠 로드, 호스트 페이지 접근을 방지해야 MUST 합니다.

예를 들어 브라우저 기반 구현은 호스트 페이지에 대한 Content Security Policy [CSP3] 제한, HTML 템플릿을 호스팅하는 iframe의 샌드박스 처리, 그리고 추가 CSP 제한을 추가하고 호스트 페이지와 준비 및 오류 이벤트 통신을 제공하기 위해 HTML 템플릿을 감싸는 래퍼 코드를 조합하여 이러한 환경을 제공할 수 있습니다.

그림 1 호스트 페이지와 iframe + 래퍼 코드 간의 통신
2.2.4.1 호스트 페이지

호스트 페이지(일반적으로 지갑 또는 검증 가능한 자격 증명 렌더러)는 HTML 템플릿이 최상위 탐색 컨텍스트를 탐색하거나, 외부 콘텐츠에 접근하거나, 호스트 페이지에 접근하거나, 원격 콘텐츠를 로드하는 것을 방지해야 MUST 합니다.

호스트 페이지가 사용되는 경우 다음 규칙이 적용됩니다.

  • Content Security Policy(CSP) 제한에는 frame-src 'none'가 포함되어야 MUST 합니다. 이는 iframe에 대해 src 대신 srcdoc 사용을 강제하며, 브라우저가 HTML 템플릿을 로드하는 것을 방지합니다. 결과적으로 호스트 페이지 코드는 원격으로 참조된 템플릿 코드를 미리 로드하고, 템플릿을 래퍼 코드에 주입하기 전에 관련 digestMultibase 값과 응답을 확인해야 합니다.
  • HTML 템플릿을 호스팅하는 iframe에는 탐색 및 최상위 접근을 방지하기 위해 sandbox="allow-scripts"가 설정되어야 MUST 합니다.
예제 10: 최소 호스트 페이지
<html>
  <head>
    <meta http-equiv="content-security-policy" content="frame-src 'none'">
  </head>
  <body>
    <iframe id="renderer" sandbox="allow-scripts allow-modals" srcdoc=""></iframe>
  </body>
</html>
2.2.4.1.1 템플릿 코드

renderMethodtemplate 속성이 참조하는 HTML 템플릿 코드검증 가능한 자격 증명을 렌더링하는 데 필요한 HTML, CSS 및 JavaScript를 포함하는 HTML 조각이어야 MUST 합니다. 템플릿 코드<html>, <head> 또는 <body> 태그를 포함해서는 안 됩니다 MUST NOT. 이러한 태그는 래퍼 코드가 제공하기 때문입니다.

예제 11: HTML 템플릿 조각 예제
<div>
  <script>
    document.addEventListener('DOMContentLoaded', (event) => {
      console.log('running template render script');

      // display credential as JSON as an example renderer; anything
      // could be done here instead, including mustache/other-style
      // template processing to generate the HTML for display

      // FIXME: determine best name/location for the datablock/script tag
      const credential = JSON.parse(document.querySelector(
        'head > script[name="credential"]').innerHTML);

      document.querySelector('#credentialSubject-name').innerText =
        credential.credentialSubject.name;
      document.querySelector('#issuer-name').innerText =
        credential.issuer.name;

      // TBD: signal to host that rendering is complete
      window.renderMethodReady();
    });
  </script>
  <style>
    h1 {
      color: blue;
    }
  </style>

  <h1 id="credentialSubject-name"></h1>
  <p>Issued by: <span id="issuer-name"></span></p>
</div>
2.2.4.1.2 래퍼 코드

템플릿 HTML 조각은 부분 검증 가능한 자격 증명을 포함하는 데이터 블록을 제공하고, 탐색과 외부 콘텐츠 로드를 방지하기 위한 추가 CSP 정책을 추가하는 래퍼 코드로 감싸져야 MUST 합니다. 구체적으로, 래퍼 코드템플릿 코드가 네트워크 요청을 수행하는 것을 방지하기 위해 default-src data: 'unsafe-inline'의 CSP 제한을 추가해야 MUST 합니다.

예제 12: iframe[srcdoc] 안에서 템플릿과 자격 증명을 감싸는 래퍼 코드
<html>
  <head>
    <meta http-equiv="content-security-policy" content="default-src data: 'unsafe-inline'">
    <script name="credential" type="application/vc">${JSON.stringify(credential)}</script>
  </head>
  <body>${template}</body>
</html>

설정을 완료하려면 호스트 페이지래퍼 코드(검증 가능한 자격 증명템플릿 코드가 채워진 후)를 iframe의 srcdoc 속성에 주입해야 MUST 하며, 이를 통해 래퍼 코드템플릿 코드에 포함된 JavaScript가 실행됩니다.

예제 13: 템플릿과 자격 증명이 포함된 결합 래퍼 코드
<html>
  <head>
    <meta http-equiv="content-security-policy" content="default-src 'none' data: 'unsafe-inline'">

<!-- The credential data block injected into the Wrapper Code. -->
<script name="credential" type="application/vc">{
  "@context": [
    "https://www.w3.org/ns/credentials/v2",
    "https://www.w3.org/ns/credentials/examples/v2"
  ],
  "type": [
    "VerifiableCredential",
    "NameCredential"
  ],
  "issuer": {
    "id": "did:example:1234",
    "name": "The Issuer"
  },
  "credentialSubject": {
    "name": "Example Name"
  }
}</script>
<!-- End credential data block -->

</head>
<body>

<!-- The template HTML injected into the Wrapper Code. -->
<div>
  <script>
    console.log('running template render script');

    // display credential as JSON as an example renderer; anything
    // could be done here instead, including mustache/other-style
    // template processing to generate the HTML for display

    // FIXME: determine best name/location for the datablock/script tag
    const credential = JSON.parse(document.querySelector(
      'head > script[name="credential"]').innerHTML);

    document.querySelector('#credentialSubject-name').innerText =
      credential.credentialSubject.name;
    document.querySelector('#issuer-name').innerText =
      credential.issuer.name;

    // TBD: signal to host that rendering is complete
    window.renderMethodReady()
  </script>
  <style>
    h1 {
      color: blue;
    }
  </style>

  <h1 id="credentialSubject-name"></h1>
  <p>Issued by: <span id="issuer-name"></span></p>
</div>
<!-- End template HTML -->

  </body>
</html>
2.2.4.1.3 준비 및 오류 이벤트

래퍼 코드에서 생성된 iframe은 렌더링이 완료되었거나 렌더링 중 오류가 발생했을 때 템플릿이 호스트 페이지에 알릴 수 있도록 통신 채널을 제공해야 MUST 합니다. 이는 래퍼 코드가 설정한 MessageChannel과 함께 postMessage API를 사용하여 수행할 수 있습니다.

아래에 표시된 JavaScript는 iframe에 onload 이벤트를 추가하여 MessageChannel을 설정하기 위해 위의 호스트 페이지에 추가됩니다. 호스트 페이지는 또한 래퍼 코드로부터 ready 메시지를 받으면 해결되고, error 메시지를 받으면 거부되는 Promise를 생성합니다. 래퍼 코드는 또한 템플릿이 렌더링 완료를 호스트 페이지에 알리거나 오류 메시지를 되돌려 보내는 데 사용할 수 있는 window.renderMethodReady 메서드를 제공합니다.

예제 14: MessageChannel을 설정하기 위한 호스트 페이지 추가 사항
// a promise that resolves when the rendering is ready (or rejects if it
// fails); can be used to show the display or an error instead
let resolveRender;
let rejectRender;
const readyPromise = new Promise((resolve, reject) => {
  resolveRender = resolve;
  rejectRender = reject;
});

// Setup communication channel for use by the template code in the iframe
renderer.onload = () => {
  // create a MessageChannel; transfer one port to the iframe
  const channel = new MessageChannel();
  // start message queue so messages won't be lost while iframe loads
  channel.port1.start();
  // handle `ready` message
  channel.port1.onmessage = function ready(event) {
    if(event.data === 'ready') {
      // unhide the iframe because it's ready
      resolveRender();
    } else {
      rejectRender(new Error(event.data?.error?.message));
    }
    channel.port1.onmessage = undefined;
  };
  // send "start" message; send `port2` to iframe for return communication
  renderer.contentWindow.postMessage('start', '*', [channel.port2]);
};

// setup event responses to ready or error
// NOTE: this section is idiosyncratic to the Wallet/Renderer's UX needs
readyPromise.then(() => {
  console.log('rendering ready');
  const renderer = document.getElementById('renderer');
  renderer.hidden = false;
}).catch(err => {
  const errorMessage = document.getElementById('error-message');
  errorMessage.style.display = 'block';
  errorMessage.innerText = 'Rendering failed: ' + err.message;
  console.error('rendering failed', err);
});
예제 15: MessageChannel을 연결하고 `renderMethodReady`를 생성하기 위한 래퍼 코드 추가 사항
// add promise that will resolve to the communication port from
// the parent window
const portPromise = new Promise(resolve => {
  window.addEventListener('message', function start(event) {
    if(event.data === 'start' && event.ports?.[0]) {
      window.removeEventListener('message', start);
      resolve(event.ports[0]);
    }
  });
});

// attach a function to the window for the template to call when
// it's "ready" (or that an error occurred) that will send a message
// to the parent so the parent can decide whether to show the iframe
window.renderMethodReady = function(err) {
  portPromise.then(port => port.postMessage(
    !err ? 'ready' : {error: {message: err.message}}));
};

이 설정을 사용하면 템플릿 JavaScript는 window.renderMethodReady()를 호출하여 렌더링이 완료되었음을 호스트 페이지에 알리거나, window.renderMethodReady(new Error("error message"))를 호출하여 오류를 호스트 페이지에 알릴 수 있습니다.

2.2.4.2 알고리즘

다음 절에서는 html 렌더 제품군이 HTML 템플릿을 안전하게 렌더링하는 데 사용하는 알고리즘을 개괄합니다. 보안 및 개인정보 보호 결과와 출력이 동일하다면 대체 알고리즘을 사용할 수 MAY 있습니다.

2.2.4.2.1 호스트 페이지

호스트 페이지는 HTML 템플릿을 호스팅하기 위해 iframe 요소를 생성해야 MUST 합니다. 호스트 페이지는 탐색 및 최상위 접근을 방지하기 위해 iframesandbox 속성을 allow-scripts로 설정해야 MUST 합니다.

  1. vc를 렌더링할 검증 가능한 자격 증명이라고 합니다.
  2. renderMethodvc 안에서 선택된 renderMethod 속성이라고 하며, 여기서 renderMethod.typeTemplateRenderMethod이고 renderMethod.renderSuitehtml입니다.
  3. renderMethod.template문자열이면, templaterenderMethod.template의 값이라고 합니다.
  4. renderMethod.template이면, templaterenderMethod.template.id 안의 URL을 가져온 결과라고 합니다.

호스트 페이지renderMethod.renderProperty가 존재하는 경우, 검증 가능한 자격 증명 vcrenderMethod.renderProperty에 지정된 속성만 포함하도록 필터링해야 MUST 합니다. renderMethod.renderProperty가 없으면 전체 검증 가능한 자격 증명이 사용됩니다.

이 필터링은 renderMethod.renderProperty에 존재하는 JSON Pointer [RFC6901] 값에 Data Integrity ECDSA Cryptosuites v1.0 명세 [VC-DI-ECDSA]의 3.4.13절 selectJsonLd에 정의된 selectJsonLd 알고리즘을 적용하여 수행되어야 MUST 합니다.

호스트 페이지는 필터링된 검증 가능한 자격 증명과 HTML 템플릿을 위에서 정의한 래퍼 코드 템플릿에 포함하여 래퍼 코드를 생성해야 MUST 합니다.

  1. wrapperCode<head> 안에 <meta http-equiv="Content-Security-Policy" content="default-src data: 'unsafe-inline'">가 있는 HTML 문서라고 합니다.
  2. datablocktypeapplication/vc인 HTML 데이터 블록이라고 합니다.
  3. datablock의 내용을 문자열화된 JSON 형식의 필터링된 검증 가능한 자격 증명으로 설정합니다.
  4. datablockwrapperCode<head>에 삽입합니다.
  5. template의 값을 wrapperCode<body>에 삽입합니다.

호스트 페이지iframesrcdoc 속성을 결과 래퍼 코드로 설정해야 MUST 합니다.

  1. iframesrcdoc 속성을 wrapperCode의 문자열화된 HTML로 설정합니다.

호스트 페이지는 위에서 설명한 대로 readyerror 메시지를 수신하기 위해 래퍼 코드와 통신 채널을 설정해야 MUST 합니다.

  1. renderPromise를 다음과 같은 새 Promise라고 합니다.
    1. resolve 시 사용자에게 iframe을 표시하는 데 사용할 수 있습니다.
    2. reject 시 사용자에게 오류 메시지를 표시합니다.
  2. iframeonload 이벤트에서:
    1. channel을 새 MessageChannel이라고 합니다.
    2. wrapperCode를 통해 iframe에 주입된 template 안의 코드에서 오는 ready 메시지를 수신하는 새 port1 리스너를 channel에 생성하고 시작합니다.
    3. port1 리스너에서 ready 메시지를 받으면 renderPromise를 해결합니다. error 메시지를 받으면 오류 메시지와 함께 renderPromise를 거부합니다.
    4. postMessage를 사용하여 channelport2iframe 콘텐츠 창으로 보냅니다.

호스트 페이지는 렌더링이 완료되었는지 또는 렌더링 중 오류가 발생했는지 판단하기 위해 renderPromise를 사용하는 것이 좋습니다 SHOULD.

2.2.4.2.2 래퍼 코드

래퍼 코드MessageChannel을 통해 호스트 페이지로부터 통신을 수신하도록 설정하고, 템플릿 코드가 사용할 수 있도록 window.renderMethodReady 메서드를 제공해야 MUST 합니다.

  1. window.onload 이벤트에서...
    1. portmessage 이벤트를 통해 호스트 페이지로부터 받은 MessagePort라고 합니다.
    2. 다음과 같은 window.renderMethodReady 함수를 생성합니다.
      1. 인수 없이 호출되면 port를 통해 호스트 페이지ready 메시지를 보냅니다.
      2. Error 인수와 함께 호출되면 오류 메시지를 포함한 error 메시지를 port를 통해 호스트 페이지로 보냅니다.

2.3 EmbeddedRenderer

EmbeddedRenderer는 발행자가 검증 가능한 자격 증명을 렌더링하는 데 사용됩니다. 검증 가능한 자격 증명은 문서에서 참조되는 Template Renderer 웹사이트를 통해 포함된 <iframe> 안에서 HTML로 렌더링됩니다. 이 구성은 OpenAttestationMerkleProofSignature2018을 사용한 대화형 선택적 공개를 가능하게 합니다.

Template Renderer는 iframe에 포함된 웹 애플리케이션입니다. 이는 선택된 템플릿을 기반으로 검증 가능한 자격 증명을 렌더링하며, 렌더링 프로세스를 용이하게 하기 위해 Host 애플리케이션의 특정 메시지를 수신해야 합니다.

현재 다수의 EmbeddedRenderer 발행자와 embedded renderer 구현이 존재합니다.

발행자검증 가능한 자격 증명에 대한 포함형 렌더링 지침을 지정하려는 경우, 아래에 설명된 데이터 모델을 사용하는 renderMethod 속성을 추가할 수 MAY 있습니다.

속성 설명
id EmbeddedRenderer Action API를 구현하는 웹사이트를 찾는 URL입니다.
type type 속성은 EmbeddedRenderer여야 MUST 합니다.
renderName id로 지정된 웹사이트가 문서를 렌더링하는 데 사용하는 템플릿의 이름입니다. embedded renderer가 검증 가능한 자격 증명의 다른 HTML 보기를 표시하도록 다른 템플릿을 사용할 수 있습니다.

위에 표시된 데이터 모델은 아래 예제의 검증 가능한 자격 증명 안에 표현됩니다.

예제 16: 발행자가 renderMethod 속성을 사용하는 방식
  {
    "@context": [
      "https://www.w3.org/ns/credentials/v2",
      "https://w3id.org/security/data-integrity/v2",
      "https://trustvc.io/context/render-method-context-v2.json",
    ],
    "credentialSubject": {
     ...
    },
    "type": ["VerifiableCredential"],
    "issuer": "did:web:trustvc.github.io:did:1",
    "validFrom": "2024-04-01T12:19:52Z",
    "id": "urn:uuid:01992e54-cc5e-700e-a80b-60ddf0fffca9",
  },
  "renderMethod": [
      {
        "type": "EMBEDDED_RENDERER",
        "templateName": "DEMO_CERTIFICATE",
        "id": "https://generic-templates.tradetrust.io"
      }
  ]
}

검증 가능한 자격 증명DEMO_CERTIFICATE라는 템플릿을 사용하여 https://generic-templates.tradetrust.io의 embedded renderer를 지정합니다.

embedded renderer는 검증 가능한 자격 증명에 대해 서로 다른 보기를 제공할 수 있는 여러 템플릿을 지원할 수 있습니다. 아래는 서로 다른 템플릿을 사용하여 동일한 검증 가능한 자격 증명을 렌더링한 두 가지 예입니다.

인증서 템플릿
그림 2 인증서 템플릿
성적 증명서 템플릿
그림 3 성적 증명서 템플릿

2.3.1 Action API

Host는 Template Renderer의 도움을 받아 문서를 표시하는 애플리케이션입니다. Template Renderer는 renderMethod.id로 지정된 iframe 안에 포함된 웹 애플리케이션이어야 MUST 합니다. 이는 작업을 수행하기 위해 postMessage API를 사용하여 Host 애플리케이션과 통신해야 MUST 합니다.

모든 작업은 동일한 구조를 따릅니다. 이는 typepayload로 구성됩니다.

  1. type은 실행되는 작업의 종류를 나타냅니다. 예를 들어 RENDER_DOCUMENT는 문서 렌더링을 의미합니다. 작업의 type은 필수입니다.
  2. payload는 type과 연결된 선택적 데이터를 나타냅니다. 예를 들어 렌더링할 문서의 내용입니다.

오픈 소스 참조 구현은 GitHub에서 사용할 수 있습니다.

Host와 Template Renderer 간의 상호작용은 다음 다이어그램에 나와 있습니다.

시퀀스 다이어그램
그림 4 시퀀스 다이어그램
2.3.1.1 Host-to-Frame 작업

iframe이 처음 표시될 때 host는 문서를 렌더링하도록 iframe에 명령을 보냅니다. 지원되는 4가지 작업 유형은 아래에 설명되어 있습니다.

type payload 작업
GET_TEMPLATES
{ type: "GET_TEMPLATES" }
주어진 문서에 대해 renderer가 지원하는 템플릿 목록을 가져옵니다. 템플릿 목록은 iframe에서 호출되는 UPDATE_TEMPLATES에서 반환됩니다.
SELECT_TEMPLATE
{
  type: "SELECT_TEMPLATE",
  payload: "CUSTOM_TEMPLATE"
}
렌더링에 사용할 템플릿을 선택합니다. 이는 GET_TEMPLATES가 반환한 목록에 있어야 합니다. 찾을 수 없으면 기본 템플릿이 사용됩니다.
RENDER_DOCUMENT
{
  type: "RENDER_DOCUMENT",
  payload: {
    document: {
      credentialSubject: ...,
      renderMethod: ...
    }
  }
}
선택된 템플릿을 사용하여 IFRAME 안에서 검증 가능한 자격 증명을 렌더링합니다. Document는 검증 가능한 자격 증명의 JSON 객체 형태입니다.
PRINT
{ type: "PRINT" }
IFRAME의 내용을 인쇄할 수 있도록 인쇄 대화상자를 표시해야 MUST 합니다.
2.3.1.2 Frame-to-Host 작업

이는 iframe이 서식 조정 또는 선택적 편집을 위해 host를 업데이트하는 데 사용됩니다.

type payload 작업
OBFUSCATE
{
  type: "OBFUSCATE",
  payload: "a[0].b.c",
}
이는 선택적 편집에 사용됩니다. 난독화된 필드의 경로가 Host에 전달되어, host가 선택된 필드가 난독화된 문서의 업데이트된 버전을 만들 수 있습니다.
UPDATE_HEIGHT
{
  type: "UPDATE_HEIGHT",
  payload: 150,
}
Host가 브라우저에서 크기를 조정할 수 있도록 포함된 iframe의 높이를 픽셀 단위로 Host에 알립니다.
UPDATE_TEMPLATES
{
  type: "UPDATE_TEMPLATES",
  payload: [
    {
      id: "template1",
      label: "template1",
    },
    {
      id: "template2",
      label: "template2",
    }
  ]
}
RENDER_METHOD 또는 GET_TEMPLATES 호출에서 사용할 수 있는 템플릿 이름 목록을 Host에 알립니다.

3. 알고리즘

다음 절에서는 이 명세가 렌더링 방법에 사용하는 알고리즘을 개괄합니다.

3.1 렌더링(TemplateRenderMethod)

Mustache 템플릿 언어는 검증 가능한 자격 증명의 시각적 표현을 생성하는 데 사용됩니다. 자세한 내용은 Mustache 5.0 명세를 참조하십시오.

A. 보안 고려사항

이 절은 비규범입니다.

이슈 1: 보안 고려사항 요약

아래에 나열된 보안 고려사항 목록은 절로 변환되어야 합니다.

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

이 절은 비규범입니다.

이슈 2: 개인정보 보호 고려사항 요약

아래에 나열된 개인정보 보호 고려사항 목록은 절로 변환되어야 합니다.

C. 국제화 고려사항

이 절은 비규범입니다.

이슈 3: 국제화 고려사항 요약

아래에 나열된 국제화 고려사항 목록은 절로 변환되어야 합니다.

D. 참고 문헌

D.1 규범적 참고 문헌

[CSP3]
Content Security Policy Level 3. Mike West; Antonio Sartori. W3C. 2026년 4월 1일. W3C 작업 초안. URL: https://www.w3.org/TR/CSP3/
[infra]
Infra Standard. Anne van Kesteren; Domenic Denicola. WHATWG. 살아있는 표준. URL: https://infra.spec.whatwg.org/
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels. S. Bradner. IETF. 1997년 3월. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC2397]
The "data" URL scheme. L. Masinter. IETF. 1998년 8월. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc2397
[RFC6838]
Media Type Specifications and Registration Procedures. N. Freed; J. Klensin; T. Hansen. IETF. 2013년 1월. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc6838
[RFC6901]
JavaScript Object Notation (JSON) Pointer. P. Bryan, Ed.; K. Zyp; M. Nottingham, Ed. IETF. 2013년 4월. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc6901
[RFC8174]
Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words. B. Leiba. IETF. 2017년 5월. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc8174
[URL]
URL Standard. Anne van Kesteren. WHATWG. 살아있는 표준. URL: https://url.spec.whatwg.org/
[VC-DATA-MODEL-2.0]
Verifiable Credentials Data Model v2.0. Ivan Herman; Michael Jones; Manu Sporny; Ted Thibodeau Jr; Gabe Cohen. W3C. 2025년 5월 15일. W3C 권고안. URL: https://www.w3.org/TR/vc-data-model-2.0/
[VC-DI-ECDSA]
Data Integrity ECDSA Cryptosuites v1.0. Manu Sporny; Dave Longley; Greg Bernstein. W3C. 2025년 5월 15일. W3C 권고안. URL: https://www.w3.org/TR/vc-di-ecdsa/