概要
Cookieに新たにSameSite属性というものが提案され、主要なブラウザで実装が進んでいる。
かつてはFirst-Party-Only Cookieと呼ばれていたもの。
クロスオリジンへのリクエスト送信時にCookieを付与しないことで、予期せぬ形での情報漏洩を緩和するのが目的。
CSRFを防げるという話ではなく、あくまで緩和という感じ。
このエントリを書いている段階で、Safari以外の主要ブラウザでは実装済みという感じ。
SameSite属性の値と挙動
値は lax
と strict
の2種類。
Set-Cookie: test=1; path=/; samesite=strict
strict
はあらゆるクロスオリジンへのリクエストにそのCookieは付与されなくなる。
a
タグなどで遷移するだけでもCookieは付与されない。
lax
は付与される場合と付与されない場合がある。
top-levelリクエストで、かつ、GETリクエストであるものにCookieが付与される。
ただし、 img
や iframe
、 XMLHttpRequests
などでは付与されない。
表にすると以下のような感じ。( ✅ : 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が送信されないため、それはそれで不便。