consent-withdrawal について
同意の付与と同じ程度に簡単な撤回を実現するための、製品・プライバシーチーム向け GDPR 実装スキルです。撤回窓口、処理手順、第三者への通知、再同意の記録を扱います。
主な機能
- 01同意と撤回に必要な手間の測定
- 02複数の撤回窓口の設計
- 03撤回処理の整理
- 04データ受領者への通知
- 05撤回後の再同意記録
活用シーン
- 01ウェブサイトの同意撤回フローの確認
- 02メール配信停止の仕組みの設計
- 03第三者共有に伴う撤回通知の設計
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ mukul975/ privacy-data-protection-skills --skill consent-withdrawalインストール後、Claude Code で/consent-withdrawalを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
assets/template.mdreferences/standards.mdworkflows.mdscripts/process.py詳細
同意の撤回の実装
概要
GDPR 第 7 条第 3 項には、次のように定められています。「データ主体は、いつでも同意を撤回する権利を有する。同意の撤回は、撤回前の同意に基づく処理の適法性に影響を及ぼさない。同意を与える前に、データ主体はその旨の説明を受けるものとする。同意の撤回は、同意を与えるのと同じくらい簡単にできるものとする。」
「同じくらい簡単」という要件は、技術的に最も対応が難しい側面です。登録時にチェックボックスを 1 回クリックして同意したのであれば、同程度の手間で撤回できる必要があります。複数の階層にわたる画面遷移や設定ページの奥に埋もれていたり、ダークパターンが使われていたりしてはなりません。
同程度の簡便さの分析
同意にかかる手間の測定
同意するために必要な手間を定量化し、撤回も同等以上に簡単にできるようにします。
| 指標 | 測定方法 | 目標 |
|---|---|---|
| クリック数 | 開始地点から完了までのクリック/タップ数 | 撤回のクリック数 <= 同意のクリック数 |
| ページ遷移数 | 開始から完了までのページ読み込み回数 | 撤回のページ数 <= 同意のページ数 |
| フォーム項目数 | 必要な入力項目の数 | 撤回の項目数 <= 同意の項目数 |
| 完了までの時間 | ユーザビリティテストで測定 | 撤回の所要時間 <= 同意の所要時間 |
| 認知的負荷 | 説明の理解しにくさ | 撤回の説明も同程度に明確 |
| アクセシビリティ | キーボードのみの操作で必要な手順 | キーボードでのアクセシビリティが同等 |
CloudVault SaaS Inc. のコンプライアンス分析
| 操作 | 方法 | クリック数 | ページ数 | 項目数 |
|---|---|---|---|---|
| 同意する(登録時) | オフのチェックボックスをオンにする | 1 クリック | 同じページ | 0 |
| 同意を撤回する(設定センター) | トグルスイッチをオフにして確認 | 2 クリック | 1 ページ | 0 |
| 同意を撤回する(メールの配信停止) | 配信停止リンクをクリック | 1 クリック | 1 ページ | 0 |
設定センターでの撤回には、確認ダイアログのためにクリックが 1 回余分に必要です。誤って撤回するのを防ぐため、この方法は許容されます。また、EDPB も、確認ステップは同程度の簡便さを損なわないと認めています(ガイドライン 05/2020、第 116 段落)。
ワンクリック撤回のアーキテクチャ
撤回へのアクセス方法
CloudVault SaaS Inc. は、複数の場所から撤回できるようにしています。
- 設定センター:設定 > プライバシー(どのページからでも 2 クリック)
- フッターリンク:ページのフッターにある「プライバシー設定」リンク(1 クリック + トグル)
- メールの配信停止:すべてのマーケティングメールにワンクリック配信停止リンクを設置(RFC 8058 List-Unsubscribe-Post に準拠し、1 クリック)
- アカウントダッシュボード:現在の同意状態を表示するプライバシーウィジェット(1 クリック + トグル)
- API エンドポイント:プログラムによる撤回用の PUT /api/v1/consent/preferences/{subject_id}
撤回処理パイプライン
TRIGGER: User clicks withdrawal toggle for a specific purpose
│
├─► Step 1: Client-Side
│ ├─ Display confirmation dialog:
│ │ "Withdraw consent for [purpose name]?"
│ │ "This will stop [specific processing description]."
│ │ "You can re-enable this at any time."
│ │ [Cancel] [Withdraw]
│ │
│ └─ User clicks [Withdraw]
│
├─► Step 2: API Call
│ PUT /api/v1/consent/preferences/{subject_id}
│ Body: { decisions: [{ purpose_id: "pur_analytics_01", decision: "withdrawn", mechanism: "toggle_switch" }] }
│
├─► Step 3: Backend Processing (within 100ms)
│ ├─ Create ConsentDecision record (decision: "withdrawn")
│ ├─ Validate request (subject exists, purpose exists, consent was previously granted)
│ ├─ Update consent state cache (Redis/in-memory)
│ └─ Return success response to client
│
├─► Step 4: Cascading Effects (async, within 1 hour)
│ ├─ Dispatch withdrawal events to message queue (Kafka/RabbitMQ/SQS)
│ ├─ Each downstream system receives withdrawal notification:
│ │
│ │ Purpose: "Service Improvement Analytics" (pur_analytics_001)
│ │ ├─ Stop analytics SDK data collection for this user
│ │ ├─ Remove user from analytics cohorts
│ │ └─ Flag existing analytics data for review/deletion
│ │
│ │ Purpose: "Product Update Emails" (pur_marketing_002)
│ │ ├─ Remove user from email marketing lists
│ │ ├─ Add user to suppression list
│ │ ├─ Cancel any scheduled email campaigns for this user
│ │ └─ Confirm with email service provider (ESP)
│ │
│ │ Purpose: "Industry Benchmarking" (pur_benchmarking_003)
│ │ ├─ Stop data sharing with Datalytics Partners Ltd.
│ │ ├─ Notify Datalytics Partners Ltd. via API
│ │ ├─ Request confirmation of processing cessation
│ │ └─ Flag shared data for deletion per DPA terms
│ │
│ └─ Log all propagation events with status tracking
│
├─► Step 5: Downstream Acknowledgment (within 24 hours)
│ ├─ Each downstream system sends acknowledgment
│ ├─ System monitors for missing acknowledgments
│ ├─ Escalation workflow for unacknowledged withdrawals:
│ │ ├─ T+1 hour: Automated retry
│ │ ├─ T+4 hours: Alert to engineering team
│ │ └─ T+24 hours: Escalate to DPO
│ └─ All acknowledgments logged in propagation table
│
└─► Step 6: User Confirmation
├─ UI updates: toggle shows "off" state
├─ Confirmation message: "Consent withdrawn. Processing will stop within 24 hours."
├─ Confirmation email sent to user
└─ Consent receipt updated and available for download
第三者への通知プロトコル
第三者とのデータ共有を伴う目的について同意が撤回された場合:
-
即時の API 通知:事前に確立した API エンドポイント(データ処理契約で定義)を通じて、構造化された通知を第三者に送信します。
-
通知ペイロード:
{
"notification_type": "consent_withdrawal",
"subject_reference": "hashed_subject_id",
"purpose_id": "pur_benchmarking_003",
"withdrawal_timestamp": "2026-03-14T10:30:00Z",
"required_action": "cease_processing",
"action_deadline": "2026-03-15T10:30:00Z",
"acknowledgment_required": true,
"controller": "CloudVault SaaS Inc."
}
- 想定される応答:
{
"acknowledgment": true,
"received_at": "2026-03-14T10:30:05Z",
"action_status": "processing_cessation_initiated",
"estimated_completion": "2026-03-14T12:00:00Z"
}
- DPA の適用:Datalytics Partners Ltd. とのデータ処理契約(第 8.3 項)では、4 時間以内の受領確認と、24 時間以内の処理停止を義務付けています。これに従わない場合、DPA 違反となります。
撤回後の再同意への対応
ユーザーが同意を撤回した後、再び同意することを希望した場合:
- 再同意は認められており、最初の同意と同じ方法を使用する必要があります
- 同意記録には、明確な監査証跡(付与 → 撤回 → 付与)を残す必要があります
- 前回の同意時から同意文が変更されている場合は、新しいバージョンを表示する必要があります
- 再同意を促す「ナッジ」やダークパターンを使用してはなりません(EDPB ガイドライン 05/2020)
- 妥当な冷却期間は必須ではありませんが、不正防止のために設けることができます
主な規制上の参考資料
- GDPR 第7条第3項 — 同意を撤回する権利、および同等の容易さの要件
- GDPR 前文42 — 撤回によって不利益が生じる場合、同意は自由に与えられたものではありません
- 同意に関する EDPB ガイドライン 05/2020 — 撤回に関する第108~120項
- RFC 8058 — メーリングリストのメールヘッダーにおけるワンクリック機能の通知(List-Unsubscribe-Post)
- CNIL による執行措置(Google、2022年1月)— 同意の撤回が困難だったことなどを理由に、1億5,000万ユーロの制裁金
- AEPD による執行措置(CaixaBank、2021年1月)— 撤回の仕組みが不十分だったことを理由に、600万ユーロの制裁金