検証可能なクレデンシャルのレンダリング方法 v1.0

W3C 作業草案

この文書に関する詳細
このバージョン:
https://www.w3.org/TR/2026/WD-vc-render-method-20260822/
最新公開バージョン:
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 Digital Credentials Consortium)
Manu Sporny (Digital Bazaar)
Patrick St. Louis (Open Security and Identity)
Isaac KOH (シンガポール情報通信メディア開発庁)
著者:
Manu Sporny (Digital Bazaar)
Dmitri Zagidulin (MIT Digital Credentials Consortium)
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 用語

この文書全体で使用される一部の用語は、 検証可能なクレデンシャル・データモデル v2.1仕様の 用語セクションで定義されています。

1.2 適合性

非規範的と明示された節に加え、この仕様のすべての作成ガイドライン、図、例、および注記は 非規範的である。この仕様のそれ以外のすべては規範的である。

本文書におけるキーワード してもよいしなければならないしては ならない任意推奨される必須、および すべきであるは、 BCP 14 [RFC2119] [RFC8174] に記述されているとおりに解釈しなければならないが、それは、ここに示すように、それらがすべて 大文字で表記されている場合に限られる。

適合レンダーメソッドとは、この仕様の規範的な記述に準拠するデータ モデルの具体的な表現をいう。 具体的には、本文書の 2. データモデルおよび3. アルゴリズム の各節にある関連するすべての規範的な記述を遵守しなければならない

適合プロセッサとは、 適合レンダーメソッドを生成または消費する、 ソフトウェアおよび/またはハードウェアとして実現された任意のアルゴリズムをいう。適合プロセッサはしなければならない 非適合文書を 消費した場合にエラーを生成する。

本文書には、JSON および JSON-LD の内容を含む例もある。これらの 例の一部には、インラインコメント(//)や、 例にほとんど価値を加えない情報を示すための省略記号(...)の使用など、 JSON として無効な文字が含まれている。実装者がこの情報を有効な JSON または JSON-LD として使用したい場合は、この内容を削除するよう注意されたい。

2. データモデル

以下の節では、レンダリングメソッドのためにこの仕様で使用される データモデルについて概説する

2.1 renderMethod プロパティ

renderMethodプロパティは、 検証可能なクレデンシャル・データモデル v2.1仕様において予約済みの拡張ポイントです。発行者は、このプロパティを 検証可能なクレデンシャル で使用して、1つ以上の優先するレンダリング方法を表現できます。

renderMethod
renderMethod プロパティの値は、ソフトウェアが視覚、聴覚、または触覚の 仕組みを使用して検証可能な クレデンシャルを表現するために使用できる、1 つ以上のレンダリングメソッドを 指定しなければならない。各 renderMethod 値は、その type、例えば TemplateRenderMethod を指定しなければならない。 各レンダリングヒントの正確な内容は、特定の renderMethod type の定義によって決定される。

2.2 TemplateRenderMethod

発行者検証可能なクレデンシャル に対してテンプレートベースのレンダリング指示を指定したい場合、 以下で説明するデータモデルを使用する renderMethod プロパティを追加してもよい

プロパティ 説明
id URL Standard に従い、取得された場合に レンダリングテンプレートを参照解決する、任意文字列
type 値が TemplateRenderMethodなければならない必須文字列
renderSuite 具体的なレンダリングを生成するために使用されるアルゴリズムを 識別する、必須文字列
name 実行されるレンダリングの種類に関するヒントを提供するために表示できる、 人間が読める任意文字列。このプロパティは、 個人が複数の表示モードから選択できるグラフィカルインターフェイスで 使用される場合がある。
description 特定のレンダリングが有用となり得る場合について、name よりも 詳細な説明を提供する、人間が読める任意文字列
renderProperty それぞれが JavaScript Object Notation (JSON) Pointer 構文に適合する文字列値の任意リストであり、この特定のレンダリングメソッドを 使用するときに検証可能な クレデンシャルのどのプロパティが公開されるかを指定する。 renderProperty が提供されない場合、レンダリングメソッドが使用されるときには 検証可能な クレデンシャル全体が共有されるものと推定される。
template レンダリングの実行に使用されるテンプレートを提供または参照する、 任意URL またはマップ。 値がURLである場合、 テンプレートコードを含む data: URL [RFC2397] であってもよい。値がマップである場合、以下の規則に 適合しなければならない
プロパティ 説明
id URL Standard に従い、 取得された場合に SVG または PDF ファイルなどのテンプレートを 参照解決する、必須文字列
mediaType メディアタイプの 仕様および登録手続きで指定される、 id 値のメディアタイプを識別する推奨される 文字列
digestMultibase テンプレートファイルの multibase エンコードされた Multihash(任意)。multibase 値は u (base64url-nopad) でなければならず、 multihash 値は 256 ビット出力の SHA-2 (0x12) でなければならない
digestMultibase id が指定されている場合に参照されるレンダリングメソッドの、 multibase エンコードされた Multihash(任意)。 multibase 値は u (base64url-nopad) でなければならず、multihash 値は 256 ビット出力の SHA-2 (0x12) でなければならない

2.2.1 card レンダリング スイート

card レンダリングスイートは、JSON テンプレートを使用して 検証可能な クレデンシャルを標準化されたデータ表示形式に変換する。この形式により、 ウォレットは重要なデータを強調し、追加フィールドを設定可能なレスポンシブなカードレイアウトで クレデンシャルを表示できる。このメソッドを実装するウォレットは、標準化された JSON 出力を 独自のカード UI デザインでレンダリングできるため、ウォレットが特定のクレデンシャルタイプを ネイティブでサポートしていない場合でもクレデンシャルを表示できる。

テンプレートは、card 出力構造に一致する JSON オブジェクトである。 テンプレート内の文字列値には、検証可能な クレデンシャル内のフィールドを参照する JSON pointer 文字列 (JavaScript Object Notation (JSON) Pointer で指定)を使用できる。テンプレートを処理する際、 JSON pointer 文字列はクレデンシャルデータに対して評価され、解決された値に置き換えられる。 テンプレートは、以下で定義される JSON テンプレートスキーマに適合しなければならず、 結果の出力は card 出力スキーマに適合しなければならない。複数の フィールドにまたがる複合データはサポートされず、各フィールドは単一の JSON pointer を参照する。

2.2.1.1 JSON テンプレートスキーマ

card レンダリングスイートのテンプレートは、以下の構造に適合する JSON オブジェクトでなければならない。 テンプレート構造は出力構造に一致するが、文字列値にはリテラル文字列または 検証可能な クレデンシャル内のフィールドを参照する JSON pointer 文字列(/ で始まる)を使用できる。テンプレートは処理前にこの スキーマに対して検証すべきである

プロパティ 説明
name 文字列 リテラルの表示名、またはクレデンシャルデータを参照する JSON pointer 文字列(例: "/credentialSubject/degree/name")のいずれかである必須の文字列。
description 文字列 リテラルの説明、またはクレデンシャルデータを参照する JSON pointer 文字列のいずれかである必須の文字列。
icon 文字列 リテラルの URL/data URI、またはクレデンシャルデータを参照する JSON pointer 文字列のいずれかである任意の文字列。
theme マップ 以下のプロパティを持つ任意のカラーテーマオブジェクト:
  • primaryColor (文字列): リテラル文字列または JSON pointer としてのプライマリカラー
  • accentColor (文字列): リテラル文字列または JSON pointer としてのアクセントカラー
fields リスト カスタムデータフィールドの必須の順序付きリスト。各フィールドは 以下を持つオブジェクトである:
validFrom 文字列 リテラルの ISO 8601 日付、またはクレデンシャルデータ(有効期間の開始日)を 参照する JSON pointer 文字列のいずれかである任意の文字列。
validUntil 文字列 リテラルの ISO 8601 日付、またはクレデンシャルデータ(有効期間の終了日)を 参照する JSON pointer 文字列のいずれかである任意の文字列。

以下の JSON Schema は、上記で定義されたテンプレート構造の規則を実装している:

1: カードテンプレート用 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 テンプレートを示す:

2: カードテンプレートの例
{
  "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"
}
2.2.1.2 カード出力スキーマ

card テンプレートの出力は、以下の構造に適合する JSON オブジェクトでなければならない:

プロパティ 説明
name 文字列 クレデンシャルカードの必須の表示名。
description 文字列 クレデンシャルカードの必須の説明テキスト。
icon 文字列 カード上に表示するアイコンまたは画像の任意の URL または data URI。
theme マップ 以下のプロパティを持つ任意のカラーテーマオブジェクト:
  • primaryColor (文字列): 背景および ハイライト用のプライマリカラー
  • accentColor (文字列): ハイライトおよび 強調用のアクセントカラー
fields リスト カスタムデータフィールドの必須の順序付きリスト。各フィールドは 以下を持つオブジェクトである:
validFrom 文字列 クレデンシャルが有効になる時点を示す任意の ISO 8601 日付文字列。
validUntil 文字列 クレデンシャルが有効でなくなる時点を示す任意の ISO 8601 日付文字列。

以下の例は、有効な card 出力を示す:

3: カード出力の例
{
  "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 文字列を使用してクレデンシャルデータを参照する。

4: card レンダリングスイートの基本的な使用法
{
  ...
  "renderMethod": {
    "type": "TemplateRenderMethod",
    "renderSuite": "card",
    // JSON テンプレートは VC に埋め込まれている
    "template": "data:application/json;base64,eyJuYW1lIjogIi9jcmVkZW50aWFsU3ViamVjdC9kZWdyZWUvbmFtZSIsICJkZXNjcmlwdGlvbiI6ICJVbml2ZXJzaXR5IERlZ3JlZSBDcmVkZW50aWFsIiwgImZpZWxkcyI6IFt7ImxhYmVsIjogIkluc3RpdHV0aW9uIiwgInZhbHVlIjogIi9pc3N1ZXIifV19"
  }
}

次の例では、Web 上の JSON テンプレートにリンクし、digestMultibase プロパティを使用して変更から保護する。

5: card レンダリングテンプレート用のリモートホストされた JSON テンプレート
{
...
"renderMethod": {
  "type": "TemplateRenderMethod",
  "renderSuite": "card",
  "template": {
    // この JSON テンプレートは Web から取得される
    "id": "https://degree.example/credential-templates/bachelors.json",
    "mediaType": "application/json",
    "digestMultibase": "zQmerWC85Wg6wFl9znFCwYxApG270iEu5h6JqWAPdhyxz2dR"
  }
}

次の例では、Web 上のレンダリングテンプレートにリンクし、 digestMultibase プロパティを使用して保護する:

6: リモートホストされた card レンダリングメソッド
{
...
"renderMethod": {
  // このレンダリングメソッドは Web から取得される
  "id": "https://degrees.example/bachelors-card.jsonld",
  "mediaType": "application/ld+json",
  "type": "TemplateRenderMethod",
  "renderSuite": "card",
  "digestMultibase": "zQmG270iEu5h6JqWAPdhyxz2dRerWC85Wg6wFl9znFCwYxAp"
}

2.2.2 html レンダリング スイート

html レンダリングスイートにより、テンプレート作成者は 検証可能な クレデンシャルをレンダリングするための HTML テンプレートを提供できる。 HTML は、template または template.idtemplate の値がオブジェクトの場合)の値として、 リモート参照または data: URL 経由で参照できる。HTML フラグメント内の JavaScript は、 HTML テンプレートとともにサンドボックス化された iframe 内でホストされる HTML データブロック (すなわち <script type="application/vc"></script>)を介して提供される、 フィルタリング済みの検証可能な クレデンシャルデータをレンダリングする役割を担う。

7: 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": "発行者"
  },
  "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 の参照解決)のプライバシーを 保護すべきである

この環境を説明するために、以下の用語を使用する:

ホストページ
HTML テンプレートをレンダリングするための安全な環境を提供する。
テンプレート コード
レンダリングメソッド内で提供される、またはリモートから参照される HTML フラグメント。
ラッパー コード
HTML テンプレートをラップして、追加のセキュリティ制限とホストページとの通信を提供するコード。

少なくとも、追跡およびその他のプライバシー侵害を防ぐため、この環境はナビゲーション、 外部コンテンツの読み込み、およびホストページへのアクセスを 防止しなければならない

例えばブラウザベースの実装では、ホストページに対する Content Security Policy [CSP3] の制限、 HTML テンプレートをホストする iframe のサンドボックス化、および HTML テンプレートをラップして追加の CSP 制限を加え、 ホストページとの ready および error イベント通信を提供するラッパーコードを組み合わせることで、 このような環境を提供できる。

1 ホストページと iframe + ラッパーコード間の通信
2.2.2.1 ホストページ

ホストページ(通常はウォレットまたは検証可能な クレデンシャルのレンダラー)は、HTML テンプレートがトップレベル閲覧コンテキストを ナビゲートすること、外部コンテンツにアクセスすること、ホストページに アクセスすること、およびリモートコンテンツを読み込むことを 防止しなければならない

ホストページが使用される場合、以下の規則が適用される:

  • Content Security Policy (CSP) の制限には frame-src 'none' を含めなければならない。 これにより、iframe では src の代わりに srcdoc の使用が強制され、 ブラウザによる HTML テンプレートの読み込みが防止される。その結果、 ホストページコードは、リモート参照されたテンプレート コードを事前読み込みし、テンプレートをラッパーコードに挿入する前に、 レスポンスを対応する digestMultibase 値と照合するよう強制される。
  • ナビゲーションとトップレベルへのアクセスを防ぐため、HTML テンプレートをホストする iframesandbox="allow-scripts" を設定しなければならない
8: 最小限のホストページ
<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.2.1.1 テンプレートコード

renderMethod 内の template プロパティによって参照される HTML テンプレートコードは、検証可能な クレデンシャルをレンダリングするために必要な HTML、CSS、 および JavaScript を含む HTML フラグメントでなければならないテンプレートコードには、 <html><head>、または <body> タグを含めてはならない。 これらはラッパー コードによって提供されるためである。

9: HTML テンプレートフラグメントの例
<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>
2.2.2.1.2 ラッパーコード

テンプレート HTML フラグメントは、部分的な検証可能な クレデンシャルを含むデータブロックを提供し、ナビゲーションおよび外部コンテンツの 読み込みを防ぐ追加の CSP ポリシーを追加するラッパーコードでラップしなければならない。 具体的には、ラッパー コードは、テンプレート コードによるネットワークリクエストの実行を防ぐため、 default-src data: 'unsafe-inline' という CSP 制限を 追加しなければならない

10: 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 属性に挿入しなければならない。これにより、 ラッパー コードおよびテンプレートコードに含まれる JavaScript が実行される。

11: テンプレートとクレデンシャルを含む 結合済みラッパーコード
<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>
2.2.2.1.3 Ready および Error イベント

ラッパーコードで作成される iframe は、レンダリングが完了したとき、またはレンダリング中にエラーが発生した場合に、 テンプレートからホストページへ通知できるようにする 通信チャネルを提供しなければならない。これは、 ラッパーコードによって設定された MessageChannel とともに postMessage API を使用して実現できる。

以下に示す JavaScript は、上記のホストページに 追加され、MessageChannel を設定する iframe の onload イベントを追加する。ホストページは、 ラッパーコードから ready メッセージを受信したときに解決され、error メッセージを受信したときに reject される Promise も作成する。ラッパーコードはさらに、 テンプレートがレンダリング完了をホストページに 通知したり、エラーメッセージを返したりするための window.renderMethodReady メソッドを提供する。

12: MessageChannel を設定するための ホストページへの追加
// レンダリングの準備が完了したときに解決される 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);
});
13: MessageChannel に接続し `renderMethodReady` を作成するためのラッパーコードへの追加
// 親ウィンドウから通信ポートを取得して解決される 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")) を呼び出してホストページに エラーを通知したりできる。

