SameSite属性 【SameSite Cookie】
概要
SameSite属性(SameSite Cookie)とは、WebサーバとWebブラウザの間でやり取りされるCookie(クッキー)に指定できる属性の一つで、サイトをまたがるアクセス時にクライアントからCookieを送信するか否かを指定するもの。CookieはWebコンテンツの伝送に用いられるHTTP(Hypertext Transfer Protocol)に用意された仕組みの一つで、サーバからの応答時に任意の文字列データを付与し、クライアントがこれを永続的に保存してサーバへのリクエスト時に毎回送信する。サーバがクライアントを識別したり、クライアント側で必要な情報を保管することができる。
SameSite属性はサーバがCookieを発行する際に指定することができる属性の一つで、サイトAのリンクをクリックしてサイトBにアクセスした場合や、サイトAのWebページがサイトBの画像ファイルを埋め込んで表示している場合など、サイトをまたぐアクセスが行われたときのCookieの扱いについて指定する。
指定値は「None」「Lax」「Strict」の3種類で、HTTPレスポンスの「Set-Cookie:」ヘッダで指定することができる。Cookie文字列本体や他の属性と「;」(セミコロン)で区切って「SameSite=Lax」のように指定する。オプションであるため指定しないこともでき、その場合はブラウザ側のデフォルト指定(近年ではLax)に従う。
SameSite=Strict
最も厳しく送信を制限する設定値で、サイト間の遷移(トップレベルナビゲーション)時にも、サイトをまたぐリソースの読み込み時にも、遷移先・参照先のWebサーバに対してCookieを送信しない。遷移先に対しては未ログイン状態となるためサービス間連携などの利便性は低下するが、クロスサイトリクエストフォージェリ(CSRF)攻撃を効果的に防ぐことができる。
SameSite=Lax
Strictよりは制限を緩和した設定値で、サイト間の遷移(トップレベルナビゲーション)時に遷移先にはCookieを送信し、遷移先でのログイン状態を維持することができる。ただし、POSTメソッドによる遷移(遷移先に情報送信や操作指示を行う)や、画像埋め込み、XHR(XMLHttpRequest)、iframeタグなどによるサイトをまたぐリソースの読み込み時にはCookieを送信しない。近年の主要ブラウザはSameSite属性が無指定の場合はLaxとする挙動が標準となっている。
SameSite=None
初期には存在しなかったが追加された指定値で、制約なくどのような場合もCookieを送信するよう指示する。近年、無指定の場合のデフォルト値がLax相当の挙動に変更されたため、「送信を制約しない」ことを指示するには明示的にNoneを指定する必要がある。その場合、必ずSecure属性(HTTPS接続必須)も併用しなければならないとされている。
同一サイトの範囲
SameSite属性における「同一のサイト」の判定はWebサイトのドメイン名によって行い、実質的に同一の所有者・管理主体であるとみなせる場合に同じサイトと判断する。具体的には、ドメイン名の階層構造の中で、トップレベルドメイン(TLD)や、TLDのように単一の所有者を持たないドメインを「eTLD」(effective TLD)と定義し、その次の階層のサブドメイン(eTLD+1)が異なっていれば異なるサイトとみなす。
例えば、「.com」はTLDであるため、「example1.com」と「example2.com」は異なるサイトとなる。一方、「.co.jp」はセカンドレベルのドメインだが、「coドメインの所有者」というものは存在せず、「.co」の部分は単にドメインの属性を表しているだけである。このようなドメインがeTLDで、「example1.co.jp」と「example2.co.jp」はセカンドレベルが共通しているが別のサイトとなる。
「.co.jp」のようにドメイン名の割り当て組織が管理するドメイン以外にも、「github.io」のようにドメイン自体が特定の所有者を持ちながら、ユーザーごとにサブドメインを付与するネットサービスなどでも、サブドメイン同士は別サイトであるとみなされる。何がeTLDに当たるのかは機械的に判定することはできず、Public Suffix Listという公開リストを参照して判定している。
なお、スクリプト実行におけるSame Origin(同一オリジン)概念とは異なり、URIスキームの「http://」と「https://」の違い、接続先ポート番号の「www.example.jp:80」と「www.example.jp:443」などの違いは影響せず、これらが異なっていても同じサイトであるとみなされる。