Cookieとは、以下のようなことを実現するための機構です。
通常、上記のようなデータはCGIなどを用いてサーバー側に記録するのですが、Cookieを用いることにより、クライアント側(ブラウザを起動する側)のハードディスク内に記録することができるようになります。
セキュリティを考慮して、Cookieで蓄積できる情報は簡単な文字列のみで、保存場所もブラウザにより固定されています。例えば、次のようなファイルです。
http://home.netscape.com/newsref/std/cookie_spec.html からCookieの仕様書を得る事ができます。「Cookie」という妙に美味しそうな名前の由来を調べてみたら、「Cookieの名前には特に理由は無い」と説明されていました。
CookieはJavaScriptや、CGIを用いて実現されます。実行例を次に示します。「Cookieを保存するか?」のダイアログが表示される場合は[OK]としてください。「再表示」を行うと、これまでの訪問回数と、前回の訪問日が表示されます。オフラインでは動作しません。オンラインで実行してください。
うまくいかない場合は、ブラウザのCookieの設定がオフになっていないか確認してください。Internet Explorer 5.0の場合は[ツール]-[インターネットオプション]-[セキュリティ]-[レベルのカスタマイズ]-[Cookie]で、Netscape Communicator 4.*の場合は[編集]-[設定]-[詳細]-[Cookie]でCookieのオン・オフを制御できます。
HTMLを用いてCookieの値を記録させるには次のようにします。
<META HTTP-EQUIV="Set-Cookie" CONTENT="〜">
JavaScriptを用いる場合は次のようにします。
document.cookie = "〜";
CGI(Perl)を用いる場合は次のようにします。
print "Set-Cookie: 〜\n"; print "Content-type: text/html\n"; print "\n";
〜の部分には次のような文字列を指定します。
NAME=値; expires=値; domain=値; path=値; secure
NAME=値; 以外は省略可能です。それぞれ、次のような意味があります。
| パラメータ | 意味 |
|---|---|
| NAME=値 | 好きな名前に好きな値を指定します。セミコロン(;)、カンマ(,)、空白文字( )や日本語を使用する際にはそれぞれ、%3B、%2C、%20のようにエンコードして記述しなくてはなりません。複数の値を設定するには、複数のSet-Cookie:を用いるか、複数の名前と組を一つの値としてエンコードし、後で自力でデコードしてやらなくてはなりません。 |
| expires=値 | クライアント側のディスクに記録されるCookieの有効期限を指定します。値は次のようなフォーマットで指定します。
Fri, 31-Dec-1999 23:59:59 GMT
詳しい仕様は RFC850, RFC1036, RFC1123 などを参照してください。この項目を省略した場合、Cookieはクライアント側のキャッシュ上にのみ存在し、セッション終了時に削除されます。過去の値を指定すると直ちにCookieを削除します。 |
| domain=値 | Cookieを発行するWWWサーバーの名前を指定します。省略した場合はWWWサーバーのホスト名(www2e.biglobe.ne.jp など)になります。 |
| path=値 | Cookieを発行するパス名を指定します。Cookieの値はこのパス名にマッチするすべてのファイルに対して返されます。例えば
http://www.xxx.com/cgi-bin/xxx.cgi
がCookieを設定する場合、pathの指定を省略すると、Netscape Communicator 4.0の場合は path=/cgi-bin、IE4.0の場合は path=/cgi-bin/ と指定したと見なされるのですが、マッチングにより、Cookieの値が全く無関係なスクリプト(/cgi-bin/yyy.cgi や /cgi-bin/zzz.cgiなど)にまで返されてしまいます。迂闊に path=/ とすると、設定したCookieの値が、そのサーバーを共有しているすべてのページに対して送信されてしまうので注意してください。
これを防ぐためには、CGIの環境変数SCRIPT_NAMEなどを用いて path=/cgi-bin/xxx.cgi と指定すればよいのですが、この方法は Netscape Communicator やIE2.0ではうまくいくのに、IE4.0では正常に動作しなくなります。 |
| secure | これを記述しておくと、サーバーとの接続がセキュアである時のみ、Cookie情報が送信されるようになります。 |
具体的な書き込みの例は、上記の「Cookieの実行例」のソースコードを参照してください。
JavaScriptを用いてCookieの値を読みこむには、document.cookie の値を参照します。
alert(document.cookie);
CGI(Perl)でCookieの値を読みこむには、環境変数の HTTP_COOKIE の値を参照します。
print "$ENV{'HTTP_COOKIE'}\n";
具体的な読み込みの例は、上記の「Cookieの実行例」のソースコードを参照してください。
Cookieの値では、=や;などの特殊記号や日本語文字は %82%A0 のような形式にエンコードして記録しておき、読み出し時にこれをデコードしてやる必要があります。
JavaScriptでエンコードするには次のようにします。
xx = escape(xx);
JavaScriptでデコードするには次のようにします。
xx = unescape(xx);
CGI(Perl)でエンコードするには次のようにします。
$xx =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg;
CGI(Perl)でデコードするには次のようにします。
$xx =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg;
Cookieは便利な機能ですが、以下のことに注意してください。