美味しいクッキーの食べ方・作り方


クッキー:cookie
 イギリスではbiscuit(ビスケット)と言う。オランダ語で「菓子」の意味。

と、冗談はここらへんにしておいて

最初に……

 この文書はThinkが本やウェブページなどを見てえた知識を基に独断と偏見で書いたものです。間違いがあっても責任は取りませんが、間違いを見つけた場合は知らせていただければ嬉しいです。

クッキーとは?
 クッキーというのはウェブブラウザとウェブサーバーの間でやり取りされるテキストデータのことです。それ自身は実行することもできませんし、ウイルスなどが感染する余地もありません。ではクッキーは何のために使われるのでしょうか?
 ウェブブラウザはHTTP(HyperText Transfer Protocol)と呼ばれるプロトコル(規約、決まりごと)にそってウェブサーバーとデータのやり取りをします。現在規定されているHTTPはHTTP1.0(RFC1945)とHTTP1.1(RFC2068)があります。

HTTPによるウェブブラウザとウェブサーバーのやり取りの例(便宜上、行番号を付けています)

リクエストメッセージ(ウェブブラウザからウェブサーバーに送られる要求)
 1:  GET / HTTP/1.0
 2:  Connection: Keep-Alive
 3:  User-Agent: (ここにはブラウザのコードネームやバージョン、使用している環境などが入る)
 4:  Host: (ウェブサーバーのドメインネーム)
 5:  Accept: (要求するファイルのパス、","で区切ることで複数要求できる)
 6:  Accept-Language: (言語)
 7:  Accept-Charset: (受け取れる文字コード)
 8:  (空行、終了を示す)

レスポンスメッセージ(ウェブサーバーからウェブブラウザに送り返される応答)
 1:  HTTP/1.1 200 OK
 2:  Date: (アクセスした月日、時刻)
 3:  Server: (ウェブサーバーの種類・バージョン、環境など)
 4:  Last-Modified: (データの最終更新日、一部の環境では不正確らしい)
 5:  ETag: (私には判りません)
 6:  Accept-Ranges: (データの単位)
 7:  Content-Length: (データのサイズ、単位はAccept-Rangesだと思う)
 8:  Connection: (私には判りません)
 9:  Content-Type: text/html(データのフォーマットと種類、MIMEコードだと思う)
10:  (空行、ヘッダの終了を示す)
11:  (データ本体)

 単純なやり取りで様々なデータをやり取りできるHTTPですが、要求を出したクライアントが誰であるかは判りません。ページにフォームがあってもそれを記録しておく手段もありません。
 それらを解決する手段の一つとしてcookieがあります。cookieはサーバー側から送られてくるレスポンスメッセージの中にset-cookieという形で入っています。

set-cookie: NAME=VALUE; expire=DATE; path=PATH; domain=DOMAIN_NAME; secure

NAME:クッキーに納められる情報の名前です。プログラムをする方は変数だと思って下さい。
VALUE:情報そのものです。アスキーコードしか格納できません
expire=DATE:cookieの寿命を設定します。指定された期日を過ぎるとcookieは自動的に削除されます。省略された場合はサーバーとの接続が切れ次第消滅します。
path=PATH:ここで指定されたパスのデータを要求する時にcookieを送り返します。複数指定することも可能、省略時は送ってきたデータと同じパスを設定するようです。
domain=DOMAIN_NAME:クッキーを受け取れるサーバーを指定します。これを使えば複数のサーバーで同じクッキーを受け取ることができるみたいです。省略時は送ってきたサーバーが設定されるみたいです。
secure:これが指定された場合は暗号などで保護された接続の時のみ送り返します。

 送られてきたcookieはテキストの形で所定のところに保存されます(設定によっては保存されませんが……)アスキーコードの文字列として保存されるので日本語や数値を扱う場合には適切な処理をする必要があります。
 cookieは全体で300個まで、1つのサイズは4KB(NAMEも含む)まで、1つのサーバーにつき20個(set-cookieの数、1つのcookieに複数のNAMEがあるのはOK)までといった制限があり、制限を超える場合は最後に使用したものから消されていきます。

 このようにしてウェブブラウザに送られてきたcookieは次にウェブブラウザがリクエストメッセージを送る時にリクエストメッセージの中に入れられます。
