3部 CGI リファレンス

Cookieでセッション管理機能を実現

Cookieは、ユーザに関する情報などを長期にわたり記録しておくために用意されている機能です。たとえば、ユーザごとにパーソナライズして提供するようなサービスや、安全なデータベース接続を保障したりする場合などによく使われています。


1.Cookieの概要

一昔前のCGIは、サーバ上に情報を記録したり読み取ることはできましたが、ユーザのコンピュータに情報を記録したり読み取ることはできませんでした。セキュリティを考えるともっともな仕様ではありますが、この仕様だとユーザを特定するに毎回ユーザ側から本人を特定するための情報を得る必要があります。毎日アクセスするユーザにとっては面倒な手続きですね。
そこで、Cookieという機構がブラウザに組み込まれました。Cookieはブラウザを通じてユーザのコンピュータに一時的にデータを保存し、必要なときにそのデータを呼び出すことができます。これにより。サーバ側は相手が誰かをあらかじめ知っておく必要がなくなり、必要なときにCookie情報を利用してユーザ認証を行えます。

Set-Cookie構文

CGIプログラムからCookieを送信する場合は、HTTPレスポンスヘッダとして送ることになります。実際的な作業としては、HTTPレスポンスヘッダを出力する際に、Set-Cookieヘッダを含めてCookie情報をクライアントに送信します。Set-Cookieヘッダは1回のレスポンスヘッダに複数使うことができます。

Set-Cookieレスポンスヘッダの構文

Set-Cookie
: 名前=値; expires=日付;
path=パス; domain=ドメイン名; secure

Set-Cookieヘッダはコンマで区切られ、一つ以上のCookie属性を含みます。それぞれのCookie属性はセミコロン( ; )で区切られます。「名前」属性はCookie属性の先頭に配置する必要がありますが、その他の属性は順番は関係ありません。

Cookie属性の詳細

書式 設定
名前=値 Cookie名を指定必須属性。セミコロン( ; )、カンマ( , )、スペース(
)や日本語を使用する際には、それぞれをエンコードする必要があります。URLエンコードが一般的です。
domain=ドメイン名 ドメインを指定domain属性にはCookieを発行するドメイン名の全体、もしくは一部を指定します。ただし、ドメイン名は少なくとも2つのピリオドが入っていなければなりません
(.comであれば最低2つ、.co.jpであれば3つ)。省略した場合はウェブサーバの「ホスト名.ドメイン名」になります。

[例1] domain=www.domain.com
ブラウザはドメイン名の一部がマッチする、すべてのホストにクッキーを返します。

