We’ve migrated our documentation to a new site, which means some URLs have changed.
Audience

GDPRとcx.js

https://docs.piano.io/faq-article/gdpr-and-cx-js/ の参考日本語訳です。


EU/EEAユーザにサービスを提供しているPianoのお客様は2018年5月25日に発効されたGDPRの規則を遵守しなければなりません。そうしたお客様のために、確実に遵守するための機能を提供しています。Pianoではユーザーの同意を収集した後にcx.jsの使用をチューニングするためのAPIを提供します。このAPIは同意の収集のためのソリューションではありませんが、どの同意が登録されたかに基づいて、Pianoの機能を有効または無効にする手段となります。

注意事項

このドキュメントは新しい機能や要件が登場するにつれて追加や変更が発生します。更新内容は "API変更ログ" に記載されます。

APIの使用例は http://dev1.cxpublic.com/cxjs/consent.html で確認できます。この例では様々な状態での同意のAPI の挙動を示しています。

利用例

<script type="text/javascript">

  var cX = cX || { options: { consent: true } };
  cX.callQueue = cX.callQueue || [];
  cX.callQueue.push(['requireConsent']);
  cX.callQueue.push(['setSiteId', '12345']);
  cX.callQueue.push(['sendPageViewEvent']);
  cX.callQueue.push(['invoke', displayConsent]);


  function displayConsent() {
     if (!cX.hasConsent('pv')) { // 'segment'、'recs'、'ad' の同意も確認できます
        // 同意を尋ねるUI機能をトリガーにするための機能
        showConsentUI();
     }
  }

  function showConsentUI() {
     if (confirm('Will you allow us to send analytics data?')) {
        cX.callQueue.push(['setConsent', { pv: true }]); // または 同期している場合 `cX.setConsent({ pv: true });` or `cX.setConsent({ pv: true });`
     }
  }

</script>
<script type="text/javascript">
  (function(d,s,e,t){e=d.createElement(s);e.type='text/java'+s;e.async='async';
  e.src='http'+('https:'===location.protocol?'s://s':'://')+'cdn.cxense.com/cx.js';
  t=d.getElementsByTagName(s)[0];t.parentNode.insertBefore(e,t);})(document,'script');
</script>

同意のクラス:Piano製品への同意のマッピング

お客様とデータコントローラーとして、データ収集の目的はお客様のニーズに固有のものです。例えば、記事のパフォーマンス分析するためにページビューイベントを収集するのかもしれませんし、広告を個別化するためにエンドユーザをセグメントに分類するのかもしれません。データの使用目的はデータコントローラーによってエンドユーザに説明されなければならず、この情報はお客様ごとに取得され、管理されなければなりません。しかし、適切な方法で動作するためにエンドユーザによって同意されたことはcx.jsに翻訳されなければなりません。

cx.js の同意のAPIを使う場合、スクリプトはお客様の目的に基づいて、何を収集して何を収集しないのかを知らされます。APIについては、特定のデータ収集とデータ処理活動を "consent class" と呼ばれる形式で説明しています。

現在、4つの同意に関するクラスがあります。特に許可されたコンテクストに基づいてこれらのクラスをオンまたはオフにします。

  1. pv: ページビューの意味です。具体的に、ページビューイベント、DMPイベント、それらを介しての個人データ配信など、これは全てのイベント収集する活動を対象としています。エンドユーザがお客様固有の目的に対して収集されるデータを拒否した場合、これを設定しないまたは false に設定する必要があります

  2. segment: データ主体のセグメントのメンバー登録の有効化についてを意味します。お客様固有の利用例に対してセグメントに追加されることをエンドユーザが拒否した場合、これを設定しないまたは false に設定する必要があります。

  3. recs: コンテンツのレコメンドまたはコンテンツウィジェットを含むものを意味します。エンドユーザが recs を拒否した場合、個別化されたレコメンドはオプトアウトされます。お客様のページにコンテンツウィジェットを挿入することはできますが、個別化されていないレコメンド(例えば、記事の人気ランキング)のみが返されます。

  4. ad: 広告用の個人データ処理を指します。広告が特に認められますが、エンドユーザが個別化された広告やリターゲティングのような、何らかの理由で処理された個人データを持つことを拒否した場合、これを設定しないまたは falseを設定する必要があります。

