とほほのCookie入門

とほほのWWW入門 > とほほのCookie入門
2000年8月24日

目次

Cookieの概要

Cookieとは、以下のようなことを実現するための機構です。 通常、上記のようなデータはCGIなどを用いてサーバー側に記録するのですが、Cookieを用いることにより、クライアント側(ブラウザを起動する側)のハードディスク内に記録することができるようになります。

セキュリティを考慮して、Cookieで蓄積できる情報は簡単な文字列のみで、保存場所もブラウザにより固定されています。例えば、次のようなファイルです。

C:\Program Files\Netscape\Navigator\cookies.txt
C:\Program Files\Netscape\Users\UserName\cookies.txt
C:\Windows\Cookies\〜.txt

http://home.netscape.com/newsref/std/cookie_spec.html からCookieの仕様書を得る事ができます。「Cookie」という妙に美味しそうな名前の由来を調べてみたら、「Cookieの名前には特に理由は無い」と説明されていました。

Cookieの実行例

CookieはJavaScriptや、CGIを用いて実現されます。実行例を次に示します。「Cookieを保存するか?」のダイアログが表示される場合は[OK]としてください。「再表示」を行うと、これまでの訪問回数と、前回の訪問日が表示されます。オフラインでは動作しません。オンラインで実行してください。

うまくいかない場合は、ブラウザのCookieの設定がオフになっていないか確認してください。Internet Explorer 5.0の場合は[ツール]-[インターネットオプション]-[セキュリティ]-[レベルのカスタマイズ]-[Cookie]で、Netscape Navigator 4.*の場合は[編集]-[設定]-[詳細]-[Cookie]でCookieのオン・オフを制御できます。

Cookieの書き込み

Cookieの値を記録させるには次のようにします。
1. HTMLの場合
<META>タグによって Set-Cookie ヘッダを生成します。
    <META HTTP-EQUIV="Set-Cookie" CONTENT="〜">
2. JavaScriptの場合
document.cookieに値を書き込みます。
    document.cookie = "〜";

3. CGI(perl)の場合
Set-Cookieヘッダを直接書き込みます。
    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の指定を省略すると、NN4.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 と指定すればよいのですが、この方法はNNやIE2.0ではうまくいくのに、IE4.0では正常に動作しなくなります。

secure これを記述しておくと、Cookie情報が暗号化されて送信されるようになります。サーバーとの接続がセキュアである時のみ、Cookie情報が送信されるようになります。(1999.6.27訂正)

具体的な書き込みの例は、上記の「Cookieの実行例」のソースコードを参照してください。

Cookieの読み込み

Cookieの値を読み込むにはJavaScriptかCGIを用います。
JavaScriptの場合
document.cookieを参照します。
    document.write(document.cookie + "<BR>");

CGI(perl)の場合
環境変数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は便利な機能ですが、以下のことに注意してください。
鬱陶しいと思う人も多い
多くの人の環境では、Cookieの値を書き込む度に確認ダイアログが表示されます。 便利なはずのCookieが、反って鬱陶しく感じられるとマイナスですので注意しましょう。

セキュリティを考慮する
セキュリティに対して十分に考慮してください。 例えば、パスワードの再入力を省略するためにパスワードを Set-Cookie: PASSWD=xxx; path=/; なんて具合に設定してしまうと、同じサーバーを利用しているすべての人に、その人のパスワードが盗まれてしまうことになります。 また、自分のハードディスクの中に、自分のパスワードが保存されていることを知らないまま、パソコンを中古屋に売ってしまう人もいます。

あまり凝ったことをしない
個人の好みに合わせて画面をカスタマイズするのも結構ですが・・・・ AさんとBさんはブラウザを開いて電話で話していました。 「http://...を開いて」「OK」「右上の○○のボタンを押して」「ないよ」「右上の○○のボタンだよ」「ないよ」「あるってば」・・・・この後、OSのバージョンだの、ブラウザのバージョンだのを調べましたがすべて同じ。 あれやこれやの問答の末ようやく、AさんのハードディスクのCookieの値が見栄えを変えていたことがわかる・・・なんてこともあります。

Copyright (C) 1996-1999 とほほ
http://wakusei.cplaza.ne.jp/twn/wwwcook.htm