path=パス パス情報を指定path属性
には、このCookie情報の取得を許可するURLパス情報を指定します。ブラウザは、Cookie情報を返す前にスクリプトのURLパスをチェックし
path属性にマッチする場合のみ値を返します。
たとえば、パスを/cgi-binと指定すれば、/cgi-bin/**.cgi/cgi-bin/sub/**.cgiなど、/cgi-binにマッチするスクリプトがCookie
情報にアクセス可能になります。デフォルトではルートを示す/です。
expires=GMT値 有効期限を指定クライアント側のディスクに記録されるCookieの有効期限を指定します。
有効期限内は、Cookie情報が保存されます。
値は以下のようなフォーマットで指定します。

[書式] Wdy, DD-Mon-YYYY HH:MM:SS GMT

[例] Fri, 31-Dec-1999 23:59:59 GMT

過去の値を指定するとCookie情報が削除されます。この項目を省略した場合、クライアント側のキャッシュに限定して記録され、セッション終了時に削除されます。
つまり、expires属性を設定しない場合、ブラウザが閉じられるまでが有効期限となります。

secure セキュア接続フラグを設定secure属性を記述しておくと、
サーバーとの接続がセキュアである時のみ、Cookie情報が有効になります。

Cookieの制限・注意事項

Cookieがデータを記録できるのは4096バイトまでで、最大で300まで保存することが可能です。1台のサーバが同じコンピュータに対して発行できるCookieの数は、20個に制限されています。

Set-Cookieヘッダは1回で複数の出力が可能ですが、出力する順番に気をつける必要があります。たとえば、下記のような2つのSet-Cookieヘッダがあるとします。

print "Set-Cookie:V=1; domain=domain.com; path=/cgi-bin;\n";
print "Set-Cookie:V=1; domain=domain.com; path=/;\n";

ここで注目するのはpath情報です。/cgi-binのように下層まで指定したCookieと、その上層を指定しているCookieがある場合は、下層を指定したCookieのほうを先に出力する必要があります。

2.Cookieの利用方法

Cookieの書き込み

Cookieを発行させるには次のように出力します。

Cookieの値を書き込む
print "Set-Cookie: ", "NAME=PERRY; "
print "expires=", "San, 01-Dec-2002 21:50:54 GMT; ";
print "domain=", "domain.com; ";
print "path=", "/cgi-bin; ";
print "secure", "\n";
print "Content-type: text/html", "\n\n";

上記では、NAMEというラベルに"PERRY"という値を記録しています。「domain.com/cgi-bin」以下にあるファイルであれば、この記録を呼び出すことができます。この記録は、ユーザが削除しない限り2002年12月1日まで記録されています。

Cookieの削除

Cookieの削除用のフォーマットというのはありません。Cookieを削除する場合は、有効期限の項目(expires)を過去の時間にします。

Cookieの値を削除
print "Set-Cookie: ", "NAME=PERRY; "
print "expires=", "Thu, 01-Jan-1970 00:00:00 GMT;";
print "domain=", "domain.com; ";
print "path=", "/cgi-bin; ";
print "secure", "\n";
print "Content-type: text/html", "\n\n";

Cookieの読み込み

Cookieの値を読み込むには環境変数 HTTP_Cookie を参照します。

Cookieの値を読み込む
print "$ENV{'HTTP_Cookie'}\n";

エンコードとデコード

Cookieの値として日本語を直接使うことはできません。特殊記号や日本語文字を記録する場合は、その値をエンコードし、読み込むときはデコードします。

書き込み時のエンコード
$X =~ s/([^a-zA-Z0-9_.-])/uc sprintf("%%%02x",ord($1))/eg;
読み込み時のデコード
$X =~ tr/+/ /;
$X =~ s/%([\da-fA-F]{2})/chr hex($1)/ge;

3.ブラウザのCookie動作

Cookieを利用可能にしておくと、アクセスしたウェブサイトでの行動が記録されます。一度選択した好みや、入力した情報が次回のアクセスに活かされるのでメリットがありますが、プライバシーの問題があります。
Cookieは悪用されることがあるということをよく理解したうえでご利用ください。

Cookieを拒否するためのブラウザ設定

ウェブサーバは Set-CookieヘッダによりCookieを利用できますが、ユーザはブラウザの設定で Cookie
 機能を無効にすることができます。エクスプローラ、ネットスケープの両ブラウザはドメイン名で識別し保存可能なCookieの数やサイズの上限を設定する事ができます。

インターネット・エクスプローラでの手順
  1. ツールバーから [ツール(T)] メニューの [インターネット オプション(O)]をクリックします。
    -「インターネットオプション」ダイアログボックスが表示されます。
  2. [セキュリティ] タブをクリックします。
  3. セキュリティ レベルを設定するゾーンで [インターネット] をクリックします。
  4. [レベルのカスタマイズ(C)] をクリックします。
    -「セキュリティの設定」ダイアログボックスが表示されます。
  5. 「Cookie」項目のラジオボックスで設定します。
ネットスケープ・ナビゲータでの手順
  1. ツールバーから [編集(E)] メニューの [設定(E)] をクリックします。
    -「設定」ダイアログボックスが表示されます。
  2. 「カテゴリ」から [詳細] を選択肢、「 Cookie 」項目をクリックします。
  3. 「Cookie受け入れ証書」で設定します。

Cookieを手動で削除

ネットスケープとインターネット・エクスプローラの両方とも、クッキーのデータをテキストファイルとして保存します。ブラウザが起動している状態のときはクッキーがメモリに保存されていて、閉じるときにメモリにあるクッキーが新しく書き出されます。このような理由から、クッキーファイルを削除する際は、ブラウザを閉じておく必要があります。
クッキーファイルを削除すると、すべてのウェブサイトの記録がなくなりますので、できればファイルの編集で不必要な項目だけを削除したほうが安全です。

インターネット・エクスプローラでのCookie 削除の手順
  1. デスクトップのマイコンピュータをクリックし、「C:\Windows\Cookies」フォルダを開きます。
  2. 「index.dat」ファイル以外のファイルが各ウェブサイトの Cookie ファイルです。ここで不要なファイルを削除することができます。
ネットスケープ・ナビゲータでのCookie削除の手順
  1. ツールバーから [タスク(T)] メニューの[プライバシーとセキュリティ(P)]を選択し、[Cookie マネージャ]を選択します。
  2. [保存した Cookie を表示(V)]をクリックします。
    -「Cookie マネージャ」ダイアログボックスが表示されます。
  3. 1 つまたは複数の Cookie を選択し、[Cookieを削除]をクリックします。すべてのCookieを削除するには[すべてのCookieを削除]をクリックします。

Cookieの保存場所

Cookieの保存場所はブラウザにより固定されています。以下がCookieを保存しているファイルです。

インターネット・エクスプローラのCookieファイルの場所(ユーザ名"***"の場合)

C:\Documents and Settings\***\Cookies

ネットスケープ・ナビゲーターのCookieファイルの場所

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

※ナビゲータ6からはブラウザのメニューから簡単に削除できるようになっています。上記ファイルを直接編集しないでください。

関連記事