[Web技術]Cookieとは何ぞや?

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