Cookie
読み:クッキー
外語:Cookie

 Webサーバーがクライアント(ユーザーエージェント。Webブラウザーなど)に送信してくるデータのこと。
目次

概要
 受信したCookieを保存し、次回、このクライアントがそのサーバーにアクセスした時にその情報を送信することによって、サーバーはそのクライアントを識別し、継続的な処理を行なうことができる。
 ユーザーの設定情報の保持や、セキュリティの維持など、様々な目的で用いられている。
 情報を保持するのがクライアント側であるため、サーバー側では永続的に同等の情報を保持する必要がなくなるため、サーバー側の負荷の軽減効果も期待される。
 元々はデファクトスタンダードだったが、RFC 2965で定義され、これがRFC 6265で置き換えられて標準化過程となっている。

特徴

HTTPの制限
 WWWデータの送信に用いられるHTTPは、クライアントからの1回のリクエストに対して1つのファイルを送信するという1往復で完結する仕組みになっている。
 ある時にアクセスして来たクライアントが、直前にアクセスして来たクライアントと同じものか違うものか、判別する機能をプロトコルとして持っていない。
 多くの場合にはこれでも良いが、セキュリティを要する場合、これでは困ることになる。

セキュア環境
 金銭や個人情報などを扱う場合、正しいパスワードを入力したクライアントと、現在アクセスしているクライアントが、厳密に同じものかどうか識別できなければならない。
 さもないと、第三者が不正にアクセスされ、金銭や個人情報などが窃盗されることを許してしまう事になり、セキュリティ上問題となる。
 Cookieを用いると、一度そのWebページから離れていっても、再びアクセスした際に以前受け取ったCookieをサーバーへ送り返すことで、以前の続きをすることが可能となる。

その他機能
 以前アクセスしてきたクライアントと同じものであることをサーバーが認知できるなら、例えば掲示板のハンドル名欄に最初から前回入力された名前を表示したり、ショッピングサイトで購入履歴からその顧客の好みそうな物を表示するなど、利便性を向上させることも可能となる。
 実際に、各種のWeb掲示板や、ショッピングサイトでは、そのような使い方をしている。

プライバシー
 但し、プライバシー的な問題もある。
 多くのWebブラウザーでは、標準設定でCookieを受け入れるようになっており、Webサイトを巡回して回るだけで、無数のCookieがたまることになる。
 Cookieだけで個人の特定は不可能だが、そのクライアントがサーバー内でどのような利用をしているかは、サーバー側は(やろうと思えば)管理することが可能である。
 サーバー側に情報が送られるのが嫌だという場合には、Webブラウザーの設定で、Cookieを無視する事も可能である。但しこの場合、情報の保存機能も利用できなくなる。
 ログインを要求するサイトで、Cookieを用いてセキュリティを確保している場合、ログイン自体ができなくなる恐れもある。

技術

HTTP
 Cookieの情報は、HTTPヘッダーとして送受信される。
 この情報は、ドメイン名、URLパス、有効期限、名前、データという5種類の項目で構成されている。
 サーバーは、クライアントに送信する場合、HTTPヘッダー内に情報を含めるようにして送信する。クライアントから受け取る場合は、環境変数「HTTP_COOKIE」を参照する。

サーバー→クライアント

書式
 具体的には、次のような書式でサーバーからクライアントにCookieは送信される。
 Set-Cookie: NAME=VALUE; expires=DATE; path=PATH; domain=DOMAIN_NAME; secure
 NAMEがデータの名前で、重複しないように配慮して命名する。そしてVALUEが実際の値である。
 一度のHTTPアクセスで複数のSet-Cookieを送ることができる。
 NAMEやdomain、path属性をキーとし、重複するものは上書きされ、さもなくば新規に保存される。一つのdomain/pathあたり複数のNAMEで情報を保存させることも可能。例えばWeb掲示板なら、利用者の名前やメールアドレスなどを保管する等が考えられる。
 うち必須項目はNAMEのみで、残りはオプションである。

NAME属性
 Cookieの名前を示す必須の項目である。
 原則として英数文字を使用する。セミコロンやカンマ、空白文字、日本語文字などを使用する場合は、%を使ってエスケープしなければならない。
 NAME属性の引数はOPAQUE_STRINGと呼ばれ、受信したものを後にサーバーに送り返すのは、この内容である。

expires属性
 Cookieの有効期限(クッキーなので賞味期限と言うべきか)を示す。書式は電子メールのRFC 5322等と同等だとされている。
 曜日, DD-Mon-YYYY HH:MM:SS タイムゾーン
 例えば、次のようになる。
 Fri, 01-Jan-2010 00:00:00 +0900
 規格上、タイムゾーンをどう表現するかは明確ではないが、RFC 822(現RFC 5322)と同等と明記されているため、次のように実装するのが一般的。
 タイムゾーンは3ないし4桁で、-9999〜+9999。UTCより進んでいれば(日本、オーストラリア等)+、遅れていれば(アメリカなど)-とし、その後に数字4桁(上2桁は時間、下2桁は分)。例えば日本は+0900。UTC(GMT)は+0000で表わす(-0000ではない)。また、タイムゾーンの名称(GMTなど)でも良い。

