1. ホーム
  2. Web プログラミング
  3. 関連情報

CookieのSameSiteプロパティの概要

2022-01-17 04:47:08

I. CSRF攻撃とは何ですか?

CookieはユーザーのID情報を保存するために使われることが多く、悪意のあるウェブサイトが正しいCookieを使ってHTTPリクエストを偽造することに成功します。これがCSRF攻撃です。

例えば、ユーザーが銀行のウェブサイトにアクセスしたとします。 your-bank.com で、銀行のサーバーがCookieを送信します。

Set-Cookie:id=a3fWa;

その後、ユーザーが悪質なサイトにアクセスした malicious.com というフォームがあります。

<form action="your-bank.com/transfer" method="POST">
  ...
</form>

ユーザーがこのフォームを送信するように騙されると、銀行サイトは正しいクッキーでリクエストを受け取ります。この攻撃を防ぐために、このフォームには通常、サーバーにこれが本物のリクエストであることを伝えるランダムトークンが付属しています。

<form action="your-bank.com/transfer" method="POST">
  <input type="hidden" name="token" value="dad3weg34">
  ...
</form>

このような第三者によるウェブサイトのリードはサードパーティークッキーと呼ばれ、CSRF攻撃以外にもユーザー追跡に利用される可能性があります。

例えば、Facebookが第三者のサイトに見えない画像を挿入する。

<ブロッククオート

<img src="facebook.com" style="visibility:hidden;">

ブラウザが上記のコードを読み込むと、Facebookにクッキーでリクエストを送信し、あなたが誰で、どのサイトを訪問したかをFacebookが知ることができるようにします。

II. SameSiteプロパティ

クッキーの SameSite 属性は、サードパーティーのクッキーを制限するために使用され、セキュリティリスクを低減します。

3つの値を設定することができます。

  • ストリクト
  • 緩い
  • なし

2.1 ストリクト

Strict サードパーティーのクッキーを最も厳しく完全に禁止し、サイトを横断する際にはいかなる状況でもクッキーを送信しない。言い換えれば、現在のページのURLがリクエスト対象に一致し、その場合にのみクッキーが運ばれるということである。

<ブロッククオート

Set-Cookie: Set-Cookie: CookieName=CookieValue; SameSite=Strict;

このルールは厳しすぎるため、非常に悪いユーザーエクスペリエンスを引き起こす可能性があります。例えば、現在のページにGitHubのリンクがある場合、ユーザーはGitHub Cookieを使わずにジャンプをクリックし、ジャンプは常にログインしない状態になります。

2.2 ラックス

Lax ルールは若干緩和され、ターゲットURLに移動するGetリクエストを除き、ほとんどのケースでサードパーティCookieも送信されません。

<ブロッククオート

Set-Cookie: Set-Cookie: CookieName=CookieValue; SameSite=Lax;

ターゲットURLにナビゲートするGETリクエストには、リンク、プリロードリクエスト、GETフォームの3つのケースのみが含まれます。詳細は以下の表を参照してください。

<テーブル リクエストの種類 例 通常の場合 緩やかな リンク <a href="... " rel="external nofollow" rel="external nofollow" ></a> クッキーの送信 クッキーの送信 プリロード <link rel="prerender" href="... " rel="external nofollow" /> クッキーの送信 クッキーの送信 GETフォーム <form method="GET" action="... ">.です。 クッキーの送信 クッキーの送信 POSTフォーム <form method="POST" action="... ">.です。 クッキーの送信 送信しない iframe <iframe src="... "></iframe> クッキーの送信 送信しない AJAX $.get("... ") クッキーの送信 送信しない 画像 <img src="... "> クッキーの送信 送信しない

を設定します。 Strict または Lax それ以降は、基本的にCSRF攻撃はなくなります。もちろん、これはユーザーのブラウザがSameSite属性をサポートしていることが前提です。

2.3 なし

Chromeは、今後 Lax をデフォルト設定にしました。この時点では、サイトが明示的に SameSite 属性に設定し、それを None . ただし、前提条件として Secure 属性(クッキーは HTTPS プロトコルでのみ送信可能)を使用する必要があり、そうでない場合は無効となります。

以下の設定は有効ではありません。

<ブロッククオート

Set-Cookie: widget_session=abc123; SameSite=None

以下の設定が有効です。

<ブロッククオート

Set-Cookie: widget_session=abc123; SameSite=None;セキュア

III. 参考リンク

今回ご紹介するのは、クッキーのSameSiteプロパティに関する記事です。クッキーのSameSiteプロパティに関する詳しい情報は、スクリプトハウスの過去記事を検索するか、以下の関連記事を引き続き閲覧してください。