概要

Cookieに新たにSameSite属性というものが提案され、主要なブラウザで実装が進んでいる。
かつてはFirst-Party-Only Cookieと呼ばれていたもの。

クロスオリジンへのリクエスト送信時にCookieを付与しないことで、予期せぬ形での情報漏洩を緩和するのが目的。
CSRFを防げるという話ではなく、あくまで緩和という感じ。

このエントリを書いている段階で、Safari以外の主要ブラウザでは実装済みという感じ。

SameSite属性の値と挙動

値は laxstrict の2種類。

Set-Cookie: test=1; path=/; samesite=strict

strict はあらゆるクロスオリジンへのリクエストにそのCookieは付与されなくなる。
aタグなどで遷移するだけでもCookieは付与されない。

lax は付与される場合と付与されない場合がある。
top-levelリクエストで、かつ、GETリクエストであるものにCookieが付与される。
ただし、 imgiframeXMLHttpRequests などでは付与されない。

表にすると以下のような感じ。( ✅ : Cookieが送信される、❌ : Cookieが送信されない )

HTML lax strict
<a href="http://example.com/">
<form method="get" action="http://example.com/" >
<form method="post" action="http://example.com/" >
<img src="http://example.com/img.png">
<iframe src="http://example.com/">
axios.get('http://example.com/', {withCredentials: true})

所感

このように strict だとクロスオリジンなリクエストではCookieが送信されないため、CSRF攻撃の緩和につながる。
一方でリンクを辿るだけでもCookieが送信されないため、それはそれで不便。