Copyright © 2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
本仕様は、検証可能なクレデンシャル・データモデルのための拡張機構について説明するものであり、 視覚、聴覚、または触覚の媒体を通じて検証可能なクレデンシャルを表現するために使用できます。本仕様は、 検証可能なクレデンシャルを物理文書、デジタル画像、 スクリーンリーダー、または点字出力へレンダリングすることを扱います。
このセクションでは、この文書の公開時点における状態について説明します。現在のW3C 公開文書の一覧、およびこの技術報告書の最新版は、 W3C 標準および草案 索引で確認できます。
これは実験的な仕様であり、定期的に改訂されています。本番環境への配備には 適していません。
この文書は、検証可能なクレデンシャル作業 グループによって、 勧告トラックを用いた 作業草案として公開されました。
作業草案としての公開は、 W3Cおよびそのメンバーによる承認を意味するものではありません。
これは草案文書であり、いつでも他の文書によって更新、置換、または廃止される可能性があります。 作業中の文書以外のものとしてこの文書を引用することは不適切です。
この文書は、 W3C 特許 ポリシーの下で運営されているグループによって作成されました。 W3Cは、 そのグループの成果物に関連して行われた 特許開示の公開一覧を管理しています。 そのページには、特許を開示するための 手順も含まれています。ある個人が、 必須クレームを含むとその個人が考える特許について 実際の知識を有している場合、その個人は W3C 特許ポリシー第6節に従ってその情報を開示しなければなりません。
この文書は、 2025年8月18日版 W3C プロセス文書に準拠します。
レンダリングメソッドは、発行者が、特定の方法で 検証可能なクレデンシャルを 視覚、聴覚、または触覚のメカニズムを通じてオブザーバーに表現したい場合に使用できる。たとえば、 従業員バッジクレデンシャルの発行者は、 企業ロゴの豊富な画像や、バッジ上の特定の領域への従業員情報の 特定の配置を含めたい場合がある。また、視覚に関連するアクセシビリティのニーズがある 個人向けに、バッジの重要な側面を音声で読み上げる機能を提供したい場合も ある。
この文書全体で使用される一部の用語は、 検証可能なクレデンシャルデータモデル v2.1仕様の 用語セクションで定義されている。
非規範的と記されたセクションに加え、この仕様に含まれるすべての作成ガイドライン、図、例、および注記は 非規範的である。この仕様のそれ以外のすべての部分は規範的である。
この文書におけるキーワード MAY、MUST、MUST NOT、OPTIONAL、RECOMMENDED、REQUIRED、および SHOULD は、 ここに示すようにすべて 大文字で表記される場合に限り、 BCP 14 [RFC2119] [RFC8174] に記述されているとおりに解釈される。
適合レンダリングメソッドとは、この仕様の規範的な記述に 準拠するデータモデルの具体的な表現である。 具体的には、セクション 2. データモデルおよび3. アルゴリズム にある関連するすべての規範的記述を、この文書ではMUST適用しなければならない。
適合プロセッサーとは、ソフトウェアおよび/またはハードウェアとして実現され、 適合レンダリングメソッドを生成または消費する 任意のアルゴリズムである。適合プロセッサーは、非適合文書を 消費する場合にエラーを生成しMUSTなければならない。
この文書には、JSON および JSON-LD の内容を含む例も含まれている。これらの
例の一部には、インラインコメント(//)や、
例にほとんど価値を加えない情報を示すための省略記号(...)など、
JSON として無効な文字が含まれている。実装者は、この情報を有効な JSON または
JSON-LD として使用する場合、そのような内容を削除するよう注意されたい。
以下のセクションでは、この仕様でレンダリングメソッドに使用される データモデルの概要を示す。
renderMethod プロパティは、
検証可能なクレデンシャルデータモデル
v2.1仕様における予約済みの拡張ポイントである。発行者は、
検証可能なクレデンシャル
でこのプロパティを使用して、1 つ以上の優先レンダリングメソッドを表現できる。
renderMethod プロパティの値は、ソフトウェアが視覚、聴覚、または触覚のメカニズムを使用して
検証可能な
クレデンシャルを表現するために使用できる 1 つ以上のレンダリングメソッドを
指定しMUSTなければならない。各
renderMethod の値は、その type(たとえば
SuiteRenderMethod)を指定しMUSTなければならない。
各レンダリングヒントの正確な内容は、
renderSuite プロパティで指定されるレンダースイートによって決定される。
発行者が、
検証可能なクレデンシャルの
レンダリング命令を指定したい場合、
以下に記述するデータモデルを使用する renderMethod プロパティを追加してMAYよい。
具体的なレンダリング動作は、renderSuite プロパティで指定された
レンダースイートによって決定される。
各レンダースイートは、以下のプロパティのうちどれを使用するかを定義する。個々の
レンダースイートのセクションを参照されたい。
| プロパティ | 説明 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
| id | URL 標準に従い、取得されたときに レンダーテンプレートへ参照解決されるOPTIONALな文字列。 | ||||||||
| type |
値が SuiteRenderMethod でMUSTなければならない、REQUIREDな文字列。
|
||||||||
| renderSuite |
レンダースイート、すなわち具体的なレンダリングを生成するために使用される
アルゴリズムの集合を識別するREQUIREDな文字列。値は通常の
JSON 文字列であり、大文字と小文字を区別した完全一致によって比較される。この
仕様では、値 static、summary、および
html を定義する。実装は、
認識またはサポートしていない renderSuite 値を持つ
renderMethod エントリーを無視しMUSTなければならない。
|
||||||||
| name | 実行されるレンダリングの種類についてのヒントとして表示できる、 人間が読めるOPTIONALな文字列。このプロパティは、 個人が複数の表示モードから選択できる グラフィカルインターフェイスで使用される場合がある。 | ||||||||
| description |
特定のレンダリングが有用となる状況について、
name より詳しい説明を提供する、人間が読めるOPTIONALな文字列。
|
||||||||
| renderProperty |
この特定のレンダリングメソッドを使用するときに検証可能な
クレデンシャルから公開されるプロパティを指定する、
JavaScript Object Notation (JSON)
Pointer 構文にそれぞれ準拠する文字列値の
OPTIONALなリスト。
renderProperty が指定されていない場合、レンダリングメソッドが使用されるときには
検証可能な
クレデンシャル全体が共有されるものとみなされる。
|
||||||||
| template |
レンダリングを実行するために使用されるテンプレートを提供する、または参照する
OPTIONALなURLまたはマップ。
値がURLの場合、
テンプレートコードを含む data: URL [RFC2397] であってMAYよい。
値がマップの場合、
以下の規則に準拠しMUSTなければならない。
|
||||||||
| digestMultibase |
id が指定されている場合に参照されるレンダリングメソッドの
multibase エンコードされた Multihash(OPTIONAL)。
multibase 値は u
(base64url-nopad)でMUSTなければならず、multihash 値は
出力 256 ビットの SHA-2(0x12)でMUSTなければならない。
|
レンダースイート値をどこに登録するか(この仕様のレジストリセクション、 VC Specs Directory、またはその両方)、および拡張スイート値を 通常の文字列とするか URL とするかについては、現在も議論中である。
summary レンダースイートは JSON テンプレートを使用して、
検証可能な
クレデンシャルを標準化されたデータ表示形式に変換する。この形式により、
ウォレットは重要なデータを強調し、追加フィールドを設定可能なレスポンシブレイアウトで
クレデンシャルを表示できる。このメソッドを実装するウォレットは、
標準化された JSON 出力を独自の UI デザインでレンダリングできるため、
特定のクレデンシャルタイプをウォレットがネイティブにサポートしていなくても
クレデンシャルを表示できる。
テンプレートとレンダリング済み出力は、どちらも以下に示す単一の定義、 サマリーオブジェクトを共有する JSON オブジェクトである。テンプレート内の文字列値は、 JavaScript Object Notation (JSON) Pointer で指定される JSON ポインター文字列として、 検証可能な クレデンシャル内の値を参照できる。テンプレートの処理時に、 JSON ポインター文字列はクレデンシャルデータに対して評価され、 解決された値に置き換えられる。テンプレートと結果の出力はどちらも サマリーオブジェクトの定義に準拠しMUSTなければならない。 複数フィールドにまたがる複合データはサポートされない。各フィールドは単一の JSON ポインターを参照する。
summary レンダースイートは、共通のレンダリングメソッドプロパティを次のように使用する。
| プロパティ | このスイートでの使用 |
|---|---|
| template |
data: URL として埋め込むか、マップとして
参照することにより、サマリーテンプレートを提供する。値は、
2.2.1.2 サマリーオブジェクトの定義に準拠する
JSON 文書であるか、その文書へ参照解決されMUSTなければならない。
|
| renderProperty | このスイートでは使用しない。サマリーテンプレート内の JSON ポインター文字列によって、 検証可能な クレデンシャルのどのプロパティを公開するかが決定される。 |
| outputPreference |
指定してMAYよい。accessMode および
style の設定は、
レンダリング済みサマリーの表示に適用される。
|
サマリーオブジェクトは、以下で定義するメンバーを持つ
JSON オブジェクト [RFC8259]
である。
同じ定義がテンプレートとレンダリング済み出力に適用される。テンプレートでは、
文字列として定義された任意のメンバーの値は、代わりに
JSON ポインター文字列(JavaScript Object Notation (JSON)
Pointer で指定されるように / で始まる)として、
検証可能な
クレデンシャル内の値を参照してMAYよい。ただし、
フィールドオブジェクトの label および value メンバーについて
注記されている場合を除く。レンダリング済み出力では、
すべての JSON ポインターが解決された値に置き換えられている。
namedescriptionicondata: URL
[RFC2397] を含む
OPTIONALな文字列。
themeprimaryColoraccentColorfieldslabelvalue"/issuer")で
MUSTなければならない。
languagedirectionvalidFromvalidUntilテンプレートは、処理前に上記のサマリーオブジェクト定義に対して 検証されるSHOULDべきである。 サマリーテンプレート用の非規範的な JSON Schema は、 C. サマリーテンプレート JSON Schemaで提供される。
次の例は、JSON ポインター文字列を持つ有効なサマリーテンプレートを 示している。
{
"name": "/credentialSubject/degree/name",
"description": "大学学位クレデンシャル",
"icon": "/credentialSubject/icon",
"theme": {
"primaryColor": "#1a5490",
"accentColor": "/credentialSubject/theme/accentColor"
},
"fields": [
{
"label": "教育機関",
"value": "/issuer"
},
{
"label": "学位種別",
"value": "/credentialSubject/degree/type"
},
{
"label": "発行日",
"value": "/validFrom"
}
],
"validFrom": "/validFrom",
"validUntil": "/validUntil"
}
次の例は、有効なサマリー出力を示している。
{
"name": "理学・芸術学士",
"description": "大学学位クレデンシャル",
"icon": "https://example.edu/icons/degree.svg",
"theme": {
"primaryColor": "#1a5490",
"accentColor": "#4a90e2"
},
"fields": [
{
"label": "教育機関",
"value": "Example University"
},
{
"label": "学位種別",
"value": "BachelorDegree"
},
{
"label": "卒業日",
"value": "2010-05-15"
}
],
"validFrom": "2010-01-01T19:23:24Z",
"validUntil": null
}
以下の例では、JSON テンプレートが data: URL
[RFC2397] として、
検証可能な
クレデンシャルに直接埋め込まれている。
{
...
"renderMethod": {
"type": "SuiteRenderMethod",
"renderSuite": "summary",
// JSON テンプレートは VC に埋め込まれる
"template": "data:application/json;base64,eyJuYW1lIjogIi9jcmVkZW50aWFsU3ViamVjdC9kZWdyZWUvbmFtZSIsICJkZXNjcmlwdGlvbiI6ICJVbml2ZXJzaXR5IERlZ3JlZSBDcmVkZW50aWFsIiwgImZpZWxkcyI6IFt7ImxhYmVsIjogIkluc3RpdHV0aW9uIiwgInZhbHVlIjogIi9pc3N1ZXIifV19"
}
}
次の例では、Web 上の JSON テンプレートへリンクし、
digestMultibase プロパティを使用して変更から保護している。
{
...
"renderMethod": {
"type": "SuiteRenderMethod",
"renderSuite": "summary",
"template": {
// この JSON テンプレートは Web から取得される
"id": "https://degree.example/credential-templates/bachelors.json",
"mediaType": "application/json",
"digestMultibase": "zQmerWC85Wg6wFl9znFCwYxApG270iEu5h6JqWAPdhyxz2dR"
}
}
次の例では、Web 上のレンダリングテンプレートへリンクし、
digestMultibase プロパティを使用して保護している。
{
...
"renderMethod": {
// このレンダリングメソッドは Web から取得される
"id": "https://degrees.example/bachelors-card.jsonld",
"mediaType": "application/ld+json",
"type": "SuiteRenderMethod",
"renderSuite": "summary",
"digestMultibase": "zQmG270iEu5h6JqWAPdhyxz2dRerWC85Wg6wFl9znFCwYxAp"
}
html レンダースイートにより、テンプレート作成者は
検証可能な
クレデンシャルをレンダリングするための HTML テンプレートを提供できる。
HTML は、template または
template.id(template の値がオブジェクトの場合)の値として、
リモート参照するか data: URL を介して指定できる。
HTML フラグメント内の JavaScript は、
HTML テンプレートとともにサンドボックス化された iframe 内でホストされる
HTML データブロック
(すなわち <script type="application/vc"></script>)を介して提供された、
フィルタリング済みの検証可能な
クレデンシャルデータをレンダリングする責任を負う。
{
"@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": "発行者"
},
"credentialSubject": {
"name": "名前の例",
"notRendered": "表示されないはず"
},
"renderMethod": {
"type": "SuiteRenderMethod",
"renderSuite": "html",
"renderProperty": [
"/issuer/name",
"/credentialSubject/name"
],
"template": {
"id": "https://test.example/credential-templates/NameCredential.html",
"mediaType": "text/html",
"digestMultibase": "zQmerWC85Wg6wFl9znFCwYxApG270iEu5h6JqWAPdhyxz2dR"
},
"outputPreference": {
"accessMode": [
"visual"
],
"mediaType": "application/html",
"style": {
"width": "800px",
"height": "800px"
}
}
}
}
html レンダースイートは、共通のレンダリングメソッドプロパティを次のように使用する。
| プロパティ | このスイートでの使用 |
|---|---|
| template |
HTML フラグメントを、data: URL として埋め込むか、
id がそのフラグメントへ参照解決される
マップとして参照することにより提供する。
|
| renderProperty | テンプレートへ渡される検証可能な クレデンシャルデータを制限するために指定してMAYよい。 存在しない場合、検証可能な クレデンシャル全体が提供される。 |
| outputPreference |
指定してMAYよい。style の width
および height の設定は、
テンプレートをホストする iframe に適用される。
|
実装は、フィルタリング済みの検証可能な
クレデンシャルデータを使用して JavaScript が
HTML テンプレートを安全にレンダリングできる環境を提供しMUSTなければならない。
さらに、ホストページは、
(たとえば template.id の参照解決などの)任意のリクエストについて、
Oblivious HTTP [RFC9458]
または保護リレーを使用して要求元クライアントと要求先オリジンとの関連付けを
切り離すその他の手段を使用し、そのプライバシーを保護するSHOULDべきである。
この環境を説明するため、以下の用語を使用する。
最低限、環境は追跡およびその他のプライバシー上の害を防止するため、 ナビゲーション、外部コンテンツの読み込み、およびホストページへのアクセスを 防止しMUSTなければならない。
環境はまた、ユーザー環境で利用可能なすべての国際化および
アクセシビリティ設定をテンプレートコードに公開しMUSTなければならない。
これにより、テンプレートは個人がユーザーエージェントまたはオペレーティングシステムに対して
すでに表明している言語、テキストサイズ、コントラスト、およびモーション設定を尊重できる。
このような設定の例には、rem 単位や
prefers-contrast、prefers-reduced-motion、
forced-colors といったメディアクエリーなど CSS に反映されるものに加え、
Intl および Navigator.language によって提供される
ロケール情報など、JavaScript で利用可能なものが含まれる。
たとえばブラウザーを基盤とする実装では、
ホストページに対する
Content Security Policy [CSP3] 制限、
HTML テンプレートをホストする iframe のサンドボックス化、および
HTML テンプレートをラップして追加の CSP 制限を加え、
ホストページとの
ready および error イベント通信を提供するラッパーコードを組み合わせることで、
このような環境を提供できる。
サンドボックス化された iframe は、デフォルトで上記の国際化および
アクセシビリティ要件を満たす。このセクションで説明するサンドボックスおよび CSP 制限は、
CSS メディアクエリーや Intl、Navigator.language などの
JavaScript API を妨げない。モバイルプラットフォーム上の WebView など、
html レンダースイート用の代替レンダリング環境も可能である。
ホストページ(通常はウォレットまたは検証可能な クレデンシャルのレンダラー)は、 HTML テンプレートがトップレベルのブラウジングコンテキストをナビゲートすること、 外部コンテンツへアクセスすること、ホストページへアクセスすること、 およびリモートコンテンツを読み込むことを防止しMUSTなければならない。
ホストページを使用する場合、次の規則が適用される。
frame-src 'none' を含めMUSTなければならない。
これにより iframe では src の代わりに srcdoc の使用が強制され、
ブラウザーが HTML テンプレートを読み込むことを防止する。その結果、
ホストページのコードは、
リモート参照されたテンプレートコードを事前に読み込み、
テンプレートをラッパーコードへ挿入する前に、
レスポンスを対応する digestMultibase 値と照合する必要がある。
iframe には、
ナビゲーションおよびトップレベルへのアクセスを防止するため、
sandbox="allow-scripts" を設定しMUSTなければならない。
<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>
renderMethod の template プロパティによって参照される
HTML テンプレートコードは、
検証可能な
クレデンシャルをレンダリングするために必要な HTML、CSS、
および JavaScript を含む HTML フラグメントでMUSTなければならない。
テンプレートコードには、
<html>、<head>、または
<body> タグを含めてはMUST NOTならない。
これらはラッパー
コードによって提供されるためである。
<div>
<script>
document.addEventListener('DOMContentLoaded', (event) => {
console.log('running template render script');
// 例示用レンダラーとしてクレデンシャルを JSON で表示する。ここでは
// 代わりに、mustache/その他の形式を含め、任意の処理を
// 実行して表示用 HTML を生成するテンプレート処理を行える
// FIXME: データブロック/script タグに最適な名前/位置を決定する
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: レンダリングが完了したことをホストへ通知する
window.renderMethodReady();
});
</script>
<style>
h1 {
color: blue;
}
</style>
<h1 id="credentialSubject-name"></h1>
<p>発行者: <span id="issuer-name"></span></p>
</div>
テンプレート HTML フラグメントは、
部分的な検証可能な
クレデンシャルを含むデータブロックを提供し、
ナビゲーションおよび外部コンテンツの読み込みを防止する追加の CSP ポリシーを加える
ラッパーコードでラップされMUSTなければならない。
具体的には、ラッパー
コードは、
テンプレート
コードによるネットワークリクエストを防止するため、
default-src data: 'unsafe-inline' という CSP 制限を追加しMUSTなければならない。
<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 が実行される。
<html>
<head>
<meta http-equiv="content-security-policy" content="default-src 'none' data: 'unsafe-inline'">
<!-- ラッパーコードへ挿入されたクレデンシャルデータブロック。 -->
<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": "発行者"
},
"credentialSubject": {
"name": "名前の例"
}
}</script>
<!-- クレデンシャルデータブロックの終了 -->
</head>
<body>
<!-- ラッパーコードへ挿入されたテンプレート HTML。 -->
<div>
<script>
console.log('running template render script');
// 例示用レンダラーとしてクレデンシャルを JSON で表示する。ここでは
// 代わりに、mustache/その他の形式を含め、任意の処理を
// 実行して表示用 HTML を生成するテンプレート処理を行える
// FIXME: データブロック/script タグに最適な名前/位置を決定する
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: レンダリングが完了したことをホストへ通知する
window.renderMethodReady()
</script>
<style>
h1 {
color: blue;
}
</style>
<h1 id="credentialSubject-name"></h1>
<p>発行者: <span id="issuer-name"></span></p>
</div>
<!-- テンプレート HTML の終了 -->
</body>
</html>
ラッパーコード内で作成される iframe は、
レンダリングの完了時またはレンダリング中にエラーが発生した場合に、
テンプレートがホストページへ通知できる
通信チャネルを提供しMUSTなければならない。これは、
ラッパーコードによってセットアップされた
MessageChannel と postMessage API を使用して実現できる。
以下に示す JavaScript は、iframe に onload イベントを追加して
MessageChannel をセットアップするため、上記のホストページへ
追加される。ホストページはまた、
ラッパーコードから
ready メッセージを受信すると解決され、
error メッセージを受信すると拒否される Promise を作成する。
ラッパーコードはまた、
テンプレートがレンダリングの完了をホストページへ通知したり、
エラーメッセージを返したりするために使用する
window.renderMethodReady メソッドを提供する。
// レンダリングの準備が整ったときに解決される Promise(または失敗した場合は
// 拒否される)。表示または代わりにエラーを示すために使用できる
let resolveRender;
let rejectRender;
const readyPromise = new Promise((resolve, reject) => {
resolveRender = resolve;
rejectRender = reject;
});
// iframe 内のテンプレートコードが使用する通信チャネルをセットアップする
renderer.onload = () => {
// MessageChannel を作成し、一方のポートを iframe へ転送する
const channel = new MessageChannel();
// iframe の読み込み中にメッセージが失われないようメッセージキューを開始する
channel.port1.start();
// `ready` メッセージを処理する
channel.port1.onmessage = function ready(event) {
if(event.data === 'ready') {
// iframe の準備が整ったので非表示を解除する
resolveRender();
} else {
rejectRender(new Error(event.data?.error?.message));
}
channel.port1.onmessage = undefined;
};
// "start" メッセージを送信し、戻りの通信のため `port2` を iframe へ送る
renderer.contentWindow.postMessage('start', '*', [channel.port2]);
};
// ready または error に対するイベント応答をセットアップする
// NOTE: このセクションはウォレット/レンダラーの UX 要件に固有である
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 = 'レンダリングに失敗しました: ' + err.message;
console.error('rendering failed', err);
});
// 親ウィンドウからの通信ポートに解決される Promise を追加する
//
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]);
}
});
});
// テンプレートが「ready」のとき(またはエラーが発生したとき)に呼び出す
// 関数を window に追加し、親へメッセージを送信して、親が 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")) を呼び出して
ホストページへ
エラーを通知したりできる。
レンダリング環境の設定は Render Method 内で指定してMAYよい。この オブジェクトの目的は、提供されたテンプレートをレンダリングするときの推奨される使用方法、 表示、および意図されるアクセスモードを提供することである。実装は、 これらの設定が提供された場合、それに従うSHOULDべきである。
| プロパティ | 説明 |
|---|---|
| outputPreference | 提供されたテンプレート用の優先レンダリング環境を表現する OPTIONALなマップ。 |
outputPreference オブジェクトは、次のプロパティのいずれかを
含んでMAYよい。
| プロパティ | 説明 |
|---|---|
| accessMode |
auditory、tactile、
textual、または visual の 1 つ以上の
文字列値からなる
OPTIONALなリスト。これらは
https://w3c.github.io/cg-reports/a11y-discov-vocab/CG-FINAL-vocabulary-20260128/#accessMode-vocabulary
で定義される。
|
| mediaType | レンダリング用として推奨される、 IANA メディア タイプに掲載された有効なメディアタイプを示す OPTIONALな文字列。 この値は、レンダリング前の追加処理を提案するときに使用してMAYよい。 例として、SVG テンプレートを静止画像へ変換することや、 HTML 文書を PDF へ変換することが挙げられる。 |
| style | レンダリング環境によって使用される可能性があるスタイルプロパティを定義する OPTIONALなマップ。 |
style オブジェクトは、次のプロパティのいずれかを
含んでMAYよい。
| プロパティ | 説明 |
|---|---|
| width |
iframe に設定される、CSS 互換の幅の設定を
含むOPTIONALな文字列。
|
| height |
iframe に設定される、CSS 互換の高さの設定を
含むOPTIONALな文字列。
|
static レンダースイートは、
検証可能な
クレデンシャルを、さまざまな静的または事前レンダリング済みのバイナリ形式で表すバイナリペイロードの配信に使用され、
画像、PDF、埋め込み NFC ペイロードなどが含まれる。
以下の例では、完全に埋め込まれた NFC ペイロードがレンダリング テンプレートとして使用され、クレデンシャルに関連付けられたバーコード識別子のみを 開示する。
{
...
"renderMethod": {
"type": "SuiteRenderMethod",
"renderSuite": "static",
"deliveryMode": "nfc",
"name": "タップして送信",
// NFC ペイロードは埋め込まれる
"template": "data:application/octet-stream;base64,2QZkpQGDG...G8XJWnROcY4Biw",
// バーコードのみが NFC 経由で送信される
"renderProperty": ["/credentialSubject/barcode"]
}
...
}
static レンダースイートでは、共通のレンダーメソッドプロパティを次のように使用する:
| プロパティ | このスイートでの使用法 |
|---|---|
| template |
静的バイナリペイロードを提供し、通常は data: URL として埋め込まれる。
|
| deliveryMode |
レンダリングされたテンプレートの意図された配信方法を指定する。たとえば
nfc
は無線 NFC チャネル経由での送信を表す。
|
| renderProperty | レンダリングされたテンプレートに表される 検証可能な クレデンシャルデータを制限するために提供してもよい 。 |
| outputPreference | このスイートでは通常使用されない。 |
以下のセクションでは、この仕様でレンダリングメソッドに使用されるアルゴリズムの 概要を示す。
サマリーテンプレートを処理するとき、以下の手順をMUST 実行しなければならない:
/で始まる場合(JSON ポインターであることを示す)、
JSON Pointer アルゴリズムJavaScript Object Notation (JSON)
Pointerを使用して、
検証可能な
クレデンシャルを対象文書として評価する。
nullを返した場合、その動作は
実装固有である。実装は空文字列を使用してMAYよく、
値を
nullのままにするか、エラーを通知してもよい。
/で始まらない場合、それをリテラル文字列として扱い、
変更せずそのままにする。
複数のフィールドにまたがる複合データはサポートされないことに注意されたい。テンプレート内の各フィールドは、 クレデンシャルから単一の値へ解決される単一の JSON ポインターを 参照する。
以下のセクションでは、htmlレンダースイートが HTML テンプレートを安全にレンダリングするために
使用するアルゴリズムの概要を示す。セキュリティおよびプライバシー上の結果と出力が同じである限り、
代替アルゴリズムを使用してMAYよい。
ホストページは、HTML テンプレートをホストするための
iframe要素を作成しMUSTなければならない。
ホストページは、
iframeのsandbox属性を
ナビゲーションおよびトップレベルへのアクセスを防止するためallow-scriptsに設定しMUSTなければならない。
vcを、レンダリングする検証可能な
クレデンシャルとする。
renderMethodを、vc内で選択されたrenderMethodプロパティのうち、
renderMethod.typeがSuiteRenderMethodであり、
renderMethod.renderSuiteがhtmlであるものとする。
renderMethod.templateが文字列である場合、templateを
renderMethod.templateの
値とする。
renderMethod.templateがマップである場合、templateを
renderMethod.template.id内の URL を
フェッチした結果とする。
ホストページは、検証可能な
クレデンシャルvcを、存在する場合には
renderMethod.renderPropertyで指定されたプロパティのみを含むようフィルタリングしMUSTなければならない。
renderMethod.renderPropertyが存在しない場合、検証可能な
クレデンシャル全体が
使用される。
このフィルタリングは、selectJsonLd
アルゴリズムを
Data Integrity ECDSA Cryptosuites v1.0
仕様のセクション 3.4.13 selectJsonLd
[VC-DI-ECDSA] で定義されるとおり、
renderMethod.renderPropertyに存在する JSON Pointer [RFC6901] 値へ
適用することで実行しMUSTなければならない。
ホストページは、フィルタリングされたラッパーコードを、 検証可能な クレデンシャルと HTML テンプレートをラッパーコード テンプレートに埋め込むことで 作成しMUSTなければならない。
wrapperCodeを、<head>内に<meta http-equiv="Content-Security-Policy"
content="default-src data: 'unsafe-inline'">を持つ HTML 文書とする。
datablockを、typeが
application/vcである HTML データブロックとする。
datablockの内容を、フィルタリングされた検証可能な
クレデンシャルの
文字列化された JSON 形式に設定する。
datablockをwrapperCodeの<head>に挿入する。
templateの値をwrapperCodeの<body>に
挿入する。
ホストページは、
iframeのsrcdoc属性を
結果として得られたラッパーコードに設定しMUSTなければならない。
iframeのsrcdoc属性を、
wrapperCodeの文字列化された HTML に設定する。
ホストページは、
ラッパーコードとの通信チャネルを、
上述のとおりreadyおよびerrorメッセージを受信するためにセットアップしMUSTなければならない。
renderPromiseを、次の新しいPromiseとする:
resolve時に、iframeをユーザーに表示するために使用できる。
reject時に、エラーメッセージをユーザーに表示する。
iframeのonloadイベントで:
channelを新しいMessageChannelとする。
channel上に新しいport1リスナーを作成して開始し、
現在iframeへ挿入されているtemplate内のコードからのready
メッセージを
wrapperCodeを介して待ち受ける。
port1リスナーで、readyメッセージを受信した場合、
renderPromiseを解決する。
errorメッセージを受信した場合、renderPromiseをエラー
メッセージとともに拒否する。
postMessageを使用して、channelのport2を
iframeのコンテンツウィンドウへ送信する。
ホストページは、
レンダリングが完了した時点、またはレンダリング中にエラーが発生したかどうかを判断するために
renderPromiseを使用するSHOULD。
ラッパーコードは、
ホストページから
MessageChannelを介した通信を受信するようセットアップし、かつ
テンプレートコードが使用する
window.renderMethodReadyメソッドを提供しMUSTなければならない。
このセクションは非規範的である。
このセクションでは、この仕様の脅威モデルを要約し、 レンダリングメソッドの公開、取得、および処理に関連する セキュリティおよびプライバシー上の考慮事項を取り上げる。対応策および データフロー図を含む完全な分析は、 検証可能なクレデンシャルのレンダリングメソッド脅威 モデルに記載されている。
読者には、このセクションを読む前に、 検証可能なクレデンシャルデータモデル v2.1 仕様の 脅威モデルセクションで 提供されている一般的な脅威モデルを理解しておくことが強く推奨される。実装者は、 その仕様で提供される一般的な分析を、この仕様で提供される 各機能に適用することが求められる。
htmlレンダースイートはテンプレートが提供するコードを実行し、
信頼されていない入力であるクレデンシャル値を処理するため、整形式で検証済みの
クレデンシャル内に含まれる悪意のあるコンテンツが、周囲の
ホストページへ到達したり、別の場所へナビゲートしたり、
レンダリング中に外部の場所へ接続したりしようとする可能性がある。
htmlレンダースイートは、選択された
レンダリング環境によって提供される隔離に依存するため、サンドボックスからの脱出、
ポリシーの回避、またはテンプレートとホスト間の分離の破壊を可能にする欠陥は、
レンダリングメソッドが仕様どおりに使用されている場合でも、レンダリング処理の欠陥となる。
W3Cは包括的な脅威モデリング手法へ移行しており、 新しい仕様におけるセキュリティ上の考慮事項セクションを 廃止する過程にある。 セキュリティ上の考慮事項に関連する文書については、付録A. 脅威モデルを参照されたい。
W3Cは包括的な脅威モデリング手法へ移行しており、 新しい仕様におけるプライバシー上の考慮事項セクションを廃止する 過程にある。プライバシー上の考慮事項に関連する文書については、 付録A. 脅威モデルを参照されたい。
このセクションは非規範的である。
検証可能なクレデンシャルについて、 発行者が推奨する、人間が知覚可能な提示を伝達するための既存のいくつかの アプローチおよび技術が検討された。このセクションでは、それらの代替案と、この仕様で説明する レンダリングメソッドのアプローチが選択された理由を要約する。
何の仕組みも定義せず、提示を保有者または検証者の ソフトウェアに委ねる方法では追加データは不要だが、発行者が意図する提示を伝える手段がないため、 クレデンシャルのレンダリングに一貫性がなくなり、クレームや ブランド表現が誤って表現される可能性がある。これは 制御されない クレデンシャル提示で説明されている。次のようなクレデンシャル 形式、 ISO/IEC 18013-5 モバイル運転 免許証 (mDL) および JSON Web Tokens (RFC 7519) はこの アプローチを採用し、クレデンシャルが保持するクレームを定義する一方、その 提示は利用するソフトウェアに委ねている。Microsoft の Information Card (CardSpace) は現在廃止されているが、この限定的な変形を採用しており、 発行者は カード名とロゴだけを提供でき、それを ID セレクターが 統一されたカード外観でレンダリングしていた。この仕様は、クライアント決定型レンダリングを禁止するのではなく、 発行者が表明する代替手段を追加する。
レジストリを介してクレデンシャルタイプごとの提示を標準化すると、既知のタイプに対して一貫した レンダリングを提供できるが、各タイプに関する事前知識が必要であり、 カスタムクレデンシャルには拡張できず、発行者固有のブランド表現を表現することもできない。 次のようなプラットフォームウォレット、 Apple Wallet (PassKit)、 Google Wallet、および Samsung Wallet はこの アプローチを採用し、あらかじめ定義された固定のパスまたはオブジェクトタイプの集合を、 プラットフォームが制御する固定レイアウトでレンダリングする。そこでは発行者はフィールド値 およびアセットを設定できるが、プラットフォームのカタログ外のレイアウトやブランド表現を表現することはできない。 これに対し、この仕様で定義するレンダリングメソッド戦略は、クレデンシャルとともに移動するか、 クレデンシャルから参照されるため、未知のタイプであっても、その 発行者が意図したとおりにレンダリングできる。
このような中央集権的で、制御され、レジストリに重点を置いた解決策はまた、 分散型識別子 (DIDs) および 検証可能なクレデンシャル (VCs)の エコシステムの一部として規定されている、分散型、非中央集権型、 および許可不要のパターンにも反する。
完全にレンダリング済みの PDF、静的 SVG、または HTML 文書を配布する方法は 自己完結型で広くサポートされているが、このようなスナップショットは 選択的開示に適応できず、検証済みデータから再レンダリングすることもできず、 保護された内容とも結び付いていない。この仕様では、これらの形式を完成した 文書としてではなく、レンダリング時にクレーム値と組み合わせるテンプレートとして再利用する。
新しい完全性メカニズムを定義するのではなく、この仕様は 検証可能なクレデンシャルのデータ完全性 1.0 などの既存の保護メカニズム、および digestMultibase プロパティに依存して、 参照されたテンプレートをクレデンシャルに 結び付ける。読者は、 保護されていない外部リソースの改ざんという脅威について、 検証可能なクレデンシャル脅威モデルで読むことで、これらの一般的な 保護メカニズムについて学ぶことができる。
SD-JWT VC
は、固定された一連のスタイル属性をサポートする simple メソッドと、
コードの実行を禁止し、クレーム値をテキストプレースホルダーに置換する svg_templates メソッドの間で選択するための rendering
プロパティを定義する。
SVG において。このグループはこのアプローチを検討したが、実際の
ユースケースには制限が大きすぎると判断した。プレースホルダーはテキストノードにのみ現れ、コードを実行できないため、
条件付きフィールド、可変長
リスト、値の書式設定、レスポンシブレイアウトなどのデータ駆動型プレゼンテーションツールを表現できない。これらの
機能は、医療、小売、および
銀行・金融などの分野で要件となっている。対照的に、この仕様は単一の
クレデンシャルシリアライゼーションに結び付けられておらず、代わりに
コード不要の宣言型 summary スイート、データ駆動型 html スイートを含むレンダースイートを定義し、
制限された「サンドボックス化」環境で実行されるか、または static スイートを使用する。
このセクションは非規範的である。
以下の JSON Schema は、 2.2.1.2 サマリーオブジェクトで定義されたサマリーオブジェクトの規則を、サマリーテンプレートに適用される形で実装する。このスキーマは 非 規範的である。
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"required": ["name", "description", "fields"],
"properties": {
"name": {
"type": "string",
"description": "リテラル文字列または JSON ポインターとしての表示名(例:\"/credentialSubject/degree/name\")"
},
"description": {
"type": "string",
"description": "リテラル文字列または JSON ポインターとしての説明"
},
"icon": {
"type": "string",
"description": "リテラル文字列または JSON ポインターとしてのアイコン URL または data: URL"
},
"theme": {
"type": "object",
"properties": {
"primaryColor": {
"type": "string",
"description": "リテラル文字列または JSON ポインターとしてのプライマリカラー"
},
"accentColor": {
"type": "string",
"description": "リテラル文字列または JSON ポインターとしてのアクセントカラー"
}
},
"additionalProperties": false
},
"fields": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": ["label", "value"],
"properties": {
"label": {
"type": "string",
"description": "フィールドラベル(リテラル文字列。JSON ポインターは許可されない)"
},
"value": {
"type": "string",
"pattern": "^/",
"description": "JSON ポインター文字列としてのフィールド値(\"/\" で始まる)"
},
"language": {
"type": "string",
"description": "フィールド用の任意の BCP 47 言語タグ"
},
"direction": {
"type": "string",
"description": "フィールド用の任意のテキスト方向タグ"
}
},
"additionalProperties": false
}
},
"validFrom": {
"type": "string",
"description": "リテラル ISO 8601 日付文字列または JSON ポインターとしての有効期間開始日"
},
"validUntil": {
"type": "string",
"description": "リテラル ISO 8601 日付文字列または JSON ポインターとしての有効期間終了日"
}
},
"additionalProperties": false
}
Referenced in:
Referenced in: