VC フォーマット比較
Verifiable Credentials は複数のフォーマットで表現できます 。このドキュメントでは、主要なフォーマット(JWT、JSON-LD、SD-JWT、mdoc)を比較し、それぞれの特徴とユースケースを解説します。
第1部: 概要編
なぜ複数のフォーマットがあるのか?
VC は様々なユースケースで使用されるため、それぞれの要件に適したフォーマットが必要です。
ユースケースごとの要件:
Web アプリ向け モバイルウォレット向け 政府 ID 向け
┌─────────────────┐ ┌─────────────────────┐ ┌─────────────────┐
│ JWT が既に普及 │ │ 選択的開示が必要 │ │ ISO 標準準拠 │
│ 相互運用性重視 │ │ プライバシー保護 │ │ オフライン検証 │
│ 既存インフラ活用 │ │ サイズ効率 │ │ 厳格なセキュリティ│
└─────────────────┘ └─────────────────────┘ └─────────────────┘
│ │ │
▼ ▼ ▼
JWT VC SD-JWT VC mdoc
主要フォーマットの概要
| フォーマット | 標準化組織 | 特徴 |
|---|---|---|
| JWT VC | W3C + IETF | JWT ベース、広く普及 |
| JSON-LD VC | W3C | セマンティック Web、RDF 互換 |
| SD-JWT VC | IETF | 選択的開示、プライバシー保護 |
| mdoc (mDL) | ISO | モバイル運転免許証、CBOR ベース |
第2部: 詳細編
JWT VC
JWT(JSON Web Token)形式で表現された VC。OAuth/OIDC エコシステムとの親和性が高い。
構造
eyJhbGciOiJFUzI1NiIsInR5cCI6InZjK3NkLWp3dCJ9.
eyJpc3MiOiJkaWQ6ZXhhbXBsZTp1bml2ZXJzaXR5IiwidmMiOnsiQGNvbnRleHQiOlsi...
K0FXa3VzTVJMazB4LXUxR3ZHZHlSSmNEMVhCdEpwWFE
└────────────────┬─────────────────┘.└────────────┬─────────────────┘.└───┬───┘
Header Payload Signature
ペイロード例
{
"iss": "did:example:university",
"sub": "did:example:student123",
"iat": 1704067200,
"exp": 1735689600,
"vc": {
"@context": [
"https://www.w3.org/ns/credentials/v2"
],
"type": ["VerifiableCredential", "UniversityDegreeCredential"],
"credentialSubject": {
"id": "did:example:student123",
"degree": {
"type": "BachelorDegree",
"name": "Bachelor of Science"
}
}
}
}
特徴
| メリット | デメリット |
|---|---|
| 既存の JWT ライブラリを活用 | 選択的開示が困難 |
| OAuth/OIDC との統合が容易 | 全クレームが開示される |
| コンパクトなサイズ | セマンティックな処理が限定的 |
| 広く理解されている | 特定クレームだけの開示不可 |
JSON-LD VC
JSON-LD(Linked Data)形式の VC。セマンティック Web 技術を活用。
構造
{
"@context": [
"https://www.w3.org/ns/credentials/v2",
"https://www.w3.org/ns/credentials/examples/v2"
],
"id": "https://university.example/credentials/3732",
"type": ["VerifiableCredential", "UniversityDegreeCredential"],
"issuer": "did:example:university",
"validFrom": "2024-01-01T00:00:00Z",
"credentialSubject": {
"id": "did:example:student123",
"degree": {
"type": "BachelorDegree",
"name": "Bachelor of Science in Computer Science"
}
},
"proof": {
"type": "DataIntegrityProof",
"cryptosuite": "eddsa-rdfc-2022",
"created": "2024-01-01T00:00:00Z",
"verificationMethod": "did:example:university#key-1",
"proofPurpose": "assertionMethod",
"proofValue": "z3FXQjecWufY46...yTe5m"
}
}
特徴
| メリット | デメリット |
|---|---|
| セマンティックな相互運用性 | 処理が複雑 |
| 拡張性が高い | ライブラリが限られる |
| RDF グラフとして処理可能 | サイズが大きくなりがち |
| 標準化された語彙 | JSON-LD 処理の学習コスト |
SD-JWT VC
選択的開示(Selective Disclosure)をサポートする JWT VC。
構造
<Issuer-signed JWT>~<Disclosure 1>~<Disclosure 2>~...~<Key Binding JWT>
eyJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJodHRwczovL...~
WyJfc2QiLCJuYW1lIiwiSm9obiBEb2UiXQ~
WyJfc2QiLCJiaXJ0aERhdGUiLCIxOTkwLTAxLTAxIl0~
eyJhbGciOiJFUzI1NiJ9.eyJub25jZSI6Ii4uLiJ9.xxx
動作原理
発行時:
発行者 ────► 保持者
│
│ SD-JWT(全ての開示可能クレームを含む)
│ + 各クレームの Disclosure
│
▼
┌─────────────────────────────────────┐
│ JWT: hash(Disclosure1), hash(D2)... │
│ Disclosure1: ["salt", "name", "John"]│
│ Disclosure2: ["salt", "age", 30] │
│ ... │
└─────────────────────────────────────┘
提示時:
保持者 ────► 検証者
│
│ SD-JWT + 選択した Disclosure のみ
│
▼
┌─────────────────────────────────────┐
│ JWT: hash(Disclosure1), hash(D2)... │
│ Disclosure1: ["salt", "name", "John"]│
│ (Disclosure2 は含めない) │
└─────────────────────────────────────┘
│
│ 検証者は name のみ知る
│ age は開示されない
▼