クッキー同意、GDPR、そしてDiscourse

:books: これは、Discourse 内で GDPR およびクッキー同意の技術的側面がどのように機能するかを説明するガイドであり、クッキー同意管理とコンテンツマネージャーサービスのオプションについても解説しています。

:warning: このドキュメントは、GDPR が含むすべての詳細を網羅したガイドではありません。Discourse は、このガイドをユーザーや顧客に対する法的助言として使用する意図はありません。Discourse は、個々の状況やユースケースにおける GDPR やその他のクッキー同意法への法的遵守を決定することはできません

:spiral_notepad: Discourse は現在「Strict Dynamic」CSP を使用しているため、Content security policy script src サイト設定に個別の URL を追加する必要はありません(また、不可能です)。詳細については、Content-Security-Policy now uses 'strict-dynamic' をご覧ください。

Discourse におけるクッキー

Discourse がクッキーをどのように使用するかを理解するには、プライバシーポリシーのクッキーセクション を確認してください。

必須クッキー

デフォルトでは、Discourse は基本的な機能に必要なクッキーのみを設定します。その機能とは、インターネット上でコンテンツを公開することで、ユーザー同士、そして世界とコミュニケーションを取れるようにすることです。

第三者クッキー

デフォルトでは、Discourse は分析用のクッキーを使用せず、クロスサイトクッキーや広告ターゲティングクッキーも使用しません。ただし、サイト管理者は、Google アナリティクス、広告ネットワーク、トラッキングピクセルなど、他のクッキーを Discourse サイトに追加することを選択できます。

クッキーを導入するサードパーティのスクリプトが Discourse に追加された場合、GDPR に準拠したクッキー管理ソリューションを見つけるか、GDPR 下で同意が必要となるクッキーに対処するのは、サイトの管理チームの責任です。

クッキー同意バナー

Discourse インスタンスにクッキー同意バナーを統合したい場合は、以下に紹介する最も人気のあるもの向けのガイドに従ってください。

:loudspeaker: サイトでサードパーティの JS スクリプトを参照することは、実質的にそのサードパーティにサイトへの完全な管理者権限を与えることになり、潜在的なセキュリティリスクとなります。

:warning: クッキー同意の管理にこれらの方法のいずれかを使用する場合は、それらがあなたのニーズやサイトの法的要件に合致する形で機能するかを確認する必要があります。

Osano

Plans & Pricing | Osano にアクセスし、プランを選択してアカウントを作成してください。

アカウント作成後、一時的な認証情報を含むメールが届きます。その認証情報でログインすると、新しいパスワードの設定が求められます。

Osano ダッシュボードが表示されます。「Consent Management」をクリックし、新しい同意設定を追加します。

マネージャーの名前、追跡するサイトの URL、およびサイトのクッキーポリシーの URL を入力します。デフォルトでは、Discourse のクッキーポリシーは https://<your-site>/privacy のプライバシーページにあります。

Create configuration をクリックすると、バナーのコードが表示されるポップアップが現れます。これをすぐに Discourse に追加することも、後で追加することもできます。Osano ダッシュボードから公開するまで、バナーはユーザーに表示されません。

スクリプトは、テーマコンポーネント を通じて追加するか、テーマを直接変更して追加できます。

バナーを Discourse に追加するには、管理者ダッシュボードで「Customize → Themes → Components」に移動し、「Install」をクリックします。

「Add CSS/HTML」をクリックし、コードを「Head」セクションに追加します。

コードが正常にフォーラムに追加されると、マネージャーのステータスが Live になりますが、Your script is not yet active と表示されます。また、マネージャーは Mode Discovery/Listener モードになっています。これは現時点では問題ありません。マネージャーがこのモードの間、バナーはサイトに表示されません。

Osano ダッシュボードに戻ります。次のセクションでは、同意バナーの詳細をカスタマイズできます。マップをクリックすると、異なる国でバナーがどのように表示されるかを確認できます。

Osano は自動的にユーザーがサイトを訪問している国を検出し、地域のプライバシー法に応じてバナーの表示方法を変更します。

例えば、ベネズエラから接続すると、クッキーバナーはシンプルで、一定期間後に自動的に消えます。

一方、EU 加盟国であるオランダからは、バナーにより多くのオプションが表示されます。

クッキーの詳細を表示するクッキーウィジェットを追加するオプションもあります。

カスタマイズが完了したら、Save changes、次に Publish、最後に Clear & Publish をクリックします。

「Scripts」セクションに移動し、サイトで検出されたスクリプトを分類します。例えば、私の Discourse サイトでは CDN URL のみが検出され、Essential として分類されました。サイト上で実行している他のサードパーティサービスも、同様に分類する必要があります。

検出されたクッキーについても同様です。例えば、サイトに Google アナリティクスがある場合、_ga クッキーが検出され、Analytics として分類する必要があります。

Osano がサイト上で実行されているクッキーやスクリプトを検出するには時間がかかる場合があります。Osano スニペットがすべての場所で実行されるように、フォーラムの異なるセクションを移動する必要があるかもしれません。

検出されるクッキーやスクリプトは時間とともに変化する可能性があります。Osano から Configuration 'Cookie test' is running unclassified scripts, iframes and/or cookies. というようなメール通知が届き、分類の更新を求められることがあります。

分類が完了したら、モードを Permissive(推奨)または Strict に変更し、設定を公開します。これでバナーがユーザーに表示されるようになります :tada:

image

クッキー設定モードの詳細については、こちらをご覧ください:compliance-modes-listener-permissive-strict | Customer Portal

Osano は Web ワーカーを使用しているため、worker-src ディレクティブに blob: を追加する必要があります。これはカスタムテーマまたはコンポーネントを通じて行う必要があり、Mitigate XSS Attacks with Content Security Policy の「Extending the Default CSP」セクションを参照してください。

要約すると、settings.yml ファイルに以下のパラメータを含む空のテーマコンポーネントを作成する必要があります。

# settings.yml
extend_content_security_policy:
  type: list
  default: "worker_src: blob:"

:loudspeaker: バナーが表示されない場合は、「Debugging CSP」セクションを参照してください。

One Trust

Cookie Consent | Products | OneTrust にアクセスし、最初のドメインについては無料で登録するか、価格ページ から有料サブスクリプションを開始してください。

OneTrust へようこそというメールが届き、プラットフォームへのログインリンクが含まれています。このリンクからアカウント設定のガイドを受け取ります。

https://app.onetrust.com/welcome に移動します。「Avalaible Apps」または「My Apps」セクションから Cookie Compliance を選択します。

Add Website を選択します。

ウェブサイトの URL を追加します。

スキャンを開始し、ターゲットオーディエンス(GDPR などのプライバシーフレームワーク)を選択します。

次のセクションでは、バナーの詳細をカスタマイズし、独自のブランディングを追加できます。準備ができたら変更を保存し、公開します。

バナーを Discourse に追加するには、サイドメニューの Integration セクションに移動し、リストからサイトを選択します。

Production Scripts から Production CDN スクリプトをコピーします。

スクリプトは、テーマコンポーネント を通じて追加するか、テーマを直接変更して追加できます。

管理者ダッシュボードで「Customize → Themes → Components」に移動し、「Install」をクリックします。

「Add CSS/HTML」をクリックし、コピーしたコードを「Head」セクションに追加します。

これで完了です!バナーは以下のように表示されるはずです。

:loudspeaker: バナーが表示されない場合は、「Debugging CSP」セクションを参照してください。

ConsentManager

Free test now! - ConsentManager GDPR solution にアクセスしてアカウントを作成し、ウィザードに従って同意マネージャーを設定します。

ステップ 4 で、<kbd>Continue</kbd> ボタンをクリックする前に、ページを下にスクロールしてください。「Choose your system」セクションの下に「Setup using copy & paste」というセクションが表示されます。Semi-Automatic blocking タブを選択し、そのセクションのコードをコピーします。

スクリプトは、テーマコンポーネント を通じて追加するか、テーマを直接変更して追加できます。

管理者ダッシュボードで「Customize → Themes → Components」に移動し、「Install」をクリックします。

「Add CSS/HTML」をクリックし、コピーしたコードを「Body」セクションに追加します。

これで完了です!バナーは以下のように表示されるはずです。

:loudspeaker: バナーが表示されない場合は、「Debugging CSP」セクションを参照してください。

Cookie Consent Banner Theme Component

このテーマコンポーネントを使用すると、フォーラムにカスタマイズ可能なクッキー同意バナーを追加できます。これは、Insites によるオープンソースのクッキー同意バナー を Discourse 管理者が簡単に利用できるようにするものです。

Discourse テーマコンポーネントのインストール手順については、こちらをご覧ください:Installing a theme or theme component

Debugging CSP

クッキー同意バナーが表示されない場合:

  1. ブラウザのコンソールエラーを確認: ブラウザのコンソールで CSP 関連のエラーがないか確認してください。
  2. スクリプトの読み込み方法を確認: クッキー同意スクリプトが正しく読み込まれているか確認してください。
    • テーマヘッダーに追加されたスクリプトは自動的に信頼されます
    • loadScript() を介して動的に読み込まれるスクリプトや、プログラム的に作成されたスクリプト要素は、strict-dynamic で動作します
    • 「parser-inserted」スクリプト(script タグを含む HTML を直接注入すること)は避けてください
  3. 特別な設定: 一部の同意マネージャーは、特別な設定を必要とするか、CSP と連携するために特定の要件を持つ場合があります。CSP 互換性については、それぞれのドキュメントを確認してください。
  4. unsafe-eval: クッキー同意スクリプトに unsafe-eval が必要な場合、content security script src 設定に(引用符付きで 'unsafe-eval')追加できます。

:warning: 'unsafe-eval' や他の許容的なディレクティブを追加する際は注意してください。これらは CSP の効果を低下させる可能性があります。

これらの手順後も問題が解決しない場合は、クッキー同意プロバイダーが最新の CSP 実装と互換性があるか確認するか、サポートに連絡してください。

その他のコンテンツマネージャーサービスオプション

上記のクッキー管理オプションの他にも、Discourse と連携する可能性のある同意マネージャーサービスには以下が含まれます:

クッキーポリシー

このガイドでは、異なるベンダーのクッキーポリシーを Discourse の /privacy ページに追加する方法について説明します。

One Trust

注:OneTrust アカウントのセットアップ方法とテーマコンポーネントの作成方法は、上記のセクション で説明しています。

  • こちら の手順に従って、OneTrust アカウントで SPA サポートを有効にしてください。

  • 以下の 2 つのコードブロックを、テーマコンポーネントの Head セクションに順に追加します。

  • 注:2 つの関数 clearDupreloadOTBanner は、このページ から取得したものです。必ずそれらを使用してください。以下のコードに含まれるこれらの関数のバージョンはサンプルに過ぎず、閲覧時点では古くなっている可能性があります。

      <script type="text/x-handlebars" data-template-name="/connectors/below-static/add-cookie-policy">
          <div id="ot-sdk-cookie-policy"></div>
      </script>
    

      <script type="text/discourse-plugin" version="0.10.0">
          // SHOULD BE USED ONLY ON COOKIE POLICY. TRIGGER FUNCTION BELOW TO REMOVE DUPLICATE CATEGORIES
          // script taken from: https://my.onetrust.com/s/article/UUID-69162cb7-c4a2-ac70-39a1-ca69c9340046?language=en_US#UUID-69162cb7-c4a2-ac70-39a1-ca69c9340046_section-idm45403310539216
      
          function reloadOTBanner() {
      
              var otConsentSdk = document.getElementById("onetrust-consent-sdk");
              if (otConsentSdk) {
                  otConsentSdk.remove();
              }
      
              if (window.OneTrust != null) {
                  OneTrust.Init();
      
                  setTimeout(function() {
                      OneTrust.LoadBanner();
      
                      var toggleDisplay = document.getElementsByClassName(
                          "ot-sdk-show-settings"
                      );
      
                      for (var i = 0; i < toggleDisplay.length; i++) {
                          toggleDisplay[i].onclick = function(event) {
                              event.stopImmediatePropagation();
                              window.OneTrust.ToggleInfoDisplay();
                          };
                      }
                  }, 1000);
              }
          }
          function clearDup() {
              var sec = document.getElementById("ot-sdk-cookie-policy")
              var tally = [];
              for (var i = sec.length - 1; i >= 0; i--) {
                  if (tally[sec[i].firstChild.innerText] === undefined) {
                      tally[sec[i].firstChild.innerText] = 1;
                  } else {
                      //console.log(i,sec[i].firstChild.innerText);
                      sec[i].remove();
                      //return true;
                  }
              }
              //return false;
          }
          api.onAppEvent("page:changed", (data) => {
              if(data.currentRouteName == 'privacy') {
                  reloadOTBanner();
                  clearDup();
              }
          })
      </script>
    

  • ブラウザのコンソールを見ると、クッキー同意または関連コードを追加したファイルから OptanonWrapper 関数が欠落しているように見えるかもしれませんが、実際にはそうではありません。Discourse は OptanonWrapper 関数を含むコードブロックを削除するのではなく、そのブロックを独自のファイルに変換します。ブラウザの JS コンソールでその関数を呼び出して、関数が実際に存在することを確認してみてください。
「いいね!」 17

Cloudflareユーザー向け

https://community.cloudflare.com/t/how-to-create-custom-consent-modal-and-customise-it-using-zaraz-consent-api/699318