Cookie: NAME=VALUE;
 この際、条件に当てはまるcookieはすべて送られます。
Cookie: NAME1=VALUE; NAME2=VALUE; NAME3=VALUE;
 なお、cookieはネットスケープ社が作成したものであり、HTTP1.0やHTTP1.1では定義されていません。本来はNetscapeNaigatorの独自機能ということになります。

http://www.netscape.com/newsref/std/cookie_spec.html

クッキーの美味しい食べ方

 cookieはプライバシーの問題から嫌いだという人も多く(私もその1人です)オフにしている人も多いようですがJavaAppletやJavaScript、ActiveXのように実行されるもの(そう考えると一番危険なのはActiveXですよね……)ではなく、実体も単なるテキストファイルですからそれほど恐れる必要はないと思います。
 掲示板などでは名前の入力を省いてくれますし、「MyYahoo」などはcookieを本人確認の手段に使っています。
 一方で訪問者の追跡にも使うことができ(同じサーバー内か複数のサーバーで協力する必要があるけど……)プライバシー問題がないとは言えません。ウェブブラウザのバグによって漏洩する可能性もないとは言えません。

 結局のところ個人情報と同じ、自分が信頼できると思ったサイト、あるいは必要なサイトに求められた時のみ応じるしかないのではないでしょうか?

 なお、一度受け入れたcookieは保存され、同じ所にリクエストメッセージを送信する時はウェブサーバーに送り返されます。これはcookieをオフにしておいてもcookieを削除しない限りは同じみたいです。

美味しいクッキーの作り方

 あなたが自分でサーバーをたてているとか、CGIが使えるのなら色々なことができると思います。でも私はそのような環境を持っていません。無料ホームページサービスを使用していてCGIも使えない人はJavaScriptを使うという手があります。
 JavaScriptはセキュリティを理由に嫌う人が多く、実際セキュリティ上の問題が多い機能ですが、結構便利なものです。
 JavaScriptではセキュリティの問題からファイルシステムへのアクセスとネットワークへのアクセスは原則的に禁じられています。一部のブラウザではファイルオープンダイアログを開くことができますが、実際にファイルにアクセスすることはできません。
 JavaScriptが利用することができる唯一の記憶可能な領域がcookieです。cookieはdocumentオブジェクトのメンバーで
document.cookie = "NAME1=VALUE1; NAME2=VALUE;" ;
 で書き込むことができます。
 また、cookieはテキストデータなのでStringオブジェクトに対する操作と同じことができます。

クッキーを使用するためのJavaScriptの例(試してません)
<script language="JavaScript">
<!---

function GetCookie(name)
{
	var	find	= name + "=";
	var	result	= "";
	var	head	= 0;
	var	tail	= 0;

	while(head <document.cookie.length)
	{
		if(document.cookie.substring(head,head + find.length) == find)
		{
			tail = document.cookie.indexOf(";",head)
			if(tail == -1)
				tail = document.cookie.length;
			return unescape(document.cookie.substring(head,tail));
		}
		head = document.cookie.indexOf(" ",head) + 1;
		if(head == 0)
			break;
	}
}

function SetCookie(name,value,date)
{
	document.cookie = name + "=" + escape(value) + "; " + ((date) ? "expires=" + date.toGMTString() + ";" : "");
}

function DelCookie(name)
{
	if(GetCookie(name))
		document.cookie = name + "=; expires=Thu, 01-Jan-70 00:00:01 GMT";
}

//--->
</script>
 このサンプルではcookieを使用したページでしかcookieを利用できません。もし複数のページに渡って使用したい場合はSetCookie()の書き込み部分にpath=(他のページのパス)を加えて下さい。

最後に……

 「クッキーの美味しい食べ方」や「美味しいクッキーの作り方」より「クッキーとは?」の方が長くなってしまいましたが気にしないで下さい。
 個人的にはcookieもJavaScriptもあまり好きではないのですが便利なので利用しています。私のページでは(2000.5.14現在)cookieは使用していませんし、JavaScriptがなくても見れるようなページ(例外あり)を心掛けています。
 私はMacintoshというパソコンの中では少数派の、さらに古い機種(5年前)をメインにしているので誰でも使えるような技術を使ったページが増えればいいなと思っています。


Copyright(C) 2000 Think