個人データの個人管理:Cookie

Cookie(クッキー)はブラウザにデータを保存させるための新しい機構です。 ブラウザ依存性がどの程度あるのかは私は知りません。ご注意ください。

以前では閲覧者に関する個人データはサーバー側のファイルに保存され、 閲覧者は必要に応じてIDやパスワードを打ち込んで自分の個人データを 利用していました。
Cookieは、その個人データをクライアント側に保存させる新しい機構です。 それらのデータは必要に応じて自動的にサーバー側に提出されます。 この機構によってCGIは膨大な個人データの管理作業から解放されます。 このCookieの取り扱いについて解説します。

■ Cookieの発行

Cookieの発行、つまり作成されたデータをブラウザに保存させる方法には 2通りあります。ひとつはCGIのHTTPd headerのひとつとしてCookieを送る方 法。ふたつはJavaScriptを送り、ブラウザ内でCookieを発行させる方法です。 まずHTTPd headerで発行する方法を解説します。

CGIの先頭出力であるHTTPd headerに次のように Set-Cookieフィールド を追加します。

printf(
  "Content-type: text/html\n"
  "Set-Cookie: name1=value1; expires=Man, 1-Jan-2001 00:00:00 GMT; path=/~naoki/cgi-bin/\n"
  "Set-Cookie: name2=value2; expires=Man, 1-Jan-2001 00:00:00 GMT; path=/~naoki/cgi-bin/\n"
  "\n" );
"name=value"がブラウザに保存させたいデータです。FORMの時とは異なり、 複数のデータの組をまとめることはできません。同様のSet-Cookieフィールド を複数行並べます。"expires="以降の日付は、ブラウザにこのデータを 保存してもらう期限を指定します。現在から1ヵ月後くらいが適当でしょう。 この項目を省略すると、データはブラウザの終了と共に消えます。 "path="以降のpathはこのデータを将来享受するCGI、ホームページファイル、 ディレクトリを指定します。この項目を省略するとCGIの所有者のディレクトリ 以下すべてが対象となります。
Set-Cookieフィールドを追加する際に気をつけるべきことは複数のHTTP-Header 行の間に空行を入れてしまわないことです。空行を入れるのは 最後の行のみです。

JavaScriptでcookieを発行するにはページの中で次のような JavaScriptのコマンドを実行します。

<SCRIPT LANGUAGE="JavaScript">
  document.cookie = "name1=value1";
  document.cookie = "name2=value2";
</SCRIPT>
ページのどこで実行しても構いません。CGIでこのJavaScriptを出力しても 構いません。なので、CGIで headerを出力する段階で cookie用の データが完成できない場合には、後から JavaScript で cookieを発行することに なります。

こうしてCookieが発行されると、ブラウザはそのメモリまたはcookies ファイルにデータを記録します。そして、そのCookieが発行されたdomain とpathが一致するページへアクセスする際に自動的にそのCookieが提出 されます。

■ Cookieの受信

ブラウザから送信されるCookieデータは、複数のデータがある場合でも ひとつにまとめられて、ひとつの環境変数 HTTP_COOKIE に格納されます。 CGIからはこの環境変数を通じてCookieを受信することができます。

char* cookies = getenv("HTTP_COOKIE");
この時、ポインタ cookiesが指す領域には例えば次のようにデータが 格納されています。
name1=value1; name2=value2; s=localhost1234567890
この例では最初から2つの項がこのCGIが受信すべく設定されたCookieデータ です。続く項は利用しません。また、他人が設定したCookieがさらに後ろに 紛れ込むことがあります。

このデータを容易に利用できるように処理するのですが、FORMの時のように 大がかりなことをする必要はないでしょう。一般にCookieは決まった形式で やりとりされるからです。なので、ここは単純にsscanf関数で間に合います。

  sscanf( cookies, "name1=%[^;]; name2=%[^;];", value1, value2 );
これでCookieデータを利用できます。

■ Cookieの利点

最後にCookieの利点について少し紹介します。
個人データファイルをサーバーからクライアントに移すことによって サーバー側のデータ管理を大幅に削減することができ、 CGIの負担が劇的に軽くなります。 また、どの個人かを調べる必要がまったく無いので、IDやPasswordによる 認証が必要無くなります。そのためシステムを単純化できまし、閲覧者 にとっても便利です。


目次

Copyright(C) by Naoki Watanabe. Oct 21st, 1995.
渡辺尚貴 naoki@cms.phys.s.u-tokyo.ac.jp