ページビューの収集を拒否された場合、非個別化されたコンテンツレコメンドを除いて、他の同意のクラスも自動的に拒否されたことになることにご注意ください。これは他の活動を合理的に登録し有効化する以前に、ページビュー収集が重要なステップであるためです。

ここの重要な点は同意機能が有効になっている場合に、コンテンツウィジェットをリクエストする他にも、機能が明示的に有効になるまで何も起こらないということです。

端末と位置情報データ

収集できる/できないデータの種類に対応するため、2つの別の同意のクラスを利用できます。ユーザーは引き続きトラッキングやその他の機能を許可する一方で、使用している端末やトラッキング中の場所に関するデータの使用を制限したい場合があります。

これら2つの同意のクラスはconsent API のバージョン2の一部として、セットアップ時に有効化する必要があります。

 

var cX = cX || { options: { consent: true, consentVersion: 2 }}
// or
cX.callQueue.push(['requireConsent', 2]);

正しい consent version を使用したcXを事前に設定することなく、端末や位置情報を提供した場合、これらの新しい同意のクラスは無視されます。

これらの同意のクラスは他のものと同様です。

cX.callQueue.push(['setConsent', { pv: true, device: true, geo: true }]);

新たな2つの同意のクラスは

  1. device: これは、ユーザーエージェントやブラウザ情報など、ユーザーが使用している端末を特定するために使用できるあらゆるデータを対象としています。同意が得られない場合、データが存在しないため、端末情報を必要とする特定のアクティビティが制限されます。

  2. geo: 

    エンドユーザーの位置情報データの検索を対象とします。実際には、IPルックアップによる位置情報をある程度の精度でカバーします。また、ページビュー要求での緯度と経度のパラメータの使用を拒否します。

これらの同意が設定されていない場合、エンドユーザーの要求に応じて、それぞれのイベントやウィジェットの呼び出しからデータが消去されます。

実際には、このデータを削除することで、特定のセグメント、コンテンツ、CCEウィジェットなどの品質が低下する可能性があります。例えば、あるサイトグループのオーディエンスの大部分が端末の同意で減少した場合、端末データに依存しているセグメントはマッチするユーザーが減少します。

 

同意機能を使用するために必要なこと

cx.js にある同意の機能はオプトインです。機能させるためにはオンにする必要があります。
同意の機能を有効にするには cX変数 を宣言する時にオプションを追加しなければなりません。

var cX = cX || { options: { consent: true } }


同意を有効にすると、cx.js の使用に影響があります。この機能を有効にすると、イベントは配信されなくなり、セグメントのメンバー登録が無効になります。コンテンツウィジェットはページに挿入できますが、限定的なものになります(個別化しないコンテンツウィジェット)。

同意を有効化するもう一つの方法があります。cX.requireConsent() が使えます。

  1. 非同期: cX.callQueue.push(['requireConsent'])

  2. 同期: cX.requireConsent()

しかし、同意オプションを true に設定する方が望ましいです。ブラウザでの JavaScript の読み込み順序は決まらない可能性があります。また、非同期の方法を使用する場合、 call queue の順番を必ずしも決めることができません。したがって同意を有効にするのが遅すぎる可能性があり、同意機能が有効になる前にイベントを配信できるようになってしまいます。但し、わかりやすく明記すると、call queue の順序が制御された時点でオプションが有効になります。

同意の機能は何に影響しますか?

同意が必要で、(同期、非同期どちらとも)関連する同意のクラスが有効になっていない場合に、以下の関数はデフォルトで実行されません。

  1. sendPageViewEvent() pv が設定されていない、または false が設定されている場合

  2. sendEvent() pv が設定されていない、または false が設定されている場合

  3. getUserSegmentIds() segment が設定されていない、または false が設定されている場合

  4. insertAdSpace() ad が設定されていない、または false が設定されている場合

  5. insertMultipleAdSpaces() ad が設定されていない、または false が設定されている場合

  6. sync() ad が設定されていない、または false が設定されている場合

  7. addExternalId() pv が設定されていない、または false が設定されている場合

