もくじ
Cookieについて
Cookieとは
Webサイトがユーザーのブラウザに一時的に保存するテキスト情報のことを指す
Cookieに保存される情報
ログイン情報(ユーザー名など)
サイト内の設定(言語やテーマ)
ショッピングカートの中身
閲覧履歴や行動履歴
Cookieの種類
セッションCookie
Webブラウザを閉じると自動的に削除される一時的なCookie
セキュリティリスクが比較的
パーシステントCookieとは
数日から数年にわたって保存可能
サイト訪問履歴やユーザー設定情報を長期間保存
セキュリティリスクが比較的高め
Cookieはパソコンのどこに保存されるのか
- Googleの場合
%LOCALAPPDATA%\Google\Chrome\User Data\<Profile>\Network\Cookies - Edgeの場合
%LOCALAPPDATA%\Microsoft\Edge\User Data\<Profile>\Network\Cookies
IE時代では、Cookieは平文(key=value)の形式で保存されていたが、セキュリティの観点から、現在では暗号化されている
Cookieが保持する情報
| 属性名 | 説明 | 入力例(Set-Cookie header) | 防止/軽減できる攻撃例 |
|---|---|---|---|
| domain | Cookieが送信される対象ドメインを指定。サブドメイン共有可 | Set-Cookie: session=abc; Domain=example.com |
サブドメイン間の漏洩防止、不正な外部ドメイン送信の抑制 |
| path | Cookie送信対象となるURLパスの範囲を限定 | Set-Cookie: session=abc; Path=/app |
パスを跨ぐ情報漏洩を防止(不要範囲のCookie送信抑止) |
| expires | Cookieの有効期限日時を指定(絶対時刻) | Set-Cookie: session=abc; Expires=Wed, 26 Feb 2025 23:59:59 GMT |
セッション維持による固定化リスク低減(期限管理) |
| max-age | 何秒後に期限切れになるか(相対時間) | Set-Cookie: session=abc; Max-Age=3600 |
長期セッションを避け、セッションハイジャック期間の縮小 |
| secure | HTTPS通信でのみCookie送信を許可。平文(HTTP)では送られない | Set-Cookie: session=abc; Secure |
通信盗聴(パケット傍受)によるCookie漏洩対策 |
| httponly | JavaScriptからCookieを参照不可にする。DOMアクセス禁止。 | Set-Cookie: session=abc; HttpOnly |
XSSによるCookie窃取防止 |
| samesite | 同一サイトのみCookie送信可の制限。値はStrict/Lax/None。 | Set-Cookie: session=abc; SameSite=Lax |
CSRF攻撃の強力な防止策 |
Cookieとセキュリティ
暗号方式
DPAPI(Windows暗号API)でAES暗号化がされている
2^32の鍵を使用している
2^32 = 3.4 * 10 ^ 38くらい。おっきい
Cookieとコーディング
JavascriptによるCookieの操作
cookieの読み取り
document. cookie
cookieの書き込み
document.cookie = “key=value; path=/; Secure; SameSite=None”;
cookieの削除
document.cookie = “key=; Max-Age=0”;
開発者ツールからCookieの取得
WebサイトにてCookieが利用されているかを確認する
開発者ツール > Applicationタブ > Storage > Cookies
該当サイトのドメイン「https://~~~」があればCookieを利用していることが分かる
Webサイトとの通信でやり取りされるCookieの情報を確認する
開発者ツール > ネットワーク > 監視
リクエストヘッダーであればユーザーからWebサイトに対してCookieを投げる
レスポンスヘッダーであればWebサイトから送られてきたデータをユーザーがCookieに保存する
おまけ:niconicoにおけるCookieのセッションIDを覗いてみる
1. ログイン時にCookieに設定されるSessionIDを確認する
ログインボタンを押下する直前にネットワークの監視を開始する
開発者ツール > Network > Search
set-cookie: user_session=user_session_~~~があることがわかる
検索結果をダブルクリックすると、該当の通信箇所のレスポンスヘッダーを閲覧できる
user_session=deleted;とあるので、一度古いSessionIDを削除することにより無効化してから、新しいSessionIDを付与していることが分かる。
Cookieタブに切り替えることで、Cookieの送受信をテーブル形式で閲覧できる
2. ログイン時にWebサイトに送信したユーザー名・パスワードを確認する
Payload (ペイロード): (主に POST, PUT リクエストの場合)
ブラウザからサーバーへ送信されたデータ(フォームの内容など)が表示される
ユーザー名とパスワードは開発者ツール上では平文で表示されるが、https通信だからもちろん暗号化はされる
3. CookieにSessionIDが保存されていることを確認する
開発者ツール > Applicationタブ > Storage > Cookies > https://www.nicovideo.jpにuser_sessionがあることがわかる
4. sessionIDを変更することによりログインできなくなることを確認する
value列をダブルクリックし、適当な値に書き換え、画面更新(F5)を行う
ログアウトされたことを確認
再度sessionIDを元に戻し、もう一度画面更新(F5)を行う
ログインできている状態に戻ったことがわかる(アカウント名が表示されている)
参考サイト
※1 AESで暗号化されたWindows ChromeのCookieを復号する【python】 #Python – Qiita





