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仕様の 用語セクションで定義されています。
非規範的と明示された節に加え、この仕様のすべての作成ガイドライン、図、例、および注記は 非規範的である。この仕様のそれ以外のすべては規範的である。
本文書におけるキーワード してもよい、しなければならない、しては ならない、任意、推奨される、必須、および すべきであるは、 BCP 14 [RFC2119] [RFC8174] に記述されているとおりに解釈しなければならないが、それは、ここに示すように、それらがすべて 大文字で表記されている場合に限られる。
適合レンダーメソッドとは、この仕様の規範的な記述に準拠するデータ モデルの具体的な表現をいう。 具体的には、本文書の 2. データモデルおよび3. アルゴリズム の各節にある関連するすべての規範的な記述を遵守しなければならない。
適合プロセッサとは、 適合レンダーメソッドを生成または消費する、 ソフトウェアおよび/またはハードウェアとして実現された任意のアルゴリズムをいう。適合プロセッサはしなければならない 非適合文書を 消費した場合にエラーを生成する。
本文書には、JSON および JSON-LD の内容を含む例もある。これらの
例の一部には、インラインコメント(//)や、
例にほとんど価値を加えない情報を示すための省略記号(...)の使用など、
JSON として無効な文字が含まれている。実装者がこの情報を有効な JSON または
JSON-LD として使用したい場合は、この内容を削除するよう注意されたい。
以下の節では、レンダリングメソッドのためにこの仕様で使用される データモデルについて概説する
renderMethodプロパティは、
検証可能なクレデンシャル・データモデル
v2.1仕様において予約済みの拡張ポイントです。発行者は、このプロパティを
検証可能なクレデンシャル
で使用して、1つ以上の優先するレンダリング方法を表現できます。
renderMethod プロパティの値は、ソフトウェアが視覚、聴覚、または触覚の
仕組みを使用して検証可能な
クレデンシャルを表現するために使用できる、1 つ以上のレンダリングメソッドを
指定しなければならない。各
renderMethod 値は、その type、例えば
TemplateRenderMethod を指定しなければならない。
各レンダリングヒントの正確な内容は、特定の renderMethod type
の定義によって決定される。
発行者が
検証可能なクレデンシャル
に対してテンプレートベースのレンダリング指示を指定したい場合、
以下で説明するデータモデルを使用する renderMethod プロパティを追加してもよい。
| プロパティ | 説明 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
| id | URL Standard に従い、取得された場合に レンダリングテンプレートを参照解決する、任意の文字列。 | ||||||||
| type |
値が TemplateRenderMethod でなければならない、必須の文字列。
|
||||||||
| renderSuite | 具体的なレンダリングを生成するために使用されるアルゴリズムを 識別する、必須の文字列。 | ||||||||
| name | 実行されるレンダリングの種類に関するヒントを提供するために表示できる、 人間が読める任意の文字列。このプロパティは、 個人が複数の表示モードから選択できるグラフィカルインターフェイスで 使用される場合がある。 | ||||||||
| description |
特定のレンダリングが有用となり得る場合について、name よりも
詳細な説明を提供する、人間が読める任意の文字列。
|
||||||||
| renderProperty |
それぞれが JavaScript Object Notation (JSON)
Pointer 構文に適合する文字列値の任意のリストであり、この特定のレンダリングメソッドを
使用するときに検証可能な
クレデンシャルのどのプロパティが公開されるかを指定する。
renderProperty が提供されない場合、レンダリングメソッドが使用されるときには
検証可能な
クレデンシャル全体が共有されるものと推定される。
|
||||||||
| template |
レンダリングの実行に使用されるテンプレートを提供または参照する、
任意のURL またはマップ。
値がURLである場合、
テンプレートコードを含む data: URL [RFC2397] であってもよい。値がマップである場合、以下の規則に
適合しなければならない。
|
||||||||
| digestMultibase |
id が指定されている場合に参照されるレンダリングメソッドの、
multibase エンコードされた Multihash(任意)。
multibase 値は u
(base64url-nopad) でなければならず、multihash
値は 256 ビット出力の SHA-2 (0x12) でなければならない。
|
card レンダリングスイートは、JSON テンプレートを使用して
検証可能な
クレデンシャルを標準化されたデータ表示形式に変換する。この形式により、
ウォレットは重要なデータを強調し、追加フィールドを設定可能なレスポンシブなカードレイアウトで
クレデンシャルを表示できる。このメソッドを実装するウォレットは、標準化された JSON 出力を
独自のカード UI デザインでレンダリングできるため、ウォレットが特定のクレデンシャルタイプを
ネイティブでサポートしていない場合でもクレデンシャルを表示できる。
テンプレートは、card 出力構造に一致する JSON オブジェクトである。
テンプレート内の文字列値には、検証可能な
クレデンシャル内のフィールドを参照する JSON pointer 文字列
(JavaScript Object Notation (JSON)
Pointer で指定)を使用できる。テンプレートを処理する際、
JSON pointer 文字列はクレデンシャルデータに対して評価され、解決された値に置き換えられる。
テンプレートは、以下で定義される JSON テンプレートスキーマに適合しなければならず、
結果の出力は card 出力スキーマに適合しなければならない。複数の
フィールドにまたがる複合データはサポートされず、各フィールドは単一の JSON pointer を参照する。
card レンダリングスイートのテンプレートは、以下の構造に適合する
JSON オブジェクトでなければならない。
テンプレート構造は出力構造に一致するが、文字列値にはリテラル文字列または
検証可能な
クレデンシャル内のフィールドを参照する JSON
pointer 文字列(/ で始まる)を使用できる。テンプレートは処理前にこの
スキーマに対して検証すべきである。
| プロパティ | 型 | 説明 |
|---|---|---|
| name | 文字列 |
リテラルの表示名、またはクレデンシャルデータを参照する
JSON pointer 文字列(例:
"/credentialSubject/degree/name")のいずれかである必須の文字列。
|
| description | 文字列 | リテラルの説明、またはクレデンシャルデータを参照する JSON pointer 文字列のいずれかである必須の文字列。 |
| icon | 文字列 | リテラルの URL/data URI、またはクレデンシャルデータを参照する JSON pointer 文字列のいずれかである任意の文字列。 |
| theme | マップ | 以下のプロパティを持つ任意のカラーテーマオブジェクト: |
| fields | リスト |
カスタムデータフィールドの必須の順序付きリスト。各フィールドは
以下を持つオブジェクトである:
|
| validFrom | 文字列 | リテラルの ISO 8601 日付、またはクレデンシャルデータ(有効期間の開始日)を 参照する JSON pointer 文字列のいずれかである任意の文字列。 |
| validUntil | 文字列 | リテラルの ISO 8601 日付、またはクレデンシャルデータ(有効期間の終了日)を 参照する JSON pointer 文字列のいずれかである任意の文字列。 |
以下の JSON Schema は、上記で定義されたテンプレート構造の規則を実装している:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"required": ["name", "description", "fields"],
"properties": {
"name": {
"type": "string",
"description": "リテラル文字列または JSON pointer としての表示名(例: \"/credentialSubject/degree/name\")"
},
"description": {
"type": "string",
"description": "リテラル文字列または JSON pointer としての説明"
},
"icon": {
"type": "string",
"description": "リテラル文字列または JSON pointer としてのアイコン URL/data URI"
},
"theme": {
"type": "object",
"properties": {
"primaryColor": {
"type": "string",
"description": "リテラル文字列または JSON pointer としてのプライマリカラー"
},
"accentColor": {
"type": "string",
"description": "リテラル文字列または JSON pointer としてのアクセントカラー"
}
},
"additionalProperties": false
},
"fields": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": ["label", "value"],
"properties": {
"label": {
"type": "string",
"description": "フィールドラベル(JSON pointer ではなくリテラル文字列でなければならない)"
},
"value": {
"type": "string",
"pattern": "^/",
"description": "JSON pointer 文字列としてのフィールド値(\"/\" で始まらなければならない)"
},
"language": {
"type": "string",
"description": "フィールド用の任意の BCP 47 言語タグ"
}
},
"additionalProperties": false
}
},
"validFrom": {
"type": "string",
"description": "リテラルの ISO 8601 日付文字列または JSON pointer としての有効期間開始日"
},
"validUntil": {
"type": "string",
"description": "リテラルの ISO 8601 日付文字列または JSON pointer としての有効期間終了日"
}
},
"additionalProperties": false
}
以下の例は、JSON pointer 文字列を含む有効な card テンプレートを示す:
{
"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"
}
card テンプレートの出力は、以下の構造に適合する JSON オブジェクトでなければならない:
| プロパティ | 型 | 説明 |
|---|---|---|
| name | 文字列 | クレデンシャルカードの必須の表示名。 |
| description | 文字列 | クレデンシャルカードの必須の説明テキスト。 |
| icon | 文字列 | カード上に表示するアイコンまたは画像の任意の URL または data URI。 |
| theme | マップ | 以下のプロパティを持つ任意のカラーテーマオブジェクト: |
| fields | リスト |
カスタムデータフィールドの必須の順序付きリスト。各フィールドは
以下を持つオブジェクトである:
|
| validFrom | 文字列 | クレデンシャルが有効になる時点を示す任意の ISO 8601 日付文字列。 |
| validUntil | 文字列 | クレデンシャルが有効でなくなる時点を示す任意の ISO 8601 日付文字列。 |
以下の例は、有効な card 出力を示す:
{
"name": "理学および芸術学士",
"description": "大学学位クレデンシャル",
"icon": "https://example.edu/icons/degree.svg",
"theme": {
"primaryColor": "#1a5490",
"accentColor": "#4a90e2"
},
"fields": [
{
"label": "機関",
"value": "例大学"
},
{
"label": "学位の種類",
"value": "BachelorDegree"
},
{
"label": "卒業日",
"value": "2010-05-15"
}
],
"validFrom": "2010-01-01T19:23:24Z",
"validUntil": null
}
以下の例では、完全に埋め込まれた JSON テンプレートがレンダリング テンプレートとして使用される。テンプレートは JSON pointer 文字列を使用してクレデンシャルデータを参照する。
{
...
"renderMethod": {
"type": "TemplateRenderMethod",
"renderSuite": "card",
// JSON テンプレートは VC に埋め込まれている
"template": "data:application/json;base64,eyJuYW1lIjogIi9jcmVkZW50aWFsU3ViamVjdC9kZWdyZWUvbmFtZSIsICJkZXNjcmlwdGlvbiI6ICJVbml2ZXJzaXR5IERlZ3JlZSBDcmVkZW50aWFsIiwgImZpZWxkcyI6IFt7ImxhYmVsIjogIkluc3RpdHV0aW9uIiwgInZhbHVlIjogIi9pc3N1ZXIifV19"
}
}
次の例では、Web 上の JSON テンプレートにリンクし、digestMultibase
プロパティを使用して変更から保護する。
{
...
"renderMethod": {
"type": "TemplateRenderMethod",
"renderSuite": "card",
"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": "TemplateRenderMethod",
"renderSuite": "card",
"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": "TemplateRenderMethod",
"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"
}
}
}
}
実装は、フィルタリング済みの検証可能な
クレデンシャルデータを使用して JavaScript が HTML テンプレートを安全に
レンダリングできる環境を提供しなければならない。
さらに、ホストページは、Oblivious HTTP [RFC9458]
または保護リレーを使用して要求元クライアントと要求先オリジンを関連付けないその他の手段を用いて、
行われるすべてのリクエスト(例えば template.id の参照解決)のプライバシーを
保護すべきである。
この環境を説明するために、以下の用語を使用する:
少なくとも、追跡およびその他のプライバシー侵害を防ぐため、この環境はナビゲーション、 外部コンテンツの読み込み、およびホストページへのアクセスを 防止しなければならない。
例えばブラウザベースの実装では、ホストページに対する
Content Security Policy [CSP3] の制限、
HTML テンプレートをホストする iframe のサンドボックス化、および
HTML テンプレートをラップして追加の CSP 制限を加え、
ホストページとの
ready および error イベント通信を提供するラッパーコードを組み合わせることで、
このような環境を提供できる。
ホストページ(通常はウォレットまたは検証可能な クレデンシャルのレンダラー)は、HTML テンプレートがトップレベル閲覧コンテキストを ナビゲートすること、外部コンテンツにアクセスすること、ホストページに アクセスすること、およびリモートコンテンツを読み込むことを 防止しなければならない。
ホストページが使用される場合、以下の規則が適用される:
frame-src 'none' を含めなければならない。
これにより、iframe では src の代わりに srcdoc の使用が強制され、
ブラウザによる HTML テンプレートの読み込みが防止される。その結果、
ホストページコードは、リモート参照されたテンプレート
コードを事前読み込みし、テンプレートをラッパーコードに挿入する前に、
レスポンスを対応する digestMultibase 値と照合するよう強制される。
iframe に sandbox="allow-scripts" を設定しなければならない。
<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 フラグメントでなければならない。
テンプレートコードには、
<html>、<head>、または
<body> タグを含めてはならない。
これらはラッパー
コードによって提供されるためである。
<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 ポリシーを追加するラッパーコードでラップしなければならない。
具体的には、ラッパー
コードは、テンプレート
コードによるネットワークリクエストの実行を防ぐため、
default-src data: 'unsafe-inline' という CSP 制限を
追加しなければならない。
<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 属性に挿入しなければならない。これにより、
ラッパー
コードおよびテンプレートコードに含まれる
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 は、レンダリングが完了したとき、またはレンダリング中にエラーが発生した場合に、
テンプレートからホストページへ通知できるようにする
通信チャネルを提供しなければならない。これは、
ラッパーコードによって設定された
MessageChannel とともに postMessage API を使用して実現できる。
以下に示す JavaScript は、上記のホストページに
追加され、MessageChannel を設定する iframe の
onload イベントを追加する。ホストページは、
ラッパーコードから ready
メッセージを受信したときに解決され、error メッセージを受信したときに
reject される Promise も作成する。ラッパーコードはさらに、
テンプレートがレンダリング完了をホストページに
通知したり、エラーメッセージを返したりするための window.renderMethodReady
メソッドを提供する。
// レンダリングの準備が完了したときに解決される Promise(または失敗した場合は
// reject される)。代わりに表示またはエラーを表示するために使用できる
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")) を呼び出してホストページに
エラーを通知したりできる。
レンダリング環境の設定は、レンダリングメソッド内で提供してもよい。 このオブジェクトの目的は、提供されたテンプレートをレンダリングする際の推奨される用途、 表示、および意図されたアクセスモードを提供することである。実装は、これらの設定が 提供された場合、それに従うべきである。
| プロパティ | 説明 |
|---|---|
| outputPreference | 提供されたテンプレートに対する優先レンダリング環境を表現する、 任意のマップ。 |
outputPreference オブジェクトには、以下のプロパティのいずれかを
含めてもよい:
| プロパティ | 説明 |
|---|---|
| accessMode |
以下で定義される auditory、tactile、
textual、または visual のうち、1 つ以上の
文字列値の
任意のリスト
https://w3c.github.io/cg-reports/a11y-discov-vocab/CG-FINAL-vocabulary-20260128/#accessMode-vocabulary
|
| mediaType | レンダリングに優先される、IANA メディアタイプに掲載された有効なメディアタイプを示す任意の文字列。この値は、 レンダリング前に追加処理を提案するときに使用してもよい。 例として、SVG テンプレートを静止画像に変換したり、 HTML 文書を PDF に変換したりすることが挙げられる。 |
| style | レンダリング環境で使用される可能性のあるスタイルプロパティを定義する、 任意のマップ。 |
style オブジェクトには、以下のプロパティのいずれかを
含めてもよい:
| プロパティ | 説明 |
|---|---|
| width |
iframe に設定する CSS 互換の優先幅を含む、
任意の文字列。
|
| height |
iframe に設定する CSS 互換の優先高さを含む、
任意の文字列。
|
nfc レンダリングスイートは、検証可能な
クレデンシャルを表すバイナリペイロードを、無線 NFC 接続を介して送信する。
以下の例では、完全に埋め込まれた NFC ペイロードがレンダリング テンプレートとして使用され、クレデンシャルに関連付けられたバーコード識別子のみを開示する。
{
...
"renderMethod": {
"type": "TemplateRenderMethod",
"renderSuite": "nfc",
"name": "タップして送信",
// NFC ペイロードが埋め込まれている
"template": "data:application/octet-stream;base64,2QZkpQGDG...G8XJWnROcY4Biw",
// NFC 経由ではバーコードのみが送信される
"renderProperty": ["/credentialSubject/barcode"]
}
...
}
以下の節では、レンダリングメソッドのためにこの仕様で使用される アルゴリズムについて概説する。
card テンプレートを処理する場合、以下の手順を実行しなければならない:
/ で始まる場合(JSON pointer であることを示す)、
検証可能な
クレデンシャルを対象文書として、
JavaScript Object Notation (JSON)
Pointer の JSON Pointer アルゴリズムを使用して評価する。
null を返した場合、その動作は
実装固有である。実装は空文字列を使用する、値を
null のままにする、またはエラーを通知してもよい。
/ で始まらない場合、リテラル文字列として扱い、
変更せずにそのままにする。
card 出力スキーマに対して検証する。
検証に失敗した場合、処理を停止しなければならず、エラーを返さなければならない。
複数のフィールドにまたがる複合データはサポートされないことに注意されたい。テンプレート内の 各フィールドは、クレデンシャルから単一の値へ解決される単一の JSON pointer を 参照する。
以下の節では、html レンダリングスイートが HTML テンプレートを安全にレンダリングするために
使用するアルゴリズムについて概説する。セキュリティおよびプライバシー上の結果と出力が同じである限り、
代替アルゴリズムを使用してもよい。
ホストページは、HTML テンプレートをホストする
iframe 要素を作成しなければならない。
ホストページは、ナビゲーションおよびトップレベルへのアクセスを
防止するため、iframe の sandbox 属性を
allow-scripts に設定しなければならない。
vc を、レンダリングする検証可能な
クレデンシャルとする。
renderMethod を、vc 内で選択された renderMethod
プロパティとし、ここで
renderMethod.type は TemplateRenderMethod、
renderMethod.renderSuite は html である。
renderMethod.template が文字列である場合、
template を
renderMethod.template の値とする。
renderMethod.template がマップである場合、
template を
renderMethod.template.id 内の URL を取得した結果とする。
ホストページは、検証可能な
クレデンシャル vc を、renderMethod.renderProperty が存在する場合には、
そこで指定されたプロパティのみを含むようにフィルタリングしなければならない。
renderMethod.renderProperty が存在しない場合は、検証可能な
クレデンシャル全体が
使用される。
このフィルタリングは、Data Integrity ECDSA Cryptosuites v1.0 仕様 [VC-DI-ECDSA] の
セクション 3.4.13 selectJsonLd
で定義された selectJsonLd アルゴリズムを、
renderMethod.renderProperty に存在する JSON Pointer [RFC6901] 値に適用することによって
実行しなければならない。
ホストページは、フィルタリングされた 検証可能な クレデンシャルと HTML テンプレートを、上記で定義されたラッパーコードテンプレートに埋め込むことによって、 ラッパーコードを作成しなければならない。
wrapperCode を、<head> 内に <meta http-equiv="Content-Security-Policy"
content="default-src data: 'unsafe-inline'"> を持つ HTML Document とする。
datablock を、type が
application/vc である HTML Data Block とする。
datablock の内容を、フィルタリングされた検証可能な
クレデンシャルを
文字列化した JSON 形式に設定する。
datablock を wrapperCode の <head> に挿入する。
template の値を wrapperCode の <body> に
挿入する。
ホストページは、iframe の
srcdoc 属性を、結果として得られたラッパーコードに設定しなければならない。
iframe の srcdoc 属性を、
wrapperCode を文字列化した HTML に設定する。
ホストページは、上記の説明に従って
ready および error メッセージを受信するため、
ラッパーコードとの通信
チャネルを設定しなければならない。
renderPromise を、以下の動作をする新しい Promise とする:
resolve 時には、iframe をユーザーに表示するために使用できる。
reject 時には、エラーメッセージをユーザーに表示する。
iframe の onload イベント内で:
channel を新しい MessageChannel とする。
channel に新しい port1 リスナーを作成して開始し、
wrapperCode を介して iframe に挿入された
template 内のコードからの ready
メッセージを待ち受ける。
port1 リスナーで ready メッセージを受信した場合、
renderPromise を resolve する。
error メッセージを受信した場合、エラー
メッセージを使用して renderPromise を reject する。
postMessage を使用して、channel の port2 を
iframe のコンテンツウィンドウへ送信する。
ホストページは、レンダリングが完了した時点、または
レンダリング中にエラーが発生したかどうかを判断するため、
renderPromise を使用すべきである。
ラッパーコードは、
MessageChannel を介してホストページからの通信を受信するように
設定しなければならず、テンプレートコードが使用する
window.renderMethodReady メソッドを提供しなければならない。
この節は非規範的である。
この節では、レンダリングメソッドの公開、取得、および処理に関連する セキュリティおよびプライバシー上の考慮事項を扱う、この仕様の脅威モデルを 要約する。対応策およびデータフロー図を含む完全な分析は、 検証可能なクレデンシャルのレンダリングメソッド脅威 モデルで提供されている。
読者には、この節を読む前に、 検証可能なクレデンシャルのデータモデル v2.1 仕様の 脅威モデル節で 提供されている一般的な脅威モデルについて理解しておくことが強く推奨される。実装者には、 その仕様で提供されている一般的な分析を、この仕様が提供する 各具体的な機能に適用することが期待される。
html レンダリングスイートはテンプレートが提供するコードを実行し、
信頼されていない入力であるクレデンシャル値を使用するため、形式が正しく、
検証済みのクレデンシャル内に含まれて到達した悪意のあるコンテンツが、レンダリング中に
周囲のホストページへアクセスしたり、別の場所へナビゲートしたり、
外部の場所へ接続したりしようとする可能性がある。
html レンダリングスイートは、選択されたレンダリング環境によって提供される
隔離に依存しているため、サンドボックスからの脱出、ポリシーの回避、または
テンプレートとホスト間の分離の破壊を可能にする欠陥は、レンダリングメソッドが
仕様どおりに使用されている場合でも、レンダリング処理の欠陥となる。
W3C は包括的な脅威モデリング手法へ移行しており、 新しい仕様におけるセキュリティ上の考慮事項の節を 廃止する過程にある。 セキュリティ上の考慮事項に関連する文書については、付録 A. 脅威モデルを参照されたい。
W3C は包括的な脅威モデリング手法へ移行しており、 新しい仕様におけるプライバシー上の考慮事項の節を廃止する過程にある。 プライバシー上の考慮事項に関連する文書については、付録 A. 脅威モデルを参照されたい。
この節は非規範的である。
発行者が推奨する、人間が知覚可能な検証可能なクレデンシャルの提示を伝達するために、 既存のいくつかのアプローチと技術が検討されました。 このセクションでは、それらの代替案と、この仕様で説明されているレンダリング方法の アプローチが選択された理由を要約します。
メカニズムを定義せず、提示を保有者または検証者の ソフトウェアに委ねる場合、追加データは必要ありませんが、発行者には意図した提示を伝達する手段が ないため、クレデンシャルのレンダリングに一貫性がなくなり、クレームまたは ブランド表現が誤って伝えられる可能性があります。これは、 制御されていない クレデンシャルの提示で説明されています。 ISO/IEC 18013-5モバイル運転 免許証(mDL)やJSON Web Token (RFC 7519)などのクレデンシャル 形式はこのアプローチを採用しており、クレデンシャルが保持するクレームを定義する一方で、その 提示は利用側のソフトウェアに委ねています。現在は廃止されているMicrosoftの Information Card (CardSpace)は、この限定的な変種を採用し、 発行者が提供できるのは、 アイデンティティセレクターが統一されたカード外観でレンダリングする カード名とロゴのみに限られていました。この仕様では、クライアント決定レンダリングを禁止するのではなく、 発行者によって表明される代替手段を追加します。
レジストリを介してクレデンシャルタイプごとに提示を標準化すると、よく知られた タイプでは一貫したレンダリングが得られますが、各タイプに関する事前知識が必要となり、 カスタムクレデンシャルへの拡張性がなく、発行者固有のブランド表現を表現できません。 Apple Wallet (PassKit)、 Google Wallet、および Samsung Walletなどのプラットフォームウォレットは、この アプローチを採用しており、あらかじめ定義された固定的なパスまたはオブジェクトタイプの集合を、 プラットフォームによって制御された固定レイアウトでレンダリングします。この場合、発行者はフィールド値 とアセットを入力できますが、プラットフォームのカタログ外のレイアウトやブランド表現を表現することはできません。 一方、この仕様で定義されるレンダリング方法の戦略は、クレデンシャルとともに伝達されるか、 クレデンシャルから参照されるため、未知のタイプであっても、その 発行者が意図したとおりにレンダリングできます。
このような中央集権的で、制御された、レジストリ重視の解決策は、 分散型識別子(DID)および 検証可能なクレデンシャル(VC)の エコシステムの一部として別途規定されている、分散型、非中央集権型、かつ許可不要の パターンにも反します。
完全にレンダリングされたPDF、静的SVG、またはHTML文書の配布は、 自己完結型で広くサポートされていますが、そのようなスナップショットは 選択的開示に適応せず、検証済みデータから再レンダリングすることもできず、 保護された内容にも結び付けられていません。この仕様では、これらの形式を完成済み 文書としてではなく、レンダリング時にクレーム値と組み合わせるテンプレートとして 再利用します。
この仕様では、新たな完全性メカニズムを定義するのではなく、 検証可能なクレデンシャルのデータ完全性 1.0などの既存の保護メカニズム、および digestMultibaseプロパティを使用して、 参照されるテンプレートをクレデンシャルに 結び付けます。読者は、 保護されていない外部リソースの改ざんという脅威について、 検証可能なクレデンシャルの脅威モデルで読むことにより、これらの一般的な 保護メカニズムについて学ぶことができます。
SD-JWT VCは、
固定されたスタイル属性の集合をサポートするsimple方式と、
あらゆるコード実行を禁止し、SVG内のテキストプレースホルダーにクレーム値を代入する
svg_templates方式のいずれかを選択するためのrenderingプロパティを定義します。
グループはこのアプローチを検討しましたが、実際のユースケースには制約が多すぎると判断しました。
プレースホルダーはテキストノード内にのみ出現し、コードを実行できないため、
条件付きフィールド、可変長リスト、値の書式設定、
レスポンシブレイアウトなどのデータ駆動型提示ツールを表現できません。これらの
機能は、医療、小売、および
銀行・金融などの分野で要件となります。対照的に、この仕様は単一の
クレデンシャルシリアル化方式に依存せず、
コード不要の宣言型cardスイート、隔離された「サンドボックス化」環境で実行されるデータ駆動型htmlスイート、
および静的なnfcスイートにまたがるレンダリングスイートを定義します。
Referenced in:
Referenced in: