consent-pref-center について
同意設定センターを設計するチーム向けのガイドです。データ構造、API、画面の動作、監査履歴、IAB TCF v2.2 の要件を扱います。
主な機能
- 01同意データモデルと API 設計
- 02TCF v2.2 の統合要件
- 03目的別の設定コントロール
- 04同意履歴とレシートのダウンロード
- 05バージョン管理と伝播の監査記録
活用シーン
- 01同意記録とエンドポイントの設計
- 02TCF v2.2 対応設定センターの計画
- 03同意撤回フローの構築
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ mukul975/ privacy-data-protection-skills --skill consent-pref-centerインストール後、Claude Code で/consent-pref-centerを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
assets/template.mdreferences/standards.mdworkflows.mdscripts/process.py詳細
同意設定センターの構築
概要
同意設定センターは、データ主体がすべての処理目的に関する同意の選択を一元的に管理するためのインターフェースです。GDPR 第 7 条第 3 項では、同意の撤回は同意の付与と同じくらい容易でなければならないと定められているため、適切に設計された設定センターはコンプライアンスに不可欠です。IAB Europe Transparency and Consent Framework(TCF)v2.2 は、このアーキテクチャと統合する、広告関連の同意に関する標準化されたアプローチを提供します。
アーキテクチャのコンポーネント
1. データモデル
同意設定センターには、4 つの主要なデータエンティティが必要です。
同意目的レジストリ 同意を適法な根拠とするすべての処理目的を保存します。
| フィールド | 型 | 説明 |
|---|---|---|
| purpose_id | UUID | 処理目的の一意の識別子 |
| purpose_name | VARCHAR(256) | 人が理解できる目的の名称 |
| purpose_description | TEXT | 平易な言葉による説明(Flesch-Kincaid の学年レベルで 8 以下) |
| legal_basis | ENUM | "consent" または "explicit_consent" |
| data_categories | JSONB | 処理される個人データカテゴリの配列 |
| recipients | JSONB | 名称が記載された第三者受領者の配列 |
| retention_period | VARCHAR(128) | この目的におけるデータ保持期間 |
| tcf_purpose_id | INTEGER | 該当する場合、対応する IAB TCF v2.2 の目的 ID(1-11) |
| is_active | BOOLEAN | この目的が現在提供されているかどうか |
| created_at | TIMESTAMP | 目的が登録された日時 |
| updated_at | TIMESTAMP | 最終更新日時 |
同意文のバージョン ユーザーに提示された同意文の変更不可の記録です。
| フィールド | 型 | 説明 |
|---|---|---|
| version_id | UUID | バージョンの一意の識別子 |
| purpose_id | UUID | 目的レジストリへの外部キー |
| consent_text | TEXT | ユーザーに表示された正確な文面 |
| text_hash | CHAR(64) | consent_text の SHA-256 ハッシュ |
| effective_from | TIMESTAMP | このバージョンが有効になった日時 |
| effective_until | TIMESTAMP | このバージョンが置き換えられた日時(現行の場合は NULL) |
| approved_by | VARCHAR(256) | 承認した DPO または法務レビュー担当者の氏名 |
同意の決定 データ主体が行った各同意の決定を記録します。
| フィールド | 型 | 説明 |
|---|---|---|
| decision_id | UUID | 決定の一意の識別子 |
| subject_id | UUID | データ主体の識別子 |
| purpose_id | UUID | 目的レジストリへの外部キー |
| version_id | UUID | 表示された同意文バージョンへの外部キー |
| decision | ENUM | "granted" または "withdrawn" |
| mechanism | VARCHAR(64) | "checkbox_tick"、"toggle_switch"、"api_call" |
| timestamp | TIMESTAMP | ISO 8601 形式の UTC タイムスタンプ |
| ip_address | INET | 決定時の IP アドレス |
| user_agent | TEXT | ブラウザーのユーザーエージェント文字列 |
| source | VARCHAR(64) | "signup_flow"、"preference_center"、"cookie_banner"、"api" |
同意伝播ログ 同意の変更後に、下流システムへ通知した記録を追跡します。
| フィールド | 型 | 説明 |
|---|---|---|
| propagation_id | UUID | 伝播イベントの一意の ID |
| decision_id | UUID | このイベントの契機となった同意の決定への外部キー |
| target_system | VARCHAR(256) | 通知された下流システムの名称 |
| status | ENUM | "pending"、"delivered"、"acknowledged"、"failed" |
| sent_at | TIMESTAMP | 通知が送信された日時 |
| acknowledged_at | TIMESTAMP | 下流システムが受信を確認した日時 |
2. API 設計
GET /api/v1/consent/preferences/{subject_id} 指定したデータ主体について、すべての目的に関する現在の同意状態を返します。
Response:
{
"subject_id": "usr_7f3a9b2e-41d8-4c76-b5e3-9a8d1c2f4e60",
"preferences": [
{
"purpose_id": "pur_analytics_001",
"purpose_name": "Service Improvement Analytics",
"decision": "granted",
"granted_at": "2026-01-15T10:30:00Z",
"version_id": "ver_a1b2c3d4"
},
{
"purpose_id": "pur_marketing_002",
"purpose_name": "Product Update Emails",
"decision": "withdrawn",
"withdrawn_at": "2026-02-20T14:45:00Z",
"version_id": "ver_e5f6g7h8"
}
],
"last_updated": "2026-02-20T14:45:00Z"
}
PUT /api/v1/consent/preferences/{subject_id} 1 つ以上の目的に関する同意を更新します。下流への伝播を開始します。
Request:
{
"decisions": [
{
"purpose_id": "pur_marketing_002",
"decision": "granted",
"mechanism": "toggle_switch"
}
]
}
GET /api/v1/consent/history/{subject_id} 第 7 条第 1 項に基づく監査目的で、同意履歴全体を返します。
GET /api/v1/consent/receipt/{decision_id} Kantara Initiative Consent Receipt 形式の単一の同意証明書を返します。
3. TCF v2.2 の統合
IAB Transparency and Consent Framework v2.2(2023年9月リリース)では、以下が求められます。
- TC String の生成:同意シグナルを IAB TC String 形式にエンコードします。TC String は、TCF で定義された目的(1~11)および正当な利益に関する表明への同意を記録する、base64url でエンコードされたビットフィールドです。
- CMP の登録:IAB Europe に Consent Management Platform として登録します。登録済みの各 CMP には、TC String の生成に使用する一意の CMP ID が付与されます。
- ベンダーリストの統合:IAB Global Vendor List(GVL)を取得し、ベンダーごとの同意オプションを表示します。GVL は vendorlist.consensu.org で公開され、毎週更新されます。
- 目的のマッピング:CloudVault SaaS Inc. の内部目的を TCF v2.2 の目的にマッピングします。
- TCF 目的 1(デバイス上の情報の保存および/またはアクセス)→ Cookie の同意
- TCF 目的 3(パーソナライズド広告用のプロファイルの作成)→ 該当する場合
- TCF 目的 7(広告のパフォーマンスの測定)→ 分析への同意
- パブリッシャーの制限:CloudVault SaaS Inc. のポリシーで求められる場合、ベンダーの法的根拠を同意のみに制限するよう、パブリッシャーレベルの制限を設定します。
4. UI コンポーネントの仕様
CloudVault SaaS Inc. の設定センターのインターフェースでは、以下の設計原則に従います。
レイアウト:
- Settings > Privacy > Manage Consent からアクセスできます(どのページからでも最大 2 回のクリックでアクセス可能)。
- 直接 URL app.cloudvault-saas.eu/settings/privacy からもアクセスできます。
- すべてのページのフッターに「Privacy Choices」リンクを常時表示します。
目的ごとの切り替え:
- 各目的に、目的名、1 文の説明、現在の状態(オン/オフの切り替え)を表示します。
- 展開可能な「Learn More」セクションに、詳細な説明、データカテゴリ、受信者、保持期間を表示します。
- 切り替えを変更すると、API が直ちに呼び出され、視覚的な確認が表示されます。
同意履歴:
- 目的ごとの「View History」リンクから、日付、操作(付与/撤回)、同意テキストのバージョンを確認できます。
- JSON 形式でダウンロード可能な同意レシート(Kantara Consent Receipt 仕様 v1.1)を提供します。
撤回フロー:
- 撤回は切り替えを 1 回クリックするだけで行えます(サインアップ時の同意付与も 1 回のクリックで行えることに対応)。
- 確認ダイアログ:「[purpose] への同意を撤回してもよろしいですか?これにより、[specific processing] が停止されます。この設定はいつでも再度有効にできます。」
- 撤回後の確認:「同意が撤回されました。処理は 24 時間以内に停止します。」
バージョン履歴と監査証跡
同意テキストが変更されるたびに、新しいバージョン記録が作成されます。設定センターには常に現在のバージョンが表示されますが、過去のすべてのバージョンも保持されます。監査クエリでは、以下を再構成できます。
- 特定のユーザーに、特定の時点でどのテキストが表示されたか
- 各目的について、同意がいつ付与され、いつ撤回されたか
- 同意の変更が下流システムに通知されたかどうか
- 同意の変更ごとの伝播状況とタイミング
主な規制関連の参考資料
- GDPR 第 7 条第 1 項 — 同意の証明
- GDPR 第 7 条第 3 項 — 同意を撤回する権利、および同等の容易さの要件
- GDPR 第 12 条第 1 項 — 透明性があり、理解しやすく、容易にアクセスできる情報
- IAB TCF v2.2 仕様(2023年9月)— TC String のエンコード、CMP の要件
- Kantara Initiative Consent Receipt 仕様 v1.1 — 標準的な同意レシート形式
- EDPB ガイドライン 05/2020 — 規則 2016/679 に基づく同意