アクセス解析においてのCookieを理解する

アクセス解析に携わる中で、様々なことにcookieが絡んでくることが分かった。しかし、cookieについてはずっと分かったようで分からない状態が続いていたので調べつつまとめてみた

Cookie自体についてまとめたのちに、あらゆる疑問や具体例を見ていきCookieについての理解を深めていくという構成になっている。
そして、最後にCookieに関するURL集を載せている。

※本記事は、アクセス解析をGTM経由でGA4の計測設定を行っていることを想定して記載している。

# ▼Cookieとは？アクセス解析におけるCookieの役割

## 結論
Cookieとは、ウェブサイトがブラウザに保存するデータファイルで、ユーザのウェブサイト訪問時にその状態を記憶するために使用される。

## Cookieはどんな形をしているか
検証ツールconsoleタブにて`document.cookie`を実行することで確認できる

以下のように、
`key = value`の形のものが`;`にて連結されているだけのものとイメージできる

```text
__td_signed=true; 
_ga=GA1.XXXXXXXXX.XXXXXXXXXX; _ga_<container id>=GS1.1.XXXXXXXX.XX.X.XXXXXXXX.XX.0.0;
```

※実際のCookieは発行元ごとに各々別のファイルであり、上記のようにシンプルな形ではない。ブラウザがあらゆる発行元のcookieをまとめて連結して`cookie`オブジェクトに格納している

## アクセス解析におけるCookieの主な役割

- ユーザ識別
- セッション管理

**ユーザ識別のイメージ**
➀訪問したユーザにIDを振っておき、それをブラウザ側のCookieにて保存しておく。
➁再び同じユーザがそのページに来た際、CookieにユーザIDが保存されていたら同じユーザだと見なす
※ユーザが訪問する際にサーバへリクエストを行う。このリクエスト文にはブラウザ側のCookieが自動送信される仕組み

Cookieを使ってユーザを識別し、そのユーザが何回ページに訪れたかを記録する
そして、そのCookieの情報を活用してGA4にデータを送信している

## どんな情報を持っているか

- ユーザID(Client_id)
- セッション情報
- リファラー

など

## cookieの種類

- **【発行元による分類】**
    - ファーストパーティCookie（訪問サイトが発行）
    - サードパーティCookie（別ドメインが発行）
- **【有効期限による分類】**
    - セッションCookie（ブラウザ終了時に削除）
    - 永続Cookie（有効期限まで保存）

## 最近のcookieの状況

ブラウザによって制限に違いがある。
以下リンクにまとめられている。
[Cookieステータスまとめ](https://www.cookiestatus.com/)

簡単にまとめると以下(2025/3時点)

| ブラウザ | ファーストパーティの制限 | サードパーティの制限 |
|----------|----------------------|----------------------|
| Safari（ITP） | 7日で削除 | ブロック |
| Chrome（Privacy Sandbox） | 制限なし | 2024年から段階的に廃止（Topics API, FLEDGE へ移行） |

ここまでは簡単にCookieについてまとめた。
もう少し深くCookieについて見ていく

<!-- open属性なし -->
# ▼もう少し深くCookieの疑問を考える
ここからは気になった箇所をかいつまんで見ていただきたい
<details><summary>セッションをCookieを使って記録するイメージを付け、Cookieについて理解を深める</summary>

Cookieを使ってセッションを記録する流れのイメージをつけることを試みる

例としてユーザが初めて訪れるページAを考える

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2998651/ab0839ff-3d61-490d-be11-79a7e2cdc6d4.png)
[参考](https://www.gainjp.com/understanding-the-sessions-in-google-analytics.html)

この画像のような値をCookieの`_ga_<container-id>`に保存することでセッションを記録する

Cookieの付与と使用の流れは以下

```text
➀ブラウザがページAのサーバにリクエストを送信

➁サーバが、レスポンスヘッダーのCookieにセッションIDを書き込み、レスポンスを返す
具体的には、_ga_<container-id>というCookieのキーに値を書き込む
⇒ここにセッション数 = 1という情報も含む

③ユーザがページに訪問
GTMスニペットが読み込まれて、JavaScriptにて記述された処理が実行される。ここでこの訪問が新しいセッションかどうかを判断し、新しいセッションであればCookieのセッション数にあたる箇所を2に更新する
⇒このCookieの情報はブラウザ側が保持する

④2度目のページ訪問を行おうとした際、ページAのサーバにリクエストを送信。このリクエストにブラウザ側で保存していたCookieを含めて送信する。

⑤サーバが受け取ったcookieを見て、cookieを新規発行する必要はないと判断し、Cookieをレスポンスに載せて送り返す。サーバ側でのCookieの状態もこの際に更新される。

⑥これが繰り返される
```

以上のような流れでCookieの付与が行われ、サーバとブラウザでCookieのやり取りを行う。Cookieの`_ga_<container-id>`の値に含まれるセッション数の情報をGA4に送信することでユーザが何回ページを訪れたかを記録する。

※しかし、注意点がありCookieは前述したとおり規制される動きがある。Cookie制限があり、一定期間がたつと削除されてしまうことが多い。そのため、**記録できるセッション数つまり、ユーザが同じページに訪れた回数はCookieが削除される間隔の中での訪問数**となる。ユーザの生涯訪問回数を記録することはCookieによっては行えない。
ex)Cookieが7日間で削除される⇒ユーザのセッション数は7日でリセットされる

</details>

<details><summary>サードパーティCookieとは何なのかをイメージし、Cookieの問題点を押さえる</summary>

よく行われる説明は以下だ。
「発行元が違うCookieでファーストパーティは自社サイト、サードパーティは他のサイトの発行するものである」

これでざっくりとした理解は出来る。しかし、発行者が違うCookieと言われてもこれでは問題を理解しづらい。
具体例を元に理解を試みる。

広告が埋め込まれているページＡに訪問したユーザがいたとする。
すると、ブラウザはページAのHTMLを読み込み、HTML内部に書かれたスクリプトを実行していく。例えば以下のように広告のスクリプトが書かれていれば、ads.tracker.comにリクエストを送ることとなる。

```javascript
<script src="https://ads.tracker.com/banner.js"></script>
```

このリクエストに対して、サーバはレスポンスを返すのと同時にサードパーティCookieを発行する。
このCookieは`ads.tracker.com`ドメインのCookieとしてブラウザに保存される。

そして、同じユーザがページBという広告が含まれた違うページに訪問したとする。
すると、同じように訪問時に`ads.tracker.com`にリクエストが飛ばされる。このリクエスト時に自動で、ブラウザに保存したページAにて書き込んだ`ads.tracker.com`ドメインのCookieが`ads.tracker.com`に送信されてしまう。

ページAでのユーザ行動の情報が`ads.tracker.com`との通信を介して渡されているとイメージすることが出来る。これが**サードパーティCookie**であり、規制の対象となっている所以である。
一方で**ファーストパーティCookie**は、サードパーティCookieのように別ドメインにて発行されたCookieを使わない。そのため、他ドメインにてCookieの情報が使われることはなく、プライバシーリスクは低いとされる。また、ログイン情報の保持などにも使われる機能であるため完全に廃止する流れには今のところなっていないという事情もある。
</details>

<details><summary>Cookieの属性についてまとめる</summary>
Cookieをサーバ側が付与する際のオプションがある。以下がそのオプションである。

[参考:Google公式](https://developers.google.com/privacy-sandbox/cookies/basics/cookie-attributes?hl=ja)

それぞれについて簡単に補足する

- **Secure**
    - この属性を指定するとCookieはHTTPSを使用する時のみリクエストに含まれる
        - つまり、安全な通信じゃないときはCookieをサーバに送信しないように出来る
    - 基本デフォルトで含める必要あり
- **HTTPOnly**
    - JavaScriptの`document.cookie`を利用してCookieにアクセスすることは出来ない
        - つまり、JavaScriptにてCookieにアクセスしたい際に指定する
    - デフォルトで含める必要あり
- **SameSite**
    - Cookieをリクエストに含めるかどうかを制御する属性
        - クロスサイトリクエストかどうかが鍵となる
            - ドメインAで発行されたCookieがドメインBへ送られるリクエストのこと
    - Strict
        - クロスサイトリクエストではCookieを送信しないという設定
        - Cookieのオリジンサイトにあるページのリクエストにのみ送信される
        - ex)他のページ内にあるオリジンサイトへのリンクを踏んだ際は別ドメイン内からのリクエストとなる。これは行えない
    - Lax
        - 基本的にはStrictと同様
        - しかし、クロスサイトリクエストの中でリンクを経由でのリクエストであれば許容される
        - ex9他のページ内にあるオリジンサイトへのリンクを踏んだ際はCookieが送信される
    - None
        - 状況に関わらずCookieは送信される
        - Noneを指定しないとサードパーティCookieはリクエストに含まれない
- **Partitioned**
    - Cookieを保存する場所をドメインごとに分けることが出来る属性
    - ex)ページA,ページBにifameにてページCが置かれている時はページA⇒ページCにて使われるCookieとページB⇒ページCにて使われるCookieが分けられる。
    - デフォルトで含める必要あり
- **Expires and Max-Age**
    - Cookieを削除し送信しないようにする日時(Expires)または、秒単位での有効期限(Max-Age)を指定できる
- **Domain**
    - この属性を指定した場合、Cookieは指定したサブドメインのリクエストにも含まれる
    - 指定しないとサブドメインではCookieが送られない
- **Path**
    - ドメインの中でもパス単位でCookie送信の制限を行える
    - ex)/articlesと指定すると、articlesが含まれないURLパスのリクエストにはCookieがそうしんされない


</details>

<details><summary>検証ツールにてGA4のCookieを眺めてみる</summary>

![Cookie.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2998651/64043f44-371d-4ce0-9e3d-171c00bd74da.png)
[参考](https://www.gainjp.com/which-cookies-are-used-by-google-analytics-4.html)
※併せて、先述したCookieの属性を参照していただきたい

写真のように検証ツールのApplicationタブにて使われているCookieの一覧が見れる。
写真は_gaという文字列にて検索を行っておりこれはGA4関連のCookieにフィルターをかける意図である。下二つのCookieについて見ていくと以下のような情報が読み取れる。

- _gaという文字列を含むCookieのkeyが三つある。
- ユーザのclientID
- セッションID
- ページに何回訪問したか
    - Cookieの保持期間内に何回訪問したか
- Cookieが送られている範囲
    - Domain,Path
- Cookieの期限
    - Expires/Max-Age
- Cookieのサイズ
- Cookieが送られる条件は明示的に指示されていないため、デフォルトの値が入っている
    - HTTPS以外の通信でもCookieが送られる
    - JavaScriptにてCookieにアクセスできる
    - クロスサイトリクエストはリンクのみ許されている
    - Cookieのパーティションは行われていない



</details>

# ▼Tips

## URL集
- [CookieについてのGoogle公式のまとめ](https://developers.google.com/privacy-sandbox/cookies/basics?hl=ja&_gl=1*q92431*_up*MQ..*_ga*NjM0MjcyMDI0LjE3NDE1ODYxODg.*_ga_JPRHSQDH0G*MTc0MTU4NjE4Ny4xLjAuMTc0MTU4NjE4Ny4wLjAuMA..)
- [ブラウザごとのCookieステータスのまとめサイト](https://www.cookiestatus.com/)
- [Cookieの属性リファレンス](https://developers.google.com/privacy-sandbox/cookies/basics/cookie-attributes?hl=ja)
- [Cookieについての記事を20記事ほど上げているブログ](https://blog.jxck.io/)
- [GA4で使用されるCookieを理解する](https://www.gainjp.com/which-cookies-are-used-by-google-analytics-4.html)
- [GTMでのCookie属性を変更する方法](https://www.implementdigital.com/column/google-marketing-platform/how-to-change-ga4-cookie-attributes-in-gtm/)