domain属性
 Cookieを発行したサーバーのドメイン名。クライアントは、今アクセスしようとしているドメインに関するCookieを持っている場合にそれをサーバーに送出するが、これを検索する際にdomain属性を検索キーに用いる。比較基準は部分一致対応で、後方一致である。
 つまりdomain=wdic.orgであれば、www.wdic.orgというドメインと一致すると判断される。
 省略すれば、自動的に現在アクセスしているサーバーのドメインが設定される。

path属性
 Cookieを発行したURLのうちドメイン名を除いたもの。先のdomain属性と共にURLを作ることができる。
 比較基準は部分一致対応で、前方一致である。
 pathは/から始める。最も単純なものは「path=/」である。

secure属性
 この属性がある場合は、そのCookieはHTTPSなど安全な経路においてのみ送信されることを示す。

クライアント→サーバー
 ユーザーエージェント(クライアント)はHTTPサーバー接続の際、自己が保持する全てのCookieからアクセス先ドメインに関連するものを検索し、該当するものを1行にまとめてHTTPヘッダーとして送信する。
 具体的には「Cookie: NAME1=OPAQUE_STRING1; NAME2=OPAQUE_STRING2; …」のような書式でクライアントからサーバーにCookieは送信される。
 Webサーバーで動作するCGIプログラム等は、環境変数「HTTP_COOKIE」を参照することで、その内容を得ることができる。

セキュリティ関係
 ログイン情報を保存するため「セッションID」を発行し、それをCookieとしてクライアントに送る、というのが現在よくある手法である。
 Cookieだけで完全なセキュリティを維持することは不可能ではあるが、最も現実的な手法として、よく使われている。
 Cookieに関する、セキュリティを脅かす技術に、次のようなものがある。

実装関係

ローカルマシンでのCookieのありか

Windows 9x
 Windows 9x系でIE4以降では、"C:\WINDOWS\Temporary Internet Files" に "Cookie:username@url" という名のテクストファイルとして保存される。
 これが実体であるのか、仮想的にそのように見せているのかは定かではない。

Windows 2000
 Windows 2000のInternet Explorerでは、"C:\Documents and Settings\username\Cookies" フォルダーに "username@url.txt" と名前の付いたテクストファイルとして保存される。
 一つにつき1ファイルとなる。

Windows XP
 Windows XPのInternet Explorerでは、"C:\Documents and Settings\username\Local Settings\Temporary Internet Files" フォルダーに "Cookie:d@domainname/" としてポインター(実ファイルへのショートカットのようなもの)が保存される。
 実体は、Windows 2000と同様に "C:\Documents and Settings\username\Cookies" フォルダーに "username@url.txt" と名前の付いたテクストファイルとして保存される。但し、日本語のusernameは正規化(小文字→大文字化)されるため、シフトJISとして見たときに文字化けすることがある。
 実体を削除してもTemporary Internet Filesのポインターは消えないが、Temporary Internet Filesのポインターを消せば実体も削除される。

Windows 7
 Windows 7のInternet Explorerでは、"C:\Users\Default\AppData\Roaming\Microsoft\Windows\Cookies" などに置かれる。

Netscape Navigator
 古いNetscape Navigatorでは、"C:\Program Files\Netscape\Users\default\cookies.txt" などのファイル(任意変更可)に1行1url形式で格納されていた。
 この形式は無駄にファイルが増えないという利点があるが、所定のURLのみの削除が難しく、また読みづらいという問題点がある。但し、通常は人間が読み書きするものではない。

Mozilla Firefox
 Mozilla FirefoxではSQLite 3が使われており、各種データもSQLiteのデータベースとして管理される。Cookieも同様である。
 データは、%APPDATA% 以下に保存される。
 %APPDATA% は、Windows XPなら "C:\WINDOWS\Application Data"、Windows 7なら "C:\Users\username\AppData\Roaming" であり、この下に、"Mozilla\Firefox\Profiles\xxxxxxxx.default\cookies.sqlite" というパスでSQLite 3のファイル形式で保存されている。

Cookieの削除方法
 Internet Explorerの場合、バージョンによって異なるが、ツール→インターネットオプション→Cookieの削除ボタン、が基本である。Internet Explorer 7では、インターネットオプションの「全般」タブに、削除ボタンがある。
 Mozilla Firefoxの場合、ツール→オプション→プライバシータブ→Cookieを表示ボタン→すべてのCookieを削除ボタン、である。
 Operaの場合、ツール→設定→詳細設定タブ→Cookie→Cookie設定→削除ボタン、である。

再検索