「Chrome 80」でのクッキー（Cookie）の心構え 〜 SameSite属性・Secure属性 〜

# ニュース

:point_up: 2020年１月23日
[「トラッキング企業の対応策」を更新](#トラッキング企業の対応策)

:point_up: 2020年1月15日
[Google Chrome が 3rd Party Cookie の２年における段階的廃止を発表](#最新情報)

# 概要

2020年2月にリリースされる予定の Chrome バージョン80でサードパーティクッキー（3rd Party Cookie）の扱いが大きく変わり、端的にいうと制限が厳しくなります。

> Cookie を管理しているデベロッパーの皆さんはすぐに準備状況を評価することが重要です。

と本家、Google 様も注意喚起をしております。

これまでブラウザを利用した計測ツールでは**3rd Party Cookie**利用した手法が一般的でした。
アフィリエイト（トラッキング）やレコメンド広告表示などがその類です。
しかし、Chrome 80 の影響で、この 3rd Party Cookie の扱いが大きく変わります。
**何も対応しないと 今までの Cookie の埋め込み方法では計測等が失敗してしまう可能性があります。**

# Chrome 80 でどうなる？

特定の属性を付与しない限り 3rd Party Cookie にアクセスできなくなります。

>Chrome80 以降、SameSite 値が宣言されていない Cookie は SameSite=Lax として扱われます。
外部アクセスは、SameSite=None; Secure 設定のある Cookie のみ可能になります。ただし、これらが安全な接続からアクセスされることが条件です。

これまでの 3rd Party Cookie の動作を保つためには`SameSite=None`を指定する。しかし `SameSite=None` は `Secure`属性が必須になる。片方だけではダメということですね。
それではさっそく、SameSite 属性と Secure 属性 とで分けて深掘りしていきましょう。

## 1. SameSite 属性

以下のように３つの種類があります。

|名前|説明|備考|
|------|------|-----|
|Strict|3rd Party Context からは Cookie がセットされない|Strict=厳しい|
|Lax|3rd Party Context からは POST・iframe・XHR 等のリクエストに Cookie がセットされない|Lax=厳しくない・緩い|
|None| Cookie 送信する|None=なし|

*※ 3rd Party Context はクロスドメインと捉えて頂いて問題ないかと思います*

Strict が一番制限がきつく、Lax、None と緩くなっているのがわかります。
そして Chrome 80 では SameSite 属性を指定しないと真ん中の Lax として扱われるようになるというわけです。

様々なプログラミング言語においての SameSite 属性の埋め込み方のサンプルがあります。
[GitHub - GoogleChromeLabs/samesite-examples:](https://github.com/GoogleChromeLabs/samesite-examples)

## 2. Secure 属性

こちらはシンプルです。

**HTTPS 通信時にのみクッキーを送信できるようになる** です。

## 3. SameSite 属性と Secure 属性の組み合わせ

さて、先ほどの話に戻ります。

>外部アクセスは、SameSite=None; Secure 設定のある Cookie のみ可能になります。ただし、これらが安全な接続からアクセスされることが条件です。

`SameSite=None; Secure` の意味は、

- `SameSite=None` ==> Cookie のアクセス制限ルールを撤廃
- `Secure` ==> HTTPS環境必須

という事になります。
SameSite=None を指定したとしても、Secureな（HTTPS）環境がないと意味がなくなってしまうわけですね。
逆に言えば Secureな（HTTPS）環境があったとしても、SameSite=None を指定しないと、Lax がデフォルトで適用されてしまうので、 3rd Party Cookie のアクセス制限ルールが適用されてしまいます。

# 実験１
 
`SameSite=None; Secure` で Cookie を埋め込んでみよう。

```php:php
if (PHP_VERSION_ID < 70300) {
    setcookie($name, $value, $expires, '/; SameSite=None;', null, true, false);
} else {
    setcookie($name, $value, [
        'expires' => $expires,
        'path' => '/',
        'samesite' => 'None',
        'secure' => true,
    ]);
}
```

*PHP のバージョンによって、セットする書き方がかわるため、バージョン分岐させております。*


第４引数の `/; SameSite=None;` と第６引数の `true`（Secure） が重要な箇所です。さてChromeブラウザはどのように表示されるのか、デベロッパーコンソールを見てみましょう。

<img width="366" alt="スクリーンショット 2020-01-11 23.03.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26033/96c68e1d-0c3e-f1a2-bdbb-9ddc5b45311d.png">

無事、Secure にはチェックマークが入り、 SameSite には None が指定されております。

# 実験２

`SameSite=None; Secure` × `非SSL（http）環境`の組み合わせで Cookie を埋め込んでみたいと思います。
これまでの説明から上記の Secure 属性が必須となったことにより、`非SSL（http）環境`からCookie埋め込みは失敗するはずです。

<img width="500" alt="Cookie_bokasi.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26033/c87b2021-d3da-fb75-837f-b2a1998e755c.png">

画像が小さくてわかりづらいかもしれませんが、一番最後の部分が肝です。
secure の後ろに黄色の注意喚起マークが表示されております。無事埋め込みが失敗しました。

なおテストには最新バージョンが利用できる Google Chrome Canary を利用しました。

# まとめ

これまでの 3rd Party Context （クロスドメイン）における、Cookie 計測を行っていたシステムを継続して利用する場合は、`SameSite=None; Secure` の２つの指定をCookie埋め込み事に行う必要がある。
しかし、Secure 属性が必須になったことでHTTPS環境が必須になるため、現在環境がHTTPS環境になっていない場合は準備をする必要がある。

また、Apple のITP同様、Chrome も今後さらにバージョンアップしていくとともに、上記回避策も利用できなくなる可能性も多いにあります。`SameSite=Lax`がデフォルトになるということは、`SameSite=Lax`でも問題がないサービスに変化させていく必用も考慮してシステムをメンテナンスしていきましょう。

# 「Chrome 80」における広告企業の対応

[Affiliate Platform「アフィリコード | Chrome 80での3rd Party Cookieのブロックとアフィリエイト運営に関して](https://blog.affilicode.jp/article/30012)

# トラッキング企業の対応策

- [2020/01/24 Chrome ブラウザ バージョン 80 対応リリース実施のご報告 - USERGRAM ヘルプサイト](https://help.usergram.info/article/450-2020-01-24)

# 最新情報

**Google Chrome が 3rd Party Cookie の２年における段階的廃止を発表** したようです。 (2020.01.14 更新)

- [Chromium Blog | Building a more private web: A path towards making third party cookies obsolete
](https://blog.chromium.org/2020/01/building-more-private-web-path-towards.html)
- [窓の杜 | Google、「Chrome」のサードパーティーCookie対応を段階的に廃止 ～2年以内の実施を目指す](https://forest.watch.impress.co.jp/docs/news/1229285.html)


# 備考

Firefox や Microsoft Edge もこのモデルを適用するというアナウンスもあるようです。

# 参考

[Google Developers Japan: 新しい Cookie 設定 SameSite=None; Secure の準備を始めましょう](https://developers-jp.googleblog.com/2019/11/cookie-samesitenone-secure.html)