これらのメソッドが実行される前に、同意は明示的に付与しなければなりません。

関数が非同期に呼び出されると、同意のクラスが有効になった時に関数を実行するオプションがあります。これについては次のセクションで説明します。

同意の設定

ユーザの同意の設定はこのメソッドで行います。

  1. 非同期: cX.callQueue.push(['setConsent', <同意のobject>]);

  2. 同期: cX.setConsent(<同意のobject>);

同意の設定の例はこちらです(例では同期のメソッドを使用しています)。

  1. cX.setConsent({ pv: true, segment: true }); これはページビューを収集でき、ユーザをセグメントに登録できることを示しています。

  2. cX.setConsent({ pv: true }); これはユーザがページビューとイベントを収集することだけに同意したことを示しています。

  3. cX.setConsent({ pv: true, segment: true, ad: true, recs: true }); ユーザは全てに同意しています。

  4. cX.setConsent({ pv: false, segment: false, ad: false, recs: false }); ユーザは何も同意しません。

以下は非同期メソッドを仕様した同様の例です。

  1. cX.callQueue.push(['setConsent', { pv: true, segment: true }]); これはページビューを収集でき、ユーザをセグメントに登録できることを示しています。

  2. cX.callQueue.push(['setConsent', { pv: true }]); これはユーザがページビューとイベントを収集することだけに同意したことを示しています

  3. cX.callQueue.push(['setConsent', { pv: true, segment: true, ad: true, recs: true }]); ユーザは全てに同意しています。

  4. cX.callQueue.push(['setConsent', { pv: false, segment: false, ad: false, recs: false }]); ユーザは何も同意しません。

この情報は cX_cons というローカルストレージのキーにクエリストリングの形式で格納されます。上の例を使用すると、次のように格納されます。

  1. pv=true&segment=true

  2. pv=true

  3. pv=true&segment=true&ad=true&recs=true

  4. pv=false&segment=false&ad=false&recs=false

この情報はページビューイベントでも配信されます。上の例を使用すると、(rep.gif 呼び出しの)ページビューイベントにこのURLパラメータが含まれます。

  1. con=y,pv,segment

  2. con=y,pv

  3. con=y,pv,segment,ad,recs

  4. con=y

同意の情報は弊社のサービスが非同意ユーザに対するイベントデータを拒否したり、与えられた同意に基づいて正しいコンテンツを配信することを保証するために格納されています。

他に同意がなく、con=y を単独で使用すると、そのページビューが匿名のページビューであることをイベントレシーバーに伝えるために予約されます。con=y,pv は全てのページビューのトラッキングにユーザが同意したことを意味します。

同意の call queue を再実行する

非同期で同意を設定する場合、関数では runCallQueue フラグを設定することで実行を拒否されたメソッドのキューを再実行できます。

cX.setConsent(<同意のobject>, { runCallQueue: true });

この例で同意が送られると、実行を拒否された機能が実行されます。

これは単なる例であって、ページ上でうまく動作しない可能性があることにご注意ください。例えば、更なる記事を表示するための無限スクロールに依存するページは自動的に call queue を実行するとうまく動作しないことがあります。このような場合、同意が得られた後にデータ配信メソッドを実行するような別の実装をご用意ください。

同意について確認する

hasConsent(<同意のclass>) を用いて、特定の同意のクラス(pv、segment、recs、ad) に対する同意を確認することができます。

同期:
cX.hasConsent('pv'); cX.hasConsent('segment'); cX.hasConsent('recs'); cX.hasConsent('ad');

注意事項: 現時点で非同期で同意を確認するために信頼性のあるメソッドがありません。

1つのオブジェクトで全ての同意を得ることができます。

cX.allUserConsents()

