クッキー (Cookie)
クッキー とは
クッキー (Cookie) とは,HTTP における Web ブラウザと Web サーバとの間で状態を管理するプロトコル,ならびにそこで用いられる Web ブラウザに保存された情報のことです.一般に,サーバ側でユーザ識別やセッション管理を実現する目的に利用されます.
クッキーは,訪れた Web サイトによって作成されてユーザのコンピュータに保存される小さな情報ファイルです.ファイルの格納形式は,ブラウザにより異なっています.
クッキーには,ユーザの使用する言語やログイン情報(身元確認可能な個人情報を含む)など,Web サーバが利用するのための幅広い情報が保存されます.再びそのサイトを訪れた場合,ユーザの要求に応じた情報をサイトが提供できるようにブラウザによってそのサイトに属するクッキーが送信されます.
このとき,プライバシーに関わる情報が含まれている場合など,セキュリティ上の問題を発生させる可能性があります.
HTTP クッキーの仕様は,次の RFC 資料で規定されています.
RFC 6265, "HTTP State Management Mechanism", 2011.4
HTTP は,元来ハイパーテキストにおいて単にファイル転送を行うために開発されたため,同じ URL へのアクセスならその状況によらず同一の資源を提供することが前提となっています.すなわち,HTTP では同じ瞬間に同じ内容の要求を行っていれば,そのクライアントが以前にどのような通信を行っていても区別されません.HTTP はその意味で"状態"を持たないプロトコルです.
クッキーが必要となった理由は,この HTTP では“状態”を保持できないという性質です.インターネットの普及に伴い,様々な場面で Web(すなわちHTTP)が利用されるようになるにつれて,“状態”を保持したいというニーズが出てきました.そこで,「Web ブラウザが Web サーバから受け取った“状態”の情報をファイルに保存しておき,次回 Web サーバと交信する時に Web ブラウザがそれを Web サーバに送り返す」というクッキー の技術が導入されました.
クッキー の代表的な利用方法は,次のようなものです.
- パスワード認証におけるセッション情報の保持
パスワードまたはセッションIDのようなものをクッキーに埋め込むことにより利用者が意識することなく,セッション管理を行う.
ユーザの認証の手順は,一般に次のような手順で行われます.
- トップページでユーザIDとパスワードの入力を求める.
- 認証に成功するとサーバはセッションIDを割り当て,クッキーとしてクライアントに通知する.
- クライアントは以降の要求にクッキーとしてセッションIDを付加する.
- サーバは対応するセッション情報にアクセスし,どのユーザであるか識別する.
- フォーム入力時の書き込み内容の記録
最初の書き込みで再度入力する可能性のある情報をクッキーとして保存し,2 回目以降に表示する.
- 履歴情報の記録
Web サイト訪問者がページを閲覧した回数や,オンラインショップで購入した履歴などを保存する.
クッキー の動作
クッキー は,基本的には,Set-Cookie と Cookie という2種類の HTTPヘッダのやりとりで状態を管理します. まず,サーバが Set-Cookie というヘッダを発行し,Set-Cookieヘッダを受け取ったクライアントは,送り返す条件に一致したクッキーについては,リクエストメッセージと共に Cookie というヘッダを発行します.
- Web サーバが,
Set-Cookie: NAME=VALUE; expires=DATE; path=PATH; domain=DOMAIN_NAME; secure
という形式の HTTPヘッダ (NAME=VALUEのみ必須) を含めて,レスポンスを返す.
- ブラウザが,この値を URL と関連付けて保持する.
- 次にアクセスする場合,ブラウザは保持しているクッキーを検索し,送信先の URL に関連付けられたすべてのクッキーを
Cookie: NAME1=OPAQUE_STRING1; NAME2=OPAQUE_STRING2 ...
という形式の HTTPヘッダに含めて,リクエストを送信する.
ブラウザからクッキーが送信される条件は,Set-Cookie で設定された次の cookie 属性により決定されます.
- domain 属性
ブラウザがクッキーを送信するサーバのドメイン名が設定される.ブラウザがアクセスする URL 内のドメイン名がこれに後方一致(一部制限がある)する場合のみクッキーを送信する.省略した場合は,アクセスした URL に含まれるホスト名が使用される.
- path 属性
ブラウザが クッキーを送信するサーバのパス名が設定される.ブラウザがアクセスする URL 内のパス名がこれに前方一致する場合のみクッキーを送信する.省略した場合は,アクセスした URL に含まれるパス名が使用される.
- expires 属性
クッキーの有効期限が設定される.有効期限を経過したクッキーはクライアントから削除されるか,あるいはサーバへ送り返されない.expires 属性が省略されたクッキーは,クライアントとサーバの接続が終了した時に削除される.また,過去の日付を持っているクッキーは,受け取った時点で破棄される.
- secure 属性
secure と指定されていた場合,そのクッキーは,HTTPS により暗号化される場合にのみ送られる.secure 指定がない場合は,安全とみなされ通常の通信(HTTP)を通して平文で送られる.
セキュリティ問題
クッキーは,ユーザの情報をサーバに送信する意味からセキュリティ問題とも関係してきます.特に,ユーザの明示的な指示なしに,ブラウザのデフォルトな動作としてクッキーを送ることがあります.
- クッキーの発行制御
クッキーは,それを発行したサーバでなければ受け取ることができません.すなわち,abc.com が発行したクッキーは xyz.com に返されることはありません.しかし,path 属性のいいかげんなクッキーは同一ドメイン内の別のユーザにクッキーを盗み読まれる可能性があります.これは,クッキーの発行者の問題です.クッキーの発行者は,クッキーのセキュリティ問題をも考えてクッキーを発行する必要があります.例えば,プライバシーに関わるようなクッキーのデータは暗号化し,第三者が読んでもそれがどんな意味があるのかがわからないようにするべきです.
- クッキー 情報の暗号化
セッション管理のためにクッキーを使用し,暗号通信プロトコル (SSL/TLS) のような経路のセキュリティ保護を行っている Web アプリケーションにおいては,クッキーを secure 属性で発行することが必要です. secure 属性でない通常のクッキーは,SSL/TLS による経路のセキュリティ保護がありません.
SSL/TLS を用いてクッキーを暗号化していても,同じ Web サーバに SSL/TLS 通信で見るページ(https://...)と SSL/TLS 通信を使わないで見るページ(http://...)が混在している場合,問題が生じることがあります. ブラウザがクッキーの発行元と同じドメインの Web サーバにアクセスするときには,ブラウザはそのサーバに必ずそのクッキーを送り返します.このため,Web ブラウザは、SSL/TLS 通信を使わないページを見るときでも,クッキーを送信してきた
Web サーバに対してクッキーを送ってしまいます.この場合,クッキーはネットワーク通信を傍受した第三者に漏洩する可能性があります.
- クッキー の有効期限
クッキーに expires 属性が設定されている場合,指定された日時までクッキーが送信されます.すなわち,クッキーは指定された日時までファイル上に保存され,ブラウザ再起動後もその値が読み込まれ使用されます.この属性は,オートログイン機能を実現するために設定されることが多いのですが,このようなリスクが発生することは認識しておく必要があります.
クロスサイトスクリプティングもクッキー情報を不正に得る手段として使われる場合があります.クッキーには有効範囲が設定されていますが,その有効範囲内にクロスサイトスクリプティング脆弱性を持つページがある場合,JavaScript等を併用して他のサーバにクッキー情報を(URLの一部に組み込むなどして)送信させることが可能になります.
- セッションハイジャック
クッキーでセッション管理を行う場合,もし第三者がセッションIDを知ることができれば,その ID を名乗ることで本来のユーザになりすますことができます.このような「なりすまし」行為は,セッションハイジャックと呼ばれます.もし,第三者がセッションIDを知ることができれば,そのセッションが有効な間,パスワードを知らなくても「なりすまし」が可能となります.
第三者の クッキー情報を知る方法のひとつは盗聴です.盗聴を防ぐ手段として SSL/TLS の利用があります.ただし,SSL/TLS でクッキー情報を暗号化しているつもりでも,有効範囲の設定によっては SSL/TLS を利用しない要求にもクッキーが付加される可能性があります.
- トラッキング・クッキー
トラッキングクッキーとは,ユーザーのブラウジング傾向などを収集する目的のクッキーのことです.ユーザのアクセス履歴を追跡するという意味からトラッキング・クッキー(Tracking Cookie)と呼ばれたり,メインの HTML ではなく画像の提供元など第三者が設定するという意味からサードパーティ・クッキー(Third-party Cookie)と呼ばれたりします.
この情報は,たとえば Web サイトに表示される広告で利用されます.どのような Web サイトを好んで閲覧しているのかという情報から,その人が興味・関心をもっている分野が分かります.この情報を利用することで,適切な広告表示が可能となります.
これを,プライバシーの侵害と考えるような人向けに,クライアント向けセキュリティ対策ソフトには,トラッキング・クッキーを検出・除去する機能を備えているものもあります.しかし,トラッキングクッキーによる現実的な被害は無いと考えられます.
クッキー 利用上の注意
- ブラウザの設定によるクッキーの操作
Web ブラウザの多くは,初期状態でクッキーを送受信する設定になっています.クッキーの利用の可否はウェブ閲覧者の判断すべきものであるため,ブラウザの初期設定でそれらを操作できるようになっています.
例えば,ブラウザには,以下のような機能が備わっています.
- クッキーの保存を有効または無効にする.あるいは,クッキーを受け取った時に警告を出し,受け入れの可否を選択する.
- クッキーを削除する.
- 特定の Web サイトのからのクッキーをブロックする.
- サードパーティクッキーを禁止する(現在表示しているサイト以外の Web サイトからのクッキーをブロックする).
- クッキーの信頼性の確認
現実問題として,プライバシー漏洩の可能性としては,たとえクッキーを用いなかったとしても,その情報を得た会社がそれを他の会社に漏洩させるようなことも考えられます.つまり,そのクッキーを信用するかどうかということは,結局その先に居るクッキーの管理者を信用するか否かになります.したがって、そのサイトの内容が信用できない時は.当然そのサイトが発行するクッキーも信用すべきではないと言うことになります.
クッキーが信頼できる発行者が生成しているかを確認するには,以下のような点に留意する必要があります.
- ユーザにセッション状態が維持されようとしていることを注意し,それに同意を求めている.
- 「セッション中で得たユーザのあらゆる情報は,ユーザの明示的同意無しに第三者には明らかにされない」ということが明示されている.
- セッション情報自身には,機密性の高い情報(ユーザの氏名やパスワード等)を含んででいないこと,および機密性の高い情報を獲得するためにも使わないことが示されている.
- ユーザにそのセッションに関連する状態をいつでも消せることを示している.