mcpField
C
consent-withdrawal

consent-withdrawal

github.com/mukul975セキュリティ32338 回インストール32 週間前に更新
リポジトリ

consent-withdrawal について

同意の付与と同じ程度に簡単な撤回を実現するための、製品・プライバシーチーム向け GDPR 実装スキルです。撤回窓口、処理手順、第三者への通知、再同意の記録を扱います。

主な機能

  1. 01同意と撤回に必要な手間の測定
  2. 02複数の撤回窓口の設計
  3. 03撤回処理の整理
  4. 04データ受領者への通知
  5. 05撤回後の再同意記録

活用シーン

  1. 01ウェブサイトの同意撤回フローの確認
  2. 02メール配信停止の仕組みの設計
  3. 03第三者共有に伴う撤回通知の設計

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/mukul975/privacy-data-protection-skills --skill consent-withdrawal

インストール後、Claude Code で/consent-withdrawalを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

assets/
template.md
references/
standards.md
workflows.md
scripts/
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. は、複数の場所から撤回できるようにしています。

  1. 設定センター:設定 > プライバシー(どのページからでも 2 クリック)
  2. フッターリンク:ページのフッターにある「プライバシー設定」リンク(1 クリック + トグル)
  3. メールの配信停止:すべてのマーケティングメールにワンクリック配信停止リンクを設置(RFC 8058 List-Unsubscribe-Post に準拠し、1 クリック)
  4. アカウントダッシュボード:現在の同意状態を表示するプライバシーウィジェット(1 クリック + トグル)
  5. 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

第三者への通知プロトコル

第三者とのデータ共有を伴う目的について同意が撤回された場合:

  1. 即時の API 通知:事前に確立した API エンドポイント(データ処理契約で定義)を通じて、構造化された通知を第三者に送信します。

  2. 通知ペイロード:

{
    "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."
}
  1. 想定される応答:
{
    "acknowledgment": true,
    "received_at": "2026-03-14T10:30:05Z",
    "action_status": "processing_cessation_initiated",
    "estimated_completion": "2026-03-14T12:00:00Z"
}
  1. 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万ユーロの制裁金

コメント