【セキュリティ】クッキーとセッション管理
セッション管理
アプリケーションの状態を覚えておくこと
・HTTP認証を使う場合:ブラウザがIDやパスワードなど認証状態を記憶する
・HTTP認証を使わない場合:サーバが認証状態を記憶する
※https://shukapin.com/infographicIT/session-management より画像引用
クッキー
セッション管理をHTTPで実現する目的で導入された仕組み。
サーバ側からブラウザに対して、「名前=変数」の組を覚えておくよう指示するもの。
レスポンスヘッダの Set-Cookie:
により覚えておくよう指示する。
一旦クッキー値を覚えたブラウザは、その後同じサイトにリクエストを送信する際には、覚えたクッキー値を送信する。
リクエストヘッダのCookie:
で送信する。
※https://shukapin.com/infographicIT/cookie より画像引用
セッションID:覚えたクッキー値のこと。セッション情報にアクセスするためのキー情報となるもの。
※クッキーには有効期限を設定できる。
※クッキーに有効期限を設定していない場合、ブラウザを終了させるまで有効になる。
クッキーによるセッション管理
アプリケーションのデータを保持する目的でクッキーそのものに値を入れることをあまりしない理由
・クッキーが保持できる値の個数や文字列長には制限があるため
・クッキーの値は利用者本人には参照・変更できるので、秘密情報の格納には向かないため
実際には、クッキーには整理番号としてのセッションIDを格納しておき、実際の値はサーバーで管理する方法が広く用いられている。
※https://shukapin.com/infographicIT/session-management より画像引用
クッキー受渡しのフロー
※https://shukapin.com/infographicIT/cookie より画像引用
セッションIDに求められる要件
①第三者がセッションIDを推測できないこと
・別人による なりすましを防止するため、乱数を使うが、具体的にセッションIDには暗号論的疑似乱数生成器を用いて生成される。
・実際の開発には、Webアプリケーション開発ツールで提供されるセッションIDを利用する。
◎セッション管理機構は自作しないこと
②第三者からセッションIDを強制されないこと
・認証後にセッションIDを変更する
(例)セッションIDの固定化攻撃(Session Fixation Attack)
③第三者に情報が漏洩しないこと
セッションID漏洩の原因
・クッキー発行の際の属性に不備がある
・ネットワーク的にセッションIDが盗聴される
→ネットワークの経路上に盗聴の仕掛けがある場合
※セッションIDをネットワーク盗聴から保護するにはSSL(Secure Socket Layer)による暗号化が有効だが、クッキーを発行する際の属性指定には注意が必要
・クロスサイト・スクリプティングなどアプリケーションの脆弱性により漏洩する
・PHPやブラウザなどプラットフォームの脆弱性により漏洩する
・セッションIDをURLに保持している場合、Refererヘッダから漏洩する
クッキーの属性
※https://levelup.gitconnected.com/same-site-cookie-and-other-attributes-6a3c705efe0c より画像引用
属性 | 意味 |
---|---|
Domain | ブラウザがクッキー値を送信するサーバーのドメイン |
Path | ブラウザがクッキー値を送信するURLのディレクトリ |
Expires | クッキー値の有効期限 指定しない場合はブラウザの終了まで |
Secure | SSLの場合のみクッキーを送信 |
HttpOnly | この属性が指定されたクッキーはJavaScriptからアクセスできない |
Domain 属性
複数のサーバーに送信されるクッキーを生成したいときに使用する
※原則設定しないもの
・異なるドメインに対するクッキー設定はできないように制限している。
→異なるドメインに対するクッキーが設定できてしまうと、セッションIDの固定化攻撃の手段として利用されてしまうため
・Domain属性を指定しない状態がもっともクッキーの送信範囲が狭く、安全な状態と言える。クッキーを生成したサーバーにのみクッキーが送られる。
・Domain属性を不用意に設定してしまうと、脆弱性の原因になる。
※クッキーモンスター問題(Cookie Monster Bug)
Webサイトが過剰なCookieを生成したり、無駄に大きなCookieを送信したりすることで、以下のような問題が発生する現象を指す。
・ネットワークの遅延:大量のCookieがブラウザとサーバー間でやり取りされるため、通信速度が低下する。
・サーバーの負荷増加:サーバーが大量のCookieを処理するため、負荷が高くなる。
・ユーザー体験の低下:ページの読み込みが遅くなり、ユーザーがストレスを感じる。
・ドメインやサブドメインごとのCookie:メインドメインとサブドメインで別々のCookieが生成され、重複して送信されることがある。
Secure 属性
SSLの場合のみサーバーに送信される。
※Secure属性のついていないクッキーは、SSL通信かどうかに関係なく、常にサーバーに送信される。
HttpOnly 属性
JavaScriptからアクセスできないクッキーを設定するもの。
クッキーとして格納されたセッションIDを盗み出す攻撃の典型はクロスサイト・スクリプティング攻撃により、JavaScriptを悪用してクッキーを盗み出すというもの。
※セッションIDにはHttpOnly属性をつけるようにすると良い
セッションとクッキーの紐付け
1回目のアクセス
※https://kanda-it-school-kensyu.com/php-basic-contents/pb_ch11/pb_1103/ より画像引用
2回目のアクセス
※https://kanda-it-school-kensyu.com/php-basic-contents/pb_ch11/pb_1103/ より画像引用
ブラウザを閉じた後に再アクセス
※https://kanda-it-school-kensyu.com/php-basic-contents/pb_ch11/pb_1103/ より画像引用
参考文献・画像引用元URL
『体系的に学ぶ安全なWebアプリケーションの作り方 第2版(固定版) 脆弱性が生まれる原理と対策の実践』
Discussion