Cookieを知る

はじめに

Web開発者やセキュリティエンジニアにとって、Cookieは重要な概念です。その中でもSameSite属性は、クロスサイトリクエストフォージェリ(CSRF)やクロスサイトスクリプティング(XSS)などのセキュリティ攻撃からウェブアプリケーションを保護するための仕組みです。

CSRF(Cross-Site Request Forgery)

CSRF攻撃とは、攻撃者が被害者に代わって不正なリクエストを送信し、認証されたユーザーの権限を悪用する手法である。

HSTS(HTTP Strict Transport Security)

HSTSは、ウェブサイトがHTTPS経由でアクセスされることを強制するセキュリティポリシーである。これにより、中間者攻撃などのリスクを軽減できる。

クッキーとは

クッキーはWebブラウザに保存される小さなデータであり、ウェブサイトとブラウザ間で情報を共有するために使用されます。

クッキーの構造

クッキーは名前と値のペア、有効期限、ドメイン、パスなどの属性を持ちます。 データは単純なテキスト形式であり、セミコロンで区切られたキーと値の組み合わせです。

  • 例:
session_id=abc123; user_name=john_doe; expires=2024-03-31T00:00:00Z

Cookieの属性について

Secure属性

Secure属性は、Cookieが安全な通信(HTTPS)でのみ送信されるようにします。これにより、中間者攻撃からの保護が強化されます。

HttpOnly属性

HttpOnly属性は、JavaScriptからdocument.cookieを使用してこの属性が付加されたCookieを読み取ることや操作することを防ぎます。これにより、XSS(クロスサイトスクリプティング)攻撃からの保護が強化されます。

Domain属性

Domain属性は、Cookieが送信される対象のドメインを指定します。具体的には、この属性で指定されたドメイン以下(サブドメインを含む)に対してのみCookieが送信されます。

Path属性

Path属性は、Cookieが送信される対象のパスを指定します。具体的には、この属性で指定されたパス以下(サブディレクトリを含む)に対してのみCookieが送信されます。

SameSite属性

SameSite属性は、Cookieをブラウザがどのように扱うかを定義するもので、主にクロスサイトリクエストに対する保護機能を提供します。SameSite属性には3つの値があります。

  • Strict: SameSite=Strictを設定すると、同一サイト内でのみCookieが送信されます。他のサイトからのリクエストにはCookieが付与されません。

  • Lax: SameSite=Laxは、一部のクロスサイトリクエストに対してCookieが送信されますが、例えば外部ドメインからのPOSTリクエストなど、一部のケースでは送信されません。

  • None: SameSite=Noneは、同一サイト内外を問わず、すべてのリクエストにCookieが送信されます。ただし、Secure属性(HTTPS接続)が必要です。

次に、SameSite属性についての基本的な知識から実際の設定例までを解説します。

SameSite属性未指定の挙動

未指定の場合、ブラウザはデフォルトでSameSite=Laxとして扱います。次のような暫定的対策を取ることが考えられます。

Secure属性を使用

Secure属性を使用して、クッキーが安全な接続でのみ送信されるようにする。

HttpOnly属性を使用

HttpOnly属性を使用して、JavaScriptからの不正なアクセスを制限する。

SameSite: Strictでも攻撃が成功するケース

スキームだけ違うケース

同じドメインでもスキーム(HTTP/HTTPS)が異なる場合、SameSite: Strictでも攻撃が成功する可能性がある。

サブドメイン

サブドメインが異なる場合もSameSite: Strictでも攻撃が可能な場合がある。

SameSite属性の使用例

設定方法

Set-Cookie: myCookie=myValue; SameSite=Lax;

上記のように、Set-CookieヘッダーにSameSite属性を指定することで、Cookieの挙動を制御できます。

同一サイト内のみでのリクエストが必要な場合はSameSite: Strictを、

Set-Cookie: myCookie=myValue; SameSite=Strict;

外部ドメインからも受け入れる場合はSameSite: Noneを検討する。必要に応じてSecure属性も追加する。

Set-Cookie: myCookie=myValue; SameSite=None; Secure;

SameSite属性の注意点

  • ブラウザサポートの確認 SameSite属性は、すべてのブラウザで完全にサポートされているわけではありません。開発者は使用するブラウザの対応状況を確認する必要があります。

  • セキュリティ対策の一環 SameSite属性はセキュリティ対策の一環として使用されるべきですが、単独では完璧なセキュリティを提供するものではありません。他のセキュリティベストプラクティスと併用することが重要です。

  • SameSite=None; Secureを使用する場合、必ずHTTPSでサーバーが提供される必要があります。

SafariでサードパーティCookieを有効にする方法

  1. Safariを開きます。
  2. 右上の「設定」アイコンをクリックします。
  3. 「プライバシー」タブを選択します。
  4. 「すべてのウェブサイトからのCookieとウェブサイトデータをブロック」のチェックを外します。
  5. 必要に応じてSafariを再起動します。

ChromeシークレットモードでサードパーティCookieを有効にする方法

  1. シークレットモードのChromeウィンドウを開きます。
  2. 右上の3つのドットをクリックして、メニューを開きます。
  3. 「設定」をクリックします。
  4. 下にスクロールして「プライバシーとセキュリティ」をクリックします。
  5. 「Cookieとその他のサイトデータ」をクリックします。
  6. 「すべてのCookieをブロック」のオプションを無効にします。
  7. 必要に応じてChromeを再起動します。