1つまたは複数の同意のクラスが allUserConsents() の出力に設定されていない場合、そのクラスは非同意に設定されているとみなすことができます。例えばこの結果が戻された場合、

{ pv: true }

セグメントのメンバー登録、各個人へのレコメンド、各個人への広告ターゲティングは同意されていないとみなすことができます。

同意のAPIでカバーされないこと

同意がオフになっても、setCustomParameters() は実行されます。現時点では、これはページビューにのみ影響します。しかし、カスタムパラメーターが個人データである場合とそうでない場合があるため、適用する場合は個人データを含むカスタムパラメータを適切に削除することは、お客様の裁量に委ねられます。例えば、ページビューリクエストを通じて送信する広告のような個人データがある場合、以下のように確認することができます。

同期:

if (cX.hasConsent('ad')) {
    cX.setCustomParameters({ userIdForAd: userId });
}

cX.sendPageViewEvent();

非同期:

cX.callQueue.push(['invoke', function () {
    if (cX.hasConsent('ad')) {
        cX.setCustomParameters({ userIdForAd: userId });
    }
}]);

cX.callQueue.push(['sendPageViewEvent]);

匿名のページビュー

同意の機能が有効になり、pv が false に設定されると、匿名のページビューが配信されます。これらのリクエストは識別情報を送信しません。cx.js を介して cookieが設定されると、これらの cookie はバックエンドによって無視されます。cookie とIDの削除に関する詳しい情報は  "Cookie/ローカルストレージ/IDをクリアする" をご確認ください。

ページビューリクエストは3つのデータポイントを送信します。これらの全ては個人を識別するものではありません。

Query string パラメータ

目的

デフォルト

con

同意が有効になっている

y

loc

URL(location.href またはユーザ指定の値)

-

sid

サイトID

-

リクエストURLの例:

https://comcluster.cxense.com/Repo/rep.gif?con=y&loc=https%3A%2F%2Fwww.cxense.com&sid=12345

匿名のページビューは、ページを離脱(unload)する際に送信されます。通常のページビューとは送信タイミングが異なりますので、ご注意ください。

匿名のページビュー収集の詳細

ページビューは匿名で収集され、格納されます。イベントが匿名であるため、ユニークユーザのカウントやセッションのトラッキングのようなユーザをトラッキングする機能には使用できません。

getUserSegmentIds() の挙動

下位互換のため、同意の機能が有効化されており、同意のクラスセグメントが false に設定されている場合、getUserSegmentIds() は空の配列を返します。 

getUserSegmentIds() が空の配列を返す、セグメントのクラスが有効になっていない、ユーザがどのセグメントにもマッチしなかった場合に考慮するとよいかもしれません。

同意のモードが有効になり、セグメントの値に true がセットされている場合、getUserSegmentIds()  は正常に機能します。

Cookie/ローカルストレージ/IDをクリアする

"sessions" が終了した後(ユーザがログアウトした時など)、Cookie とローカルストレージの形式で cx.js によって作成されたものを削除することをお勧めします。これはデータの主体が公共のコンピューターをし使っていて、それらのセッションを完全に消し、次のデータ主体に識別できないようにしたい場合に特に重要です。 

これを cX.clearIds() 関数で実装できます。以下の例ではコード内に仮の "log out" 例と同期及び非同期の型でどのように実行されるかを説明しています

同期:

if (user.isLoggedOut()) {
    cX.clearIds();
}

非同期:

if (user.isLoggedOut()) {
    cX.callQueue.push(['clearIds']);
}

// 他の例:

cX.callQueue.push(['invoke', function () {
    if (user.isLoggedOut()) {
        cX.clearIds();
    }
}]);

API 変更ログ

  1. 2-5-2018: Exposed getExternalId() and sync() to consent handling.

  2. 7-5-2018: clearIds() was added to the consent API.

  3. 9-5-2018: Exclusions on setCustomParameters().

  4. 19-6-2018: getUserSegmentIds() should return a blank array if consent mode is on and segments are not consented to.

  5. 12-20-2020: Adding information on device and geo flags.

Last updated: