2022年4月に迫る改正個人情報保護法の施行によって、Cookieを含む個人関連情報の第三者提供には、本人同意の取得が義務付けられたことにより、CMP(Consent Management Platform 同意管理プラットフォーム)の導入が必須となった。

CMPは自発的なオプトイン(許可)形式が推奨されており、ユーザーがCookieを許可に同意しなければWebサイトはCookieを使用できない(同意のみのボタンがあるような選択の余地がない形式は望ましくない)ような実装にする必要があり、またCookieに関する明確な情報の提供を行わなければならない(データの利用目的ごとに同意を得ることが求められ、いつでも同意を撤回したり、同意の設定を変更することができなければならない )など、Webサイト側で行うことがいくつか存在する。

本記事ではGoogle Analytics(およびGoogle Tag Manager)に実装されているCMPの機能(Cookie使用の有無の設定)を使い方、またはオプトアウト、およびその注意点を取り上げてみる。

どのようにCookieが使用されているか

まず、どのようにCookieが使用されているかを解説する(Cookieがなにかという解説はこちらの記事を参照)。
Google Analyticsでは発行された外部のJSスクリプトによりCookieを生成するが、Cookieの生成元が自ドメインであり、またGoogleサーバーには送信されない(Cookieの情報をもとにパラメーターを送信する)仕様となっており、ファーストパーティーCookieとしての扱いであるが、それぞれのCookieがどのように使用されているかは下記をご覧いただきたい。
GTMを使用していたり、ディスプレイ広告やオプティマイズなどを使用している場合は、下記以外にもCookieが付与される。

GA4の場合

  • ユニークユーザーを区別する
  • ユーザーのセッションを区別する
Cookie名デフォルトの有効期限説明
_ga2 年ユーザーを区別するために使用します。
_gid24 時間ユーザーを区別するために使用します。
_ga_<container-id>
2 年
セッション状態を保持するために使用します。
_gac_gb_<container-id>90 日キャンペーンに関連する情報が含まれています。Google アナリティクスと Google 広告のアカウントをリンクしている場合は、オプトアウトしない限り、Google 広告ウェブサイトのコンバージョン タグでこの Cookie の情報が読み取られます。
引用元:https://developers.google.com/analytics/devguides/collection/ga4/cookie-usage?hl=ja

UAの場合

  • ユニークユーザーを区別する
  • リクエスト率を抑制する
Cookie名デフォルトの有効期限説明
_ga2 年ユーザーを区別するために使用します。
_gid24 時間ユーザーを区別するために使用します。
_gat1 分リクエスト率を抑制するために使用します。Google アナリティクスの導入が Google タグ マネージャーによって行われた場合、この Cookie の名前は _dc_gtm_<property- id> になります。
AMP_TOKEN30 秒~1 年クライアント ID を AMP クライアント ID サービスから取得するために使用できるトークンが含まれています。他の有効な値によって、オプトアウト、処理中のリクエスト、AMP クライアント ID サービスからのクライアント ID の取得エラーが示されます。
_gac_<property-id>
90 日
ユーザーのキャンペーン関連情報が含まれています。Google アナリティクスと Google 広告のアカウントをリンクしている場合は、オプトアウトしない限り、Google 広告ウェブサイトのコンバージョン タグでこの Cookie の情報が読み取られます。
引用元:https://developers.google.com/analytics/devguides/collection/ga4/cookie-usage?hl=ja

ga.jsの場合

  • 測定対象のドメインを判別する
  • ユニーク ユーザーを区別する
  • リクエスト率を抑制する
  • 以前の訪問の回数と時間を記憶する
  • トラフィック ソースに関する情報を記憶する
  • セッションの始点と終点を特定する
  • ユーザー単位のカスタム変数の値を記憶する
Cookie 名デフォルトの有効期限説明
__utma設定 / 更新から 2 年ユーザーとセッションを区別するために使用します。JavaScript ライブラリが実行され、__utma Cookie が存在していない場合に作成されます。この Cookie は Google アナリティクスにデータが送られるたびに更新されます。
__utmt10分リクエスト率を抑制するために使用します。
__utmb設定 / 更新から 30 分新規のセッションや訪問を判別するために使用します。JavaScript ライブラリが実行され、__utmb Cookie が存在していない場合に作成されます。この Cookie は Google アナリティクスにデータが送られるたびに更新されます。
__utmcブラウザ セッションの終了時ga.js では使用されません。urchin.js との相互運用性を確保するために設定されます。 これまでは __utmb Cookies と組み合わせて使用され、該当ユーザーのセッションまたは訪問が新規かどうかを判別していました。
__utmz設定 / 更新から 6 か月サイトへの到達経路を示すトラフィック ソースまたはキャンペーンを記録します。JavaScript ライブラリの実行時に作成され、Google アナリティクスにデータが送信されるたびに更新されます。
__utmv設定 / 更新から 2 年ユーザー単位のカスタム変数の値を記録するために使用します。 ユーザー単位のカスタム変数を伴う _setCustomVar メソッドを使うと作成されます(廃止された _setVar メソッドでも使用されていました)。この Cookie は Google アナリティクスにデータが送られるたびに更新されます。
引用元:https://developers.google.com/analytics/devguides/collection/ga4/cookie-usage?hl=ja

それぞれAnalyticsの種類によってCookieを使用している目的が異なるが、いずれも廃止の流れとなっている悪名高いサードパーティCookieではなく、ファーストパーティCookieであり、ユーザー行動を記憶するものとしてマーケティングにとっては必要不可欠な情報を取得するために存在する。

その一方、Cookieはユーザー固有の情報を保存するものとして、個人情報として扱われるものとなり、GDPRで規制される対象となった。
ユーザーはCookieを許可するかどうかを選択できるようになり、Cookieを使用しない場合も高度な分析が利用できるよう開発されたのが、GA4誕生のきっかけのひとつ(もうひとつはWeb以外の分析もできるようにすること)である。

GA4ではCookieを使用しない場合、Cookieのないping送信でアクセス解析ができるようになっており、またCookieを使用しないことにより取得できないユーザー情報を、企画学習と統計モデリングによるAI分析機能でデータのギャップを補うことができるようになっている。
※ただ、Cookieを使用していないユーザーと使用しているユーザーを分けて分析してみたほうが現状では望ましいように感じる

Cookieのないping送信では下記の情報が含まれる。
ping送信されるのは、同意ステータスが変更された場合、コンバージョンが発生した場合、アクセス解析する場合の3つのシーンである。

機能に関する情報(ブラウザによってパッシブに追加されるヘッダーなど):
・タイムスタンプ
・ユーザー エージェント(ウェブのみ)
・参照 URL

集計情報 / 個人が特定されない情報
・現在のページまたはユーザーがサイト訪問中にアクセスした過去のページの URL に広告クリック情報(GCLID / DCLID)が含まれていたかどうか
同意状況に関するブール値情報
各ページ読み込み時に生成される乱数
サイト所有者が使用する同意プラットフォームに関する情報(デベロッパー ID など)

https://support.google.com/analytics/answer/9976101?hl=ja

またそういった個人情報保護に重点を置く情勢に伴い、Google AnalyticsのGA4とUAに、Consent ModeというCMPを容易に実現するためのAPIが追加された。
これによってCookie使用の有無の設定が可能となっている。

(余談)GAでの個人情報の扱いについて

URLなどに個人情報を付与している場合、それをそのままGAに送信してダッシュボードで見れるような状態にしてはならない。
そのために各種APIを用いて匿名化あるいは隠蔽する必要がある。

(余談)IPアドレスの匿名化について

IPアドレスもCookieと同じく隠蔽できるよう匿名化するAPIが用意されている。
ただし、GA4は自動的にIPアドレスを匿名化しており、UAの場合に限る。
APIの詳細はこちら

// すべてのイベントの場合
gtag('config', '<GA_MEASUREMENT_ID>', { 'anonymize_ip': true });
// 単一イベントの場合
gtag('event', 'your_event', { 'anonymize_ip': true });

仕組みとしては下記のようだ(以下引用)。

アナリティクスのお客様が IP アドレスの匿名化をリクエストすると、技術的に可能な範囲でできるだけ迅速に匿名化処理が行われます。アナリティクスの IP 匿名化機能では、データが Google アナリティクスに届いた直後、まだメモリ内にある段階で、ユーザーの IP アドレスの末尾(IPv4 の場合は最後のオクテット、IPv6 の場合は最後の 80 ビット)が 0 に設定されます。この場合、完全な IP アドレスがディスクに書き込まれることはありません。
地域ディメンションは、匿名化された IP アドレスから後で取得されます。

〜中略〜

JavaScript 対応のウェブブラウザがアナリティクスのタグによってページを読み込む際は、非同期的に 2 つの処理を行います。アナリティクスの関数キューの読み込み / 処理と、アナリティクスの JavaScript のリクエストです。関数キューは、別のアナリティクス設定と収集関数がプッシュされる JavaScript 配列となります。これらの関数はアナリティクスを実装する際にサイト所有者様が設定するもので、アナリティクスのアカウント番号の指定や、Google アナリティクスで処理されるページビュー データの送信などの関数を含めることができます。
アナリティクスの JavaScript によって、Google アナリティクスにデータを送る関数(通常は gtag.js ライブラリの gtag('config', '<GA_MEASUREMENT_ID>' 関数)が関数キューから実行される際、データは http://www.google-analytics.com/collect の HTTP リクエストに付加される URL パラメータとして送信されます。ページ トラッキング関数より先に匿名化関数が呼び出された場合は、別のパラメータがピクセル リクエストに追加されます。IP 匿名化パラメータは次のようになります。
&aip=1

https://support.google.com/analytics/answer/2763052?hl=ja

(余談)GAのデータの保持期限について

GAにあるデータの保持期限はすべてのアクセス解析データが対象ではなく、ユーザーデータとイベントデータの保持期限のことである。
たとえばデータ保持期間を「26ヶ月」にした場合、この期間中に一度もWebサイトを訪問しなかったユーザーの行動データ等が削除される。
これはGDPRに則り、Cookieを使用して取得したデータの保持に関して明確に定めるためであるといわれている。
※BigQuery(GAと連動性が高いストレージサービス)など他のサービスにマネタイズするための戦略との見解もある
詳細はこちらに記載がある。

Google アナリティクスに保存されるイベント単位およびユーザー単位のデータには、保持期間とユーザー アクティビティのリセット設定が適用されますが、ユーザーによって入力された特定のデータ(年齢、性別、興味など)は、そのユーザーによるユニバーサル アナリティクス プロパティの操作が 6 か月間行われない場合、または Google アナリティクス 4 プロパティの操作が 2 か月間行われない場合、デフォルトで削除されます。

・Google アナリティクス 4 プロパティ
Google アナリティクス 4 プロパティ(アナリティクス 360 以外のバージョン)の場合、ユーザー単位のデータ(コンバージョンを含む)の保持期間は最大 14 か月に設定できます。
〜中略〜
年齢、性別、インタレスト カテゴリのデータには、設定に関係なく常に 2 か月の保持期間が適用されます。保持期間を延長すると、すでに収集したデータに適用されます。

・ユニバーサル アナリティクス プロパティ
ユニバーサル アナリティクスのプロパティでは、設定はユーザー単位およびイベント単位のデータに適用されます。
保持期間を延長したり、[自動的に期限切れにならない] に変更したりしても、すでに収集したデータへの影響はありません。たとえば、保持期間が 14 か月に設定されている間に収集されたデータは、保持期間を 26 か月に変更しても、収集されてから 14 か月後に削除されます。
標準の Google アナリティクス集計レポートには影響はありません。この設定で管理されるユーザーおよびイベントデータは、例えばレポートにカスタム セグメントを適用したり、通常とは異なるカスタム レポートを作成したりするなどの高度な機能を使用する場合にのみ必要です。

https://support.google.com/analytics/answer/7667196?hl=ja

Consent Modeについて

上述のように、GAにはCookie使用の有無の設定が可能なConsent Modeが存在する。
実装例は下記。

引用元:
https://developers.google.com/tag-platform/devguides/consent?hl=ja#gtag.js

gtag.js

<script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXX"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}

  // 追加
  gtag('consent', 'default', {
    'ad_storage': 'denied',
    'analytics_storage': 'denied',
    // 'wait_for_update': 500,
  });
  gtag("set", "ads_data_redaction", true);

  gtag('js', new Date());

  gtag('config', 'G-XXXXXXXXXX');
</script>

<script>
  // クリックハンドラーの設定
  function clickHandler() {
    gtag('consent', 'update', {
      'analytics_storage': 'granted',
      'wait_for_update': 500,
    });
  }
</script>
<button onclick="clickHandler()">同意する</button>

タグマネージャー

/*
デフォルトの測定機能を調整するには、サイトのすべてのページで、タグが呼び出される前に以下の手順を行う必要がある。

・dataLayer オブジェクトが定義されていることを確認する
・gtag() 関数が定義されていることを確認する
・gtag('consent', ...) コマンドを使用して測定機能を設定する
・dataLayer.push() を使用して default_consent イベントを送信する

たとえば、ad_storage と analytics_storage をデフォルトで拒否するには、次のように設定する
*/

<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}

gtag('consent', 'default', {
  'ad_storage': 'denied',
  'analytics_storage': 'denied',
  // 'wait_for_update': 500,
});
gtag("set", "ads_data_redaction", true);

dataLayer.push({
  'event': 'default_consent'
});
</script>

<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-XXXXXX');</script>
<!-- End Google Tag Manager -->

APIはドキュメントを参照。
Googleタグマネージャーのテンプレートで使用できるAPIはこちら
※GoogleのApps Scriptのライブラリ呼び出しのように、commonjs形式でrequireでライブラリを呼び出せるようにしているみたい

ちなみにanalytics.js(ga)にはConsent Modeがないが、下記のようなstorageオプションを使用することでCookieを無効化できる。

参考:https://developers.google.com/analytics/devguides/collection/analyticsjs/domains?hl=ja

ga('create', 'UA-XXXX-Y', {
  'storage': 'none',
  'clientId': '35009a79-1a05-49d7-b876-2b884d0f825b'
});

注意点

Consent Mode で analytics_storage を denied とすると ping でのアクセス計測となることを説明したが、その場合GAダッシュボードで計測が確認できない。
下記にも報告されているように、ドキュメント自体がまだできていないようでその点を留意する必要がある。

参考:
https://support.google.com/analytics/thread/108460851/events-in-ga4-when-analytics-consent-is-denied?hl=en
https://support.google.com/analytics/thread/104505089/consent-mode-anonymous-pings-don-t-show-up-in-analytics?hl=en

・2021/12/23 追記

UAに関しては、client_strageパラメーターを使用することでGAダッシュボードでも計測されていることを確認できた。
以下例。

gtag('config', 'UA-179071376-2', {
  client_storage: 'none', // UAのみ使用可能
  anonymize_ip: true, // GA4はデフォルトでtrueだが、UAはfalse
});

参考:https://goenning.net/2021/02/01/cookieless-google-analytics/

GA4で計測しようとすると現時点では、サーバーサイドでデータを加工する必要があるようだ

・2022/03/15追記

Cookie のない ping が、今後の測定用に Google アナリティクスへ送信され、Google アナリティクス 4 のモデリングに使用されます。

https://support.google.com/analytics/answer/9976101?hl=ja

とある通り、「今後の測定」=「GA4でのモデリング」に使用されると明記されている。

https://support.google.com/analytics/answer/10710245?hl=ja
https://support.google.com/analytics/answer/9846734

モデリングはCookieを使用したデータとpingデータをかけ合わせ、予測されるデータであり、今後の測定ではある程度のCookieを使用した計測データがないとモデリングされなくなるかもしれない。

・2023/05/23追記

予想通り、ある程度のデータの蓄積がないと、計測データが算出されないような実装となったようだ。

・プロパティで、少なくとも 7 日間、1 日あたり 1,000 件以上の analytics_storage=’denied’ のイベントが収集されている。
過去 28 日間のうち少なくとも 7 日間、1 日あたり 1,000 人以上のユーザーがプロパティで analytics_storage=’granted’ のイベントを送信している。 
 ・モデルのトレーニングが成功するためには、その 28 日間でデータしきい値に達している日数が 7 日より多く必要な場合があります。ただし、追加のデータがあってもモデルをトレーニングするのに十分ではない場合もあります。

https://support.google.com/analytics/answer/11161109?hl=ja

Cookieの設定の操作

より詳細に制御する必要がある場合は、さまざまなAPIが用意されているため、そちらを利用する。
ブラウザセッションベースのCookieの有効期限にしたりなどができるようになる。

リファレンスはこちら

確認方法

Cookieが使用されていないかどうかは、DevToolsのApplicationのCookiesから確認できる。

オプトアウトについて

GAへのデータ送信を無効化しサイトの計測自体を停止する場合は、下記のAPIを使用する。

参考:
https://developers.google.com/analytics/devguides/collection/analyticsjs/user-opt-out
https://developers.google.com/analytics/devguides/collection/ga4/disable-analytics?hl=ja

<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=MEASUREMENT_ID"></script>
<script>
  // gtag() を呼び出す前に、アナリティクスを無効化する各ページに設定する必要がある
  window['ga-disable-MEASUREMENT_ID'] = true; // 追加
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'MEASUREMENT_ID');
</script>

またChromeのアドオンのインストールを促すことでオプトアウトをする手段もあるが、一般的には推奨されていないように感じる。

サードパーティのCMPツール

Cookiebotが日本語対応していて幅広く使用されている。

サーバーサイドGTMについて

参考1:https://ayudante.jp/column/2020-08-21/11-00/
参考2:https://qiita.com/munaita_/items/638c646df0cfa610ffba
参考3:https://qiita.com/munaita_/items/7ba43a1da30914dd0738
参考4:https://developers.google.com/tag-manager/serverside/send-data

GTMのコンテナ種別にServerが新たに加わっており、これを利用すると、サーバーサイドで計測が発火するGTMが使用可能となる。
このため、クライアントサイドのリソースを消費せず、サーバー発行のファーストパーティクッキーの発行できるので、ITP対策になるなどのメリットがある。
ただし、サーバー用のコンテナはGCPを利用するため、本番環境では有料となる。

Googleタグマネージャーの設定「同意の初期化」について

「同意の初期化」というトリガーは、ややこしいが、タグをどの段階で発火させるか指定するものである。

トリガーの発火順は、「同意の初期化」→「初期化」→「ページビュー」→「DOM Ready」→「ウィンドウの読み込み」となる。

「同意の初期化」のトリガーで、同意に必要なタグを発火させ、「ページビュー」で組み込み変数が特定の値になっていれば、GA4を発火させるというふうな実装がよいようだ。

https://ayudante.jp/column/2021-06-02/13-00/