2.2.2.2 出力設定

レンダリング環境の設定は、レンダリングメソッド内で提供してもよい。 このオブジェクトの目的は、提供されたテンプレートをレンダリングする際の推奨される用途、 表示、および意図されたアクセスモードを提供することである。実装は、これらの設定が 提供された場合、それに従うべきである

プロパティ 説明
outputPreference 提供されたテンプレートに対する優先レンダリング環境を表現する、 任意マップ

outputPreference オブジェクトには、以下のプロパティのいずれかを 含めてもよい:

プロパティ 説明
accessMode 以下で定義される auditorytactiletextual、または 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 互換の優先高さを含む、 任意文字列

2.2.3 nfc レンダリング スイート

nfc レンダリングスイートは、検証可能な クレデンシャルを表すバイナリペイロードを、無線 NFC 接続を介して送信する。

以下の例では、完全に埋め込まれた NFC ペイロードがレンダリング テンプレートとして使用され、クレデンシャルに関連付けられたバーコード識別子のみを開示する。

14: nfc レンダリングスイートの使用法
{
...
"renderMethod": {
  "type": "TemplateRenderMethod",
  "renderSuite": "nfc",
  "name": "タップして送信",
  // NFC ペイロードが埋め込まれている
  "template": "data:application/octet-stream;base64,2QZkpQGDG...G8XJWnROcY4Biw",
  // NFC 経由ではバーコードのみが送信される
  "renderProperty": ["/credentialSubject/barcode"]
}
...
}

3. アルゴリズム

以下の節では、レンダリングメソッドのためにこの仕様で使用される アルゴリズムについて概説する。

3.1 カードテンプレート処理

card テンプレートを処理する場合、以下の手順を実行しなければならない:

  1. 上記で定義された JSON テンプレートスキーマに対してテンプレート JSON オブジェクトを 検証する。検証に失敗した場合、処理を停止しなければならず、エラーを返さなければならない
  2. テンプレートオブジェクト内の各文字列値について:
    1. 文字列値が / で始まる場合(JSON pointer であることを示す)、 検証可能な クレデンシャルを対象文書として、 JavaScript Object Notation (JSON) Pointer の JSON Pointer アルゴリズムを使用して評価する。
    2. JSON pointer の評価が成功した場合、JSON pointer 文字列を 解決された値に置き換える。解決された値が文字列でない場合は、 文字列表現に変換する。
    3. JSON pointer の評価が失敗するか null を返した場合、その動作は 実装固有である。実装は空文字列を使用する、値を null のままにする、またはエラーを通知してもよい
    4. 文字列値が / で始まらない場合、リテラル文字列として扱い、 変更せずにそのままにする。
  3. 結果の JSON オブジェクトを card 出力スキーマに対して検証する。 検証に失敗した場合、処理を停止しなければならず、エラーを返さなければならない

複数のフィールドにまたがる複合データはサポートされないことに注意されたい。テンプレート内の 各フィールドは、クレデンシャルから単一の値へ解決される単一の JSON pointer を 参照する。

3.2 HTML テンプレート処理

以下の節では、html レンダリングスイートが HTML テンプレートを安全にレンダリングするために 使用するアルゴリズムについて概説する。セキュリティおよびプライバシー上の結果と出力が同じである限り、 代替アルゴリズムを使用してもよい

3.2.1 ホストページ

ホストページは、HTML テンプレートをホストする iframe 要素を作成しなければならないホストページは、ナビゲーションおよびトップレベルへのアクセスを 防止するため、iframesandbox 属性を allow-scripts に設定しなければならない

  1. vc を、レンダリングする検証可能な クレデンシャルとする。
  2. renderMethod を、vc 内で選択された renderMethod プロパティとし、ここで renderMethod.typeTemplateRenderMethodrenderMethod.renderSuitehtml である。
  3. renderMethod.template文字列である場合、 templaterenderMethod.template の値とする。
  4. renderMethod.templateマップである場合、 templaterenderMethod.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 テンプレートを、上記で定義されたラッパーコードテンプレートに埋め込むことによって、 ラッパーコードを作成しなければならない

  1. wrapperCode を、<head> 内に <meta http-equiv="Content-Security-Policy" content="default-src data: 'unsafe-inline'"> を持つ HTML Document とする。
  2. datablock を、typeapplication/vc である HTML Data Block とする。
  3. datablock の内容を、フィルタリングされた検証可能な クレデンシャルを 文字列化した JSON 形式に設定する。
  4. datablockwrapperCode<head> に挿入する。
  5. template の値を wrapperCode<body> に 挿入する。

ホストページは、iframesrcdoc 属性を、結果として得られたラッパーコードに設定しなければならない

  1. iframesrcdoc 属性を、 wrapperCode を文字列化した HTML に設定する。

ホストページは、上記の説明に従って ready および error メッセージを受信するため、 ラッパーコードとの通信 チャネルを設定しなければならない

  1. renderPromise を、以下の動作をする新しい Promise とする:
    1. resolve 時には、iframe をユーザーに表示するために使用できる。
    2. reject 時には、エラーメッセージをユーザーに表示する。
  2. iframeonload イベント内で:
    1. channel を新しい MessageChannel とする。
    2. channel に新しい port1 リスナーを作成して開始し、 wrapperCode を介して iframe に挿入された template 内のコードからの ready メッセージを待ち受ける。
    3. port1 リスナーで ready メッセージを受信した場合、 renderPromise を resolve する。 error メッセージを受信した場合、エラー メッセージを使用して renderPromise を reject する。
    4. postMessage を使用して、channelport2iframe のコンテンツウィンドウへ送信する。

ホストページは、レンダリングが完了した時点、または レンダリング中にエラーが発生したかどうかを判断するため、 renderPromise を使用すべきである

3.2.2 ラッパーコード

ラッパーコードは、 MessageChannel を介してホストページからの通信を受信するように 設定しなければならずテンプレートコードが使用する window.renderMethodReady メソッドを提供しなければならない

  1. window.onload イベント内で...
    1. port を、message イベントを介してホストページから受信した MessagePort とする。
    2. 以下の動作をする window.renderMethodReady 関数を作成する...
      1. 引数なしで呼び出された場合、port を介してホストページready メッセージを送信する。
      2. Error 引数を指定して呼び出された場合、エラーメッセージを含む error メッセージを、port を介してホストページへ 送信する。

A. 脅威モデル

この節は非規範的である。

この節では、レンダリングメソッドの公開、取得、および処理に関連する セキュリティおよびプライバシー上の考慮事項を扱う、この仕様の脅威モデルを 要約する。対応策およびデータフロー図を含む完全な分析は、 検証可能なクレデンシャルのレンダリングメソッド脅威 モデルで提供されている。

読者には、この節を読む前に、 検証可能なクレデンシャルのデータモデル v2.1 仕様の 脅威モデル節で 提供されている一般的な脅威モデルについて理解しておくことが強く推奨される。実装者には、 その仕様で提供されている一般的な分析を、この仕様が提供する 各具体的な機能に適用することが期待される。

A.1 対象となる脅威

  1. 制御されていないクレデンシャルの提示 セキュリティ - 発行者が表明したレンダリングメソッドがない場合、 検証可能な クレデンシャルをどのように表示するかの選択は、完全に保持者または検証者 のソフトウェアに委ねられるため、 主張を省略したり、フィールドの順序やラベルを変更したり、有効性情報を削除したり、 誤解を招くブランディングを適用したりできる。その結果、クレデンシャルが真正であっても、 観察者は発行者が証明した内容について 誤った理解を形成する可能性がある。

A.2 実装上の脅威

  1. 信頼されていないデータの安全でないレンダリング セキュリティ - html レンダリングスイートはテンプレートが提供するコードを実行し、 信頼されていない入力であるクレデンシャル値を使用するため、形式が正しく、 検証済みのクレデンシャル内に含まれて到達した悪意のあるコンテンツが、レンダリング中に 周囲のホストページへアクセスしたり、別の場所へナビゲートしたり、 外部の場所へ接続したりしようとする可能性がある。

A.3 デプロイメント上の脅威

  1. テンプレートおよびリソース取得を介した追跡 プライバシー - テンプレートまたはそれが参照するリソースをその場所から取得すると、 クレデンシャルがレンダリングされていることが発行者または ホストに明らかになり、クレデンシャルごとの場所や外向きリクエストに エンコードされたクレデンシャルデータによって、各レンダリングが 追跡または情報流出のシグナルとなる。

A.4 外部の脅威

  1. 有害なレンダリング出力 セキュリティ - レンダリングテンプレートは視覚、聴覚、および触覚の出力を制御するため、 悪意のあるテンプレートは、それを閲覧する人に害を与えるよう作成できる。例えば、 基礎となるクレデンシャルが真正であっても、発作を引き起こす可能性のある 点滅パターンや、突然の不快な音を使用できる。

A.5 依存関係の脅威

  1. 継承されたレンダリング環境の攻撃対象領域 セキュリティ - html レンダリングスイートは、選択されたレンダリング環境によって提供される 隔離に依存しているため、サンドボックスからの脱出、ポリシーの回避、または テンプレートとホスト間の分離の破壊を可能にする欠陥は、レンダリングメソッドが 仕様どおりに使用されている場合でも、レンダリング処理の欠陥となる。

セキュリティ上の考慮事項

W3C は包括的な脅威モデリング手法へ移行しており、 新しい仕様におけるセキュリティ上の考慮事項の節を 廃止する過程にある。 セキュリティ上の考慮事項に関連する文書については、付録 A. 脅威モデルを参照されたい。

プライバシー上の考慮事項

W3C は包括的な脅威モデリング手法へ移行しており、 新しい仕様におけるプライバシー上の考慮事項の節を廃止する過程にある。 プライバシー上の考慮事項に関連する文書については、付録 A. 脅威モデルを参照されたい。

B. 他の技術との関係

この節は非規範的である。

発行者が推奨する、人間が知覚可能な検証可能なクレデンシャルの提示を伝達するために、 既存のいくつかのアプローチと技術が検討されました。 このセクションでは、それらの代替案と、この仕様で説明されているレンダリング方法の アプローチが選択された理由を要約します。

クライアント決定レンダリング

メカニズムを定義せず、提示を保有者または検証者の ソフトウェアに委ねる場合、追加データは必要ありませんが、発行者には意図した提示を伝達する手段が ないため、クレデンシャルのレンダリングに一貫性がなくなり、クレームまたは ブランド表現が誤って伝えられる可能性があります。これは、 制御されていない クレデンシャルの提示で説明されています。 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文書などの提示形式

完全にレンダリングされたPDF、静的SVG、またはHTML文書の配布は、 自己完結型で広くサポートされていますが、そのようなスナップショットは 選択的開示に適応せず、検証済みデータから再レンダリングすることもできず、 保護された内容にも結び付けられていません。この仕様では、これらの形式を完成済み 文書としてではなく、レンダリング時にクレーム値と組み合わせるテンプレートとして 再利用します。

データ完全性および証明メカニズム

この仕様では、新たな完全性メカニズムを定義するのではなく、 検証可能なクレデンシャルのデータ完全性 1.0などの既存の保護メカニズム、および digestMultibaseプロパティを使用して、 参照されるテンプレートをクレデンシャルに 結び付けます。読者は、 保護されていない外部リソースの改ざんという脅威について、 検証可能なクレデンシャルの脅威モデルで読むことにより、これらの一般的な 保護メカニズムについて学ぶことができます。

SD-JWT VCタイプメタデータのレンダリング

SD-JWT VCは、 固定されたスタイル属性の集合をサポートするsimple方式と、 あらゆるコード実行を禁止し、SVG内のテキストプレースホルダーにクレーム値を代入する svg_templates方式のいずれかを選択するためのrenderingプロパティを定義します。 グループはこのアプローチを検討しましたが、実際のユースケースには制約が多すぎると判断しました。 プレースホルダーはテキストノード内にのみ出現し、コードを実行できないため、 条件付きフィールド、可変長リスト、値の書式設定、 レスポンシブレイアウトなどのデータ駆動型提示ツールを表現できません。これらの 機能は、医療、小売、および 銀行・金融などの分野で要件となります。対照的に、この仕様は単一の クレデンシャルシリアル化方式に依存せず、 コード不要の宣言型cardスイート、隔離された「サンドボックス化」環境で実行されるデータ駆動型htmlスイート、 および静的なnfcスイートにまたがるレンダリングスイートを定義します。

