概要
CookieのSameSite属性について、 None(=属性なし)
とLax
ではサーバで受け取るときにどう違うのか、実際に動かしてみます。
背景
Chromeに関するこの発表を受けて、CookieのSameSite属性を調べ始めたのですが、以下がわかりませんでした。
-
Lax
とStrict
ではなく、None
との違いは? - 付与の方法はわかったけど、受け取るときはどう違うの?
結論
先に結論だけ書くと、サーバでCookieを受け取る際、以下のように挙動が異なります。
-
SameSite=Lax
のCookieは、サーバとCookieのドメインが一致していても受け取れない場合がある(POSTメソッドや画像、iframeなど) -
SameSite=None
のCookieは、サーバとCookieのドメインが一致していれば受け取れる(受け取れない場合がない)
検証
以下のCookieを持った状態で検証します。
Name | Value | Domain | SameSite |
---|---|---|---|
a-lax | 1 | a.com | |
a-none | 2 | a.com | Lax |
b-lax | 3 | b.com | |
b-none | 4 | b.com | Lax |
SameSite=Laxを受け取れる場合
a.comの GET メソッドのフォームからb.comに遷移した場合、b.comのサーバで受け取れたのは以下のCookieです。
Name | Value | Domain | SameSite |
---|---|---|---|
b-lax | 3 | b.com | |
b-none | 4 | b.com | Lax |
ドメインがa.comのCookieは受け取れませんが、b.comのものは2つとも受け取れました。
b.comからb.comに遷移した場合も同様です。(GETでもPOSTでも)
SameSite=Laxを受け取れない場合
一方、a.comの POST メソッドのフォームからb.comに遷移した場合、b.comのサーバで受け取れたのは以下のCookieだけです。
Name | Value | Domain | SameSite |
---|---|---|---|
b-lax | 3 | b.com |
Cookieのドメインがサーバと同じb.comであっても、SameSite=Lax
のものは受け取れませんでした。
None
のものは受け取れました。
このように、SameSite=None(属性なし)
のCookieは受け取れるが、Lax
のCookieは受け取れない場合がありました。
他にも以下のようなドメインをまたいだサブリクエストでは、SameSite=Lax
のCookieは受け取れませんでした。
- a.comにb.comの画像を埋め込む
- a.comにb.comのiframeを埋め込む