SameSite 属性とは
- Cookie に指定可能な比較的新しい属性
- SameSite 属性を付与することで、CSRF 脆弱性に対していくらかの防御ができる
SameSite 属性に指定できる 3 つの値
None
- これまでの Cookie の挙動通り、全ての cross-site なリクエスト対して Cookie が付与される
Strict
- same-site に対するリクエストにのみ Cookie が付与される
- Cookie を使いログイン認証をしているサイトに対して(セッション ID を Cookie として保持し、その有無によってセッションを維持する) cross-site なサイトに設置されたリンクから遷移した場合、リクエストに Cookie が付与されないため未ログイン状態となる
- CSRF攻撃 に対して有効だが、ユーザーは cross-site なサイトからログインした状態で遷移できないため、ユーザは再度ログイン処理や再読み込み処理が必要となる
Lax
-
None
とStrict
の間に位置するような指定 - cross-site を含むページ遷移のようなトップレベルのナビゲーションと、same-site のスクリプトや画像などのサブリソースに対するアクセスに対してのみ Cookie が付与される
つまり、ログインした状態で遷移できる - ただし、POST メソッドのような unsafe な HTTP メソッドによる cross-site なトップレベルのナビゲーションに対して Cookie が付与されない
- POST メソッドなどを使ったフォームのサブミットに対する CSRF 攻撃に対して有効。
デモ
ケースごとにサイト間のリクエストを試してみて、実行結果を見てみた方が早いと思うので、検証用アプリケーションを用意しました。
サイトA ヘアクセスし、リンクから Cookie を取得し、特定のケースごとの実行結果をご自身の目で確認してみてください。
検証ツール > アプリケーションから正常に Cookie ブラウザにセットされている確認できます。
※起動に少々時間がかかるかもしれないです。
a タグによる遷移
{
cookie_1: "none",
cookie_2: "lax"
}
GET メソッドフォームによる遷移
{
cookie_1: "none",
cookie_2: "lax"
}
Post メソッドフォームによる遷移
{
cookie_1: "none"
}
検証してみて
Strict → クロスサイトなリクエストでは送信されない
Lax → GET によるクロスサイトなリクエストのみ送信される
None → 全てのクロスサイトなリクエストで送信される
ということが実際に検証できたのでよかったです。