C. 参考文献

C.1 規範的参考文献

[BCP47]
言語を識別するためのタグ。 IETF。URL: https://www.rfc-editor.org/info/bcp47
[CSP3]
コンテンツセキュリティポリシーレベル3。Mike West; Antonio Sartori。W3C。2026年8月13日。W3C作業草案。URL: https://www.w3.org/TR/CSP3/
[infra]
Infra標準。Anne van Kesteren; Domenic Denicola。WHATWG。現行標準。URL: https://infra.spec.whatwg.org/
[RFC2119]
要求レベルを示すためにRFCで使用する キーワード。S. Bradner。IETF。1997年3月。現行のベストプラクティス。URL: https://www.rfc-editor.org/info/rfc2119/
[RFC2397]
「data」URLスキーム。L. Masinter。IETF。1998年8月。標準化提案。URL: https://www.rfc-editor.org/info/rfc2397/
[RFC6838]
メディアタイプの仕様および登録 手順。N. Freed; J. Klensin; T. Hansen。IETF。2013年1月。現行のベスト プラクティス。URL: https://www.rfc-editor.org/info/rfc6838/
[RFC6901]
JavaScript Object Notation(JSON) ポインター。P. Bryan(編); K. Zyp; M. Nottingham(編)。IETF。2013年4月。標準化 提案。URL: https://www.rfc-editor.org/info/rfc6901/
[RFC8174]
RFC 2119のキーワードにおける大文字と小文字の曖昧さ。B. Leiba。IETF。2017年5月。現行のベストプラクティス。URL: https://www.rfc-editor.org/info/rfc8174/
[STRING-META]
Web上の文字列:言語および書字方向 メタデータ。Richard Ishida; Addison Phillips。W3C。2026年7月16日。最初の公開作業草案。URL: https://www.w3.org/TR/string-meta/
[URL]
URL標準。Anne van Kesteren。WHATWG。 現行標準。URL: https://url.spec.whatwg.org/
[VC-DATA-MODEL-2.1]
検証可能なクレデンシャル・データモデル v2.1。Manu Sporny; Ted Thibodeau Jr; Ivan Herman。W3C。2026年8月16日。W3C 作業草案。URL: https://www.w3.org/TR/vc-data-model-2.1/
[VC-DI-ECDSA]
データ完全性ECDSA暗号スイート v1.0。Manu Sporny; Dave Longley; Greg Bernstein。W3C。2025年5月15日。W3C 勧告。URL: https://www.w3.org/TR/vc-di-ecdsa/

C.2 参考情報

[DID]
分散型識別子(DID)v1.0。 Manu Sporny; Amy Guy; Markus Sabadello; Drummond Reed。W3C。2022年7月19日。W3C勧告。URL: https://www.w3.org/TR/did-core/
[RFC9458]
秘匿HTTP。M. Thomson; C. A. Wood。IETF。2024年1月。標準化提案。URL: https://www.rfc-editor.org/info/rfc9458/
[VC-DATA-INTEGRITY]
検証可能なクレデンシャルのデータ完全性 1.0。Ivan Herman; Manu Sporny; Ted Thibodeau Jr; Dave Longley; Greg Bernstein。 W3C。2025年5月15日。W3C勧告。URL: https://www.w3.org/TR/vc-data-integrity/
[VC-DATA-MODEL]
検証可能なクレデンシャル・データモデル v2.0。Ivan Herman; Michael Jones; Manu Sporny; Ted Thibodeau Jr; Gabe Cohen。W3C。 2025年5月15日。W3C勧告。URL: https://www.w3.org/TR/vc-data-model-2.0/