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 過去の値を指定すると |
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の数やサイズの上限を設定する事ができます。
インターネット・エクスプローラでの手順
- ツールバーから [ツール(T)] メニューの [インターネット オプション(O)]をクリックします。
-「インターネットオプション」ダイアログボックスが表示されます。 - [セキュリティ] タブをクリックします。
- セキュリティ レベルを設定するゾーンで [インターネット] をクリックします。
- [レベルのカスタマイズ(C)] をクリックします。
-「セキュリティの設定」ダイアログボックスが表示されます。 - 「Cookie」項目のラジオボックスで設定します。
ネットスケープ・ナビゲータでの手順
- ツールバーから [編集(E)] メニューの [設定(E)] をクリックします。
-「設定」ダイアログボックスが表示されます。 - 「カテゴリ」から [詳細] を選択肢、「 Cookie 」項目をクリックします。
- 「Cookie受け入れ証書」で設定します。
Cookieを手動で削除
ネットスケープとインターネット・エクスプローラの両方とも、クッキーのデータをテキストファイルとして保存します。ブラウザが起動している状態のときはクッキーがメモリに保存されていて、閉じるときにメモリにあるクッキーが新しく書き出されます。このような理由から、クッキーファイルを削除する際は、ブラウザを閉じておく必要があります。
クッキーファイルを削除すると、すべてのウェブサイトの記録がなくなりますので、できればファイルの編集で不必要な項目だけを削除したほうが安全です。
インターネット・エクスプローラでのCookie 削除の手順
- デスクトップのマイコンピュータをクリックし、「C:\Windows\Cookies」フォルダを開きます。
- 「index.dat」ファイル以外のファイルが各ウェブサイトの Cookie ファイルです。ここで不要なファイルを削除することができます。
ネットスケープ・ナビゲータでのCookie削除の手順
- ツールバーから [タスク(T)] メニューの[プライバシーとセキュリティ(P)]を選択し、[Cookie マネージャ]を選択します。
- [保存した Cookie を表示(V)]をクリックします。
-「Cookie マネージャ」ダイアログボックスが表示されます。 - 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からはブラウザのメニューから簡単に削除できるようになっています。上記ファイルを直接編集しないでください。
- ネットスケープによるCookie仕様書【英】
- ネットスケープによるCookie概要
rfc2109【英】