について調べました。
same-site とは
same-siteの説明は下記の記事がとってもわかりやすかった。
https://web.dev/same-site-same-origin/
ブラウザが開いているURLと、リクエストが飛ぶ先の eTLD+1
が同じであれば same-site と判定される。
same-siteなリクエストについてはSameSite属性が何であろうとCookieは付与される。
SameSite属性によって挙動が変わるのはcross-siteなリクエストの時。
NoneとStrictの挙動
NoneとStrictは理解しやすい。
None: cross-siteなリクエストについて、どんな場合でもCookieは付与される。
Strict: cross-siteなリクエストについて、どんな場合でもCookieは付与されない。
Laxの挙動
Laxは少し複雑だ。 (なのでこの記事を書きました)
cross-siteなリクエストについてCookieが付与される条件は
- top-level navigationであること
- methodが
GET
,HEAD
,OPTIONS
,TRACE
であること
- top-level navigationは「ブラウザのアドレスバーに表示されているURLの変更が伴う遷移」のこと。
具体的には下記のようになる。
リクエスト生成方法 | Cookieがつくか | note |
---|---|---|
a tag | 🍪 | 他サイトからリンクを踏んで遷移する場合 |
img tag | ❌ | |
iframe tag | ❌ | |
form tag (method=GET) | 🍪 | 検索系のフォーム等で使われている |
form tag (method=POST) | ❌ | form (method=DELETE) というのはHTMLの仕様としてはない。 <input type="hidden" name="_method" value="delete" /> のようなフォームは POST をウェブフレームワークが気を利かせて扱っているだけ。 |
XMLHttpRequest | ❌ | |
Fetch | ❌ |
Cookieがつく ⇒ 🍪
Cookieがつかない ⇒ ❌
多くのリクエストはtop-level navigationではないので❌になる。
form (method=POST) は top-level navigationだがmethodがsafeではないので❌になる。
same-siteの場合は全て🍪になる。
CORSについて
CORSは Same Origin Policyをまたぐためのもので目的が異なる。
CORSの許可がない場合でもPOSTのリクエストは飛ぶのでCSRFは防げない。