コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

Cookie の SameSiteと関連の設定に関してざっくりまとめる

SameSiteCookieと呼ばれたりするこの要素は何なのかまとめる

SameSiteとはなにか

SameSiteとは直訳すると「同じサイト」ということだが、その同じサイトであるということの概念は以下のページにまとめられている。

「same-site」と「same-origin」を理解する

上記の内容からSameSiteは「eTLD+1が同じサイト」となる。なおeTLDという言葉の意味に関してはこちらを参照のこと

対する概念としてのCrossSite

SameSiteが同じサイトを示す言葉だが、この言葉の反対の「異なるサイト」ということを表すための言葉が CrossSite となる。

Cookieが送られる条件

セットされたどのアクセスのときに送られるかは、Set-Cookie をしたときの属性が影響する。影響する属性は以下の3つ。

  • Domain属性
  • Path属性
  • SameSite属性

Domain属性

Domain属性は未指定の状態だと「Cookieを設定したホストと同じホスト」になる。

逆に値を指定すると指定したドメインを含むドメインに送信されるようになり、未指定時より条件をゆるくすることができる。

詳しくは以下の記事などを参照。

Path属性

Path属性は、設定した値のパスにのみCookieを送るための設定。

この属性が安全性に寄与するかなどの話題は今回の本筋ではないので省略するが以下の記事を参照していただきたい。

SameSite属性

SameSiteは前段で説明したとおり、SameSite以外のリクエスト対してCookieを送るかどうかを判断する。

SameSite属性に設定できる値のパターン

設定できる値は3つある。

  • None
  • Lax
  • Strict

Strict

一番強い設定で、SameSiteに該当するサイトのみCookieを送信する設定。そのためクロスサイトになるドメインには送信されない。

そのためaタグで遷移する場合もGETリクエストになるため、遷移先のドメインが異なる場合に初手はCookieが送信されない。

Lax

MDNの説明を抜粋すると以下の通り

画像やフレームを読み込むリクエストのようなクロスサイトリクエストではクッキーを送信しませんが、ユーザーが外部サイトから元のサイトに移動するとき(例えば、リンクをたどるとき)には送信されることを意味します。 - Set-Cookie - HTTP | MDN

上記の通りStrictを緩和させたもので、ページを遷移する場合のみCookieを送信する。

もともとクロスサイトスクリプティング防止の目的が強い仕様のため悪意のあるサイトからのPOSTリクエストの際にブラウザのCookieが乗らないLaxの設定であればやりたいことは満たせることになる。

この設定はメジャーブラウザ規定の設定。

None

SameSite実装前と同じ挙動になり、どのような場合でもCookieが送られる。

Domain属性とSameSite属性の違い

パッと見すると似たような話に見えるDomainとSameSiteだが2つは異なり分類としては以下のようになる。

  • メインとなるページを描画する際の情報取得に関してのドメイン設定が Domain
  • リソースの取得やformアクションなどメインとなるページ外へのCookie送信の設定が SameSite

参考サイト