LoginSignup
0
0

【デモあり】Cookie の SameSite 属性について

Posted at

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

  • NoneStrict の間に位置するような指定
  • 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 → 全てのクロスサイトなリクエストで送信される

ということが実際に検証できたのでよかったです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0