🔐

SD-JWT VCの正体を暴く!W3C VCとIETF規格の狭間で生まれた選択的開示の新世界

に公開

SD-JWT VCの正体を暴く!W3C VCとIETF規格の狭間で生まれた選択的開示の新世界 🔐

🚀 はじめに

身分証明書をスマホに入れて、必要なときに“必要な部分だけ”見せられたら便利だと思いませんか?
例えば、お酒を買うときに『私は20歳以上です』だけ証明できて、名前や住所は見せなくていい。
そんな夢みたいな仕組みを実現するのが SD-JWT VC なんです。
デジタル証明書(Verifiable Credential, VC)の世界で、これまで課題だったのが“見せる情報を選べない”こと。
そこに新しく登場したのが、選択的開示をネイティブでサポートする SD-JWT VC なんです。

VCの世界ではW3C VC Data Model(JSON-LD/LDP形式)が有名ですよね。でも最近、SD-JWT VCという新しい選手が登場してきました。しかも、IETFが作ったバージョンとW3C VC Data Model 2.0で言及されたバージョンの2つがあるんです。

さてさて、今回はこの規格の乱立状況と、それぞれの違い、そして実際のファイル構造まで深掘りしてみましょう。

🛠️ まずはW3C VC(JSON-LD/LDP)の特徴と課題

1. W3C VCの基本構造

W3C VCは、Linked Data(JSON-LD)を採用し、@contextにより意味論(セマンティクス)を外部参照する仕様を使います。

{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://w3id.org/citizenship/v1"
  ],
  "type": ["VerifiableCredential", "PermanentResidentCard"],
  "credentialSubject": {
    "id": "did:example:123",
    "givenName": "太郎",
    "familyName": "山田",
    "birthDate": "1990-01-01",
    "address": {
      "streetAddress": "東京都渋谷区...",
      "postalCode": "150-0001"
    }
  }
}

一言で言えば、「意味論を重視したリッチなデータ構造」です。@contextによって、データの意味を外部のスキーマで定義できるのが特徴です。

2. JSON-LD/LDPの課題

従来は「全部見せるか、全部隠すか」に寄りがちでしたが、SD-JWTBBS+ を組み合わせれば、必要な項目だけを開示する設計が可能です。

💡 IETFって?
W3CがWeb標準を定める団体なのに対して、IETF(Internet Engineering Task Force)はインターネット全体のプロトコル標準(HTTP、TLS、OAuthなど)を策定してきた技術コミュニティです。
VCの世界はW3Cの守備範囲ですが、「JWTをどう拡張して安全に使うか」といった領域はJWTやOAuthを管轄しているIETFの方が専門。
そのため、VCの中でも特に
JWTベースのSD-JWT VC
についてはIETFが主導して仕様化を進めているんです。

📌 SD-JWT VCの2つの顔

IETFバージョン vs W3C VC 2.0での扱い

W3CはVC Data Modelを定義し、IETFはJWT/SD-JWTといった表現・伝送形式を策定している。両者は競合というより補完関係にある。

では、なぜSD-JWT VCには2つのバージョンがあるのでしょうか?

項目 IETF SD-JWT VC W3C VC 2.0 + SD-JWT
規格主体 IETF OAuth WG W3C VCWG
typヘッダー dc+sd-jwt(2024年11月〜) 仕様で明示なし
メディアタイプ application/sd-jwt application/vc+sd-jwt
データモデル 独自(VCDMを使わない) VCDMとの互換性重視
@context 不要 必要(JSON-LDとの共存)
選択的開示 ネイティブサポート SD-JWTを追加的に利用
仕様の成熟度 ◎ Draft進行中 ◎ W3C勧告(2025年)
typヘッダー変更の経緯(技術的な詳細)

IETFのSD-JWT VC仕様では、2024年11月にtypヘッダーをvc+sd-jwtからdc+sd-jwtに変更しました。これは「vc」というメディアタイプ名をW3Cが先に登録していたため。

一方、W3Cの「Securing VCs using JOSE and COSE」仕様では、メディアタイプとしてapplication/vc+sd-jwtを使用しますが、JWTのtypヘッダーについては明確な規定がありません。

つまり、IETFの独立仕様とW3C経由のSD-JWTでは、微妙に異なる実装になっているんです。移行期間中は両方の値を受け入れる実装が推奨されています。

要は、IETFは「シンプルで実装しやすい」を重視し、W3Cは「既存のVCDMとの互換性」を重視した結果、2つの流派が生まれたというわけです。

🔄 ファイル構造を見てみよう

SD-JWT VCの基本構造

IETF版の例では typ ヘッダーは { "alg": "ES256", "typ": "dc+sd-jwt" } とされ、ペイロードのトップレベルに vct が置かれる。W3C版では @context や _sd が含まれる場合がある。

それでは実際のファイル構造を見てみましょう。SD-JWT VCは以下のような構造になっています:

{
  // 選択的開示可能なクレームのハッシュ配列
  "_sd": [
    "CrQe7S5kqBAHt-nMYXgc6bdt2SH5aTY1sU_M-PgkjPI",
    "JzYjH4svliH0R3PyEMfeZu6Jt69u5qehZo7F7EPYlSE",
    "eluV7Og3gSNII8EYnsxA_A5Ee7qMdWh0zejnfh1MBj"
  ],
  
  // 必須フィールド
  "vct": "https://credentials.example.com/identity_credential",
  "iss": "https://issuer.example.com",
  "iat": 1683000000,
  "exp": 1883000000,
  "_sd_alg": "sha-256",
  
  // キーバインディング用のcnfクレーム
  "cnf": {
    "jwk": {
      "kty": "EC",
      "crv": "P-256",
      "x": "TCAER19Zvu3OHF4j4W4vfSVoHIP1ILilDls7vCeGemc",
      "y": "ZxjiWWbZMQGHVWKVQ4hbSIirsVfuecCE6t4jT9F2HZQ"
    }
  }
}

IETF仕様ではvctは衝突耐性名(Collision-Resistant Name)として定義されており、URNやURLを用いることが推奨される。

🔍 イメージ: _sd配列は「ブラインドボックスのラベル」みたいなもの。中身は見えないけど、何が入っているかは後で選択的に開示できる。

Disclosureの構造

選択的開示の肝となるDisclosureは、以下のような三要素の配列です:

// Disclosure の中身(平文)
["2GLC42sKQveCfGfryNRN9w", "familyName", "山田"]
//  ↑ランダムソルト        ↑属性名      ↑値

// Base64URLエンコード後
"WyIyR0xDNDJzS1F2ZUNmR2ZyeU5STjl3IiwgImZhbWlseU5hbWUiLCAi5bGx55SwIl0"

これは「開封用の鍵」みたいなものです。この鍵を渡すことで、特定の情報だけを開示できるんです。

最終的なSD-JWT VCフォーマット

発行者は、署名済みJWTとDisclosuresをチルダ(~)で結合します:

<Issuer-signed JWT>~<Disclosure 1>~<Disclosure 2>~...~<Disclosure N>~

実際の例:

eyJhbGciOiJFUzI1NiIsInR5cCI6ImRjK3NkLWp3dCJ9.eyJfc2QiOlsi
Q3JRZTdTNWtxQkFIdC1uTVlYZ2M2YmR0MlNINWFUWTFzVV9NLVB...長いJWT
...~WyI2cU1RdlJMNWhhaiIsICJmYW1pbHlfbmFtZSIsICLlsbHnlLAiXQ~
WyJlSThaV0FkRmticUthYW10UzBRIiwgImJpcnRoRGF0ZSIsICIxOTkwLTAxLTAxIl0~

パッと見は複雑そうですが、要は「JWT本体 + 開示したい情報の鍵」という流れです。

💡 実際の活用シーン

選択的開示の具体例

発行時には全ての情報が含まれていますが、提示時にホルダーが必要なDisclosureだけを含めることで、選択的開示を実現します。

実装例:年齢確認のみのケース

// ホルダーが年齢情報のDisclosureだけを選んで提示
const presentationForAgeVerification = 
  jwt + "~" + birthDateDisclosure; // 名前と住所のDisclosureは含めない

// 検証者側では年齢情報だけが見える
{
  "vct": "https://credentials.example.com/identity_credential",
  "iss": "https://issuer.example.com",
  "birthDate": "1990-01-01",  // これだけが開示される!
  // 名前と住所は隠されたまま
}

2025年5月、W3C VC Data Model 2.0が正式に勧告化され、JOSE/COSEやSD-JWTなど複数の表現形式が正式に定義された。

🚧 現在の課題と展望

規格の乱立問題

まるで、VHSとベータマックス、HD DVDとBlu-rayの争いを見ているようで...(若い人は知らないかもしれませんが😅)

相互運用性への動き

2024年後半から2025年にかけて、ChromeのDigital Credentials APIやAndroid/Wallet、SafariのDC API対応など主要ブラウザ・OSでW3C VC 2.0連携の動きが進んでいる。

統合への試み:

  • デュアルフォーマット対応 - 発行者が複数形式を同時発行
  • プロトコルの共通化 - OpenID Connectベースの統一
  • ブリッジ仕様の開発 - 形式間の変換ツール

企画倒れに終わった過去の統合規格には少し気の毒ですが、技術の世界では良いものが生き残るのは常です。

今後の展望

今後は以下のような流れが予想されます:

  1. 短期的(2025年) - 各規格の並存と使い分け
  2. 中期的(2026-2027年) - デファクトスタンダードの確立
  3. 長期的(2028年以降) - 統一規格または完全な相互運用性の実現

💡 まとめ

ポイント

  • W3C VC(JSON-LD)は意味論重視だが選択的開示が課題
  • SD-JWT VCは選択的開示をネイティブサポート
  • IETFとW3Cで微妙に異なる規格が存在
  • ファイル構造は JWT + Disclosures のシンプルな形式
  • 規格の統合はまだ道半ば

まとめると、SD-JWT VCによって「プライバシーを守りながらデジタル証明書を活用する時代」が来たと言えます。

選択的開示という考え方は、「必要最小限の情報共有」という現代のプライバシー要求に完璧にマッチしています。W3C VCの「全部か無か」というアプローチから、「必要な分だけ」というアプローチへの転換は、まさにパラダイムシフトと言えるでしょう。

ともあれ、SD-JWT VCの登場でWeb3時代の本格的なプライバシー保護が実現に近づいたのは確かでしょう。規格の乱立という笑えない状況はありますが、エンドユーザーにとって使いやすい形に収束していくことを期待しています。

📚 参考資料

技術仕様書・関連ドキュメント

IETF関連:

W3C関連:

実装ガイド:


2025年1月作成

NonEntropy Tech Blog

Discussion