これらの手順に従って、SafariとChromeのシークレットモードでサードパーティCookieを有効にできます。 Ref.:

Cookieファイルのパス

Cookieファイルのパスの典型は次のようになっています。

# Google Chromeの例
%LocalAppData%\Google\Chrome\User Data\Default\Network

# Firefox
%AppData%\Mozilla\Firefox\Profiles\YOUR_PROFILE\cookies.sqlite
# C:\Users\user\AppData\Roaming\Mozilla\Firefox\Profiles\z66l0gp7.default-release\cookies.sqlite-shm

# Opera
%AppData%\Opera Software\Opera Stable\Network

# Edge
%LOCALAPPDATA%\Microsoft\Edge\User Data\Default\Network

WSLでパスを指定するには、次のように検索・選択するとよいでしょう。

# Chrome
set cookie_path "(wslpath (wslvar LocalAppdata))/Google/Chrome/User Data"
fd "Cookies" "$cookie_path" -t f | fzf -m
 
# Firefox
set cookie_path "(wslpath (wslvar AppData))/Mozilla/Firefox/Profiles"
fd "cookies" "$cookie_path" -t f | fzf -m
 
# Opera
set cookie_path "(wslpath (wslvar AppData))/Opera\ Software/Opera\ Stable/Network/Cookies"
fd "Cookies" "$cookie_path" -t f | fzf -m
 
# Edge
set cookie_path "(wslpath (wslvar LocalAppdata))/Microsoft/Edge/User\ Data/Default/Network/Cookies"
fd "Cookies" "$cookie_path" -t f | fzf -m

Ref.:

Cookieの取得

ブラウザの機能や拡張を使うことで、Cookieの値やファイル出力を取得することができます。

Chrome DevToolsのNetworkタブを使う方法

Chrome DevToolsを使って、ページ更新後に最初のリクエストから応答ヘッダーを確認し、Cookieを取得する方法です。

  1. Chrome DevToolsを開く
    キーボードショートカット(F12キー、または Ctrl + Shift + I(Windows)、Command + Option + I(Mac))を使うか、ページ上で右クリックして検証 (Inspect)を選択します。

  2. Networkタブを選択
    DevToolsの上部にあるNetworkタブをクリックします。

  3. ページを再読み込みする
    Networkタブを開いた状態でページを再読み込みすると、リクエストの一覧がNetworkタブに表示されます。

  4. 最初のリクエストを確認
    リクエストの最上部に表示される最初の項目(通常HTMLリクエスト)をクリックします。

  5. 応答ヘッダーでCookieを確認
    詳細ビューが表示されたら、Headersタブに切り替えます。下にスクロールしてSet-Cookieヘッダーを探し、サーバーから送信されたCookie情報を確認できます。

Chrome DevToolsのApplicationタブを使う方法

Chrome DevToolsを使用して、現在アクセスしているサイト(例: x.com)のCookieを確認し、取得する手順です。

  1. Chrome DevToolsを開く
    キーボードショートカット(F12キー、または Ctrl + Shift + I(Windows)、Command + Option + I(Mac))を使うか、ページ上で右クリックして検証 (Inspect)を選択します。

  2. Applicationタブに移動する

    • DevToolsが開いたら、上部のタブメニューからApplicationタブを選択します。
    • 左側のメニューにあるStorageセクションからCookiesを選択します。
  3. Cookieの確認

    • Cookiesから、アクセスしているサイト(例: https://x.com)を選択します。
    • Cookie一覧が右側に表示され、名前(Name)、値(Value)、ドメイン、パス、有効期限などが確認できます。
  4. Cookieのコピー

    • 必要なCookieを右クリックし、Copy valueまたはCopyオプションでコピーできます。
    • または、テーブル全体をコピーして、必要に応じてテキストエディタなどに貼り付けます。

EditThisCookie拡張機能を使う方法

EditThisCookie拡張機能を使用すると、Cookieを簡単にエクスポートできます。エクスポート形式にはJSON形式とNetscape形式があり、それぞれ以下の用途があります。

  • JSON形式
    CookieをJSON形式で保存することで、データがキーと値のペアとして構造化され、他のプログラムやスクリプトで処理しやすくなります。
    JSON形式は一般的にAPIやプログラム間でデータを交換する際に用いられます。

  • Netscape形式
    ブラウザ間でCookieをインポート・エクスポートする際に利用される標準的な形式です。Netscape形式は、curlコマンドや他のブラウザ間での互換性を確保したい場合に便利です。この形式では、各Cookieが一行に保存され、次の情報が含まれます:
    ドメイン、フラグ、パス、有効期限、名前、値。

EditThisCookieでエクスポートする手順

  1. x.com(Twitter)などのサイトにアクセスした状態で、EditThisCookieアイコンをクリックして起動します。
  2. 画面右上にあるエクスポートボタン(矢印アイコン)をクリックします。
  3. エクスポートしたい形式(JSONまたはNetscape)を選択し、クリップボードにコピーするか、テキストファイルとして保存します。

保存したCookieを別のブラウザやツールで利用する際は、機密性に注意し、適切に管理してください。

Ref.: