トップへ > Web Program Lab.> No.8 Cookieの利用
ウェブ・プログラムの研究所 Web Application Programming Lab.
一つ前にもどる 目次にもどる 次のページへ

●Cookieの利用について

これまではサーバー側に処理された情報を記録する方法を中心に扱ってきました。たいていそのような処理で問題ないのですが、利用者のパソコン(クライアント)側にデータを記録できるといいなぁ、、、と思ったことはないでしょうか?

掲示板などで毎回入力する必要のある決まった項目(名前、メールアドレスなど)といったことから、ログインするまでもないけど利用者が設定した画面構成を再度表示したい場合まで、、、

このような場合にCookieという技術を利用することができます。このCookieの歴史について深くはここでは触れませんが、もともとNetscape社がブラウザにデータを記録するために開発した技術で、それが他のブラウザにも採用され、現在では標準的となっている技術の一つです。

下の図でもわかるように、1)最初にページを見に行くと(リクエスト)、2)Webサーバーからページがダウンロードされて各個人のパソコンにホームページが表示されると同時に、3)Cookieも送信されてパソコンに保存されます。4)そのCookieは次回そのページを表示するときに、そのページが置かれたサーバーに戻される仕組みとなります。 (どの範囲でCookieが読み書きされるかはこちらから

Cookieの仕組み

Cookieを利用されるとプライバシーが、、、ということが懸念されていたりしますが、基本的に情報を持っていかれるのではなく、情報を利用者側に埋め込まれるのです。使い方を正しく明示して利用者の不安を取り除いてあげる必要もありますね。(場合によってはプライバシーを侵害するような使い方もできるので注意が必要です。)

また、このCookieという技術はPerlやPHPといったサーバー側でのプログラムでないと実現できないかというとそうでもなく、JavaScriptやHTMLの中でも簡単に利用できてしまいます。よく、貴方は○○回目の訪問ですね?とかいうちょっと目障りなメッセージとかに遭遇しませんか?この程度のことならJavaScriptで簡単に可能なのです。

●Cookieの利用方法について〜書き込み編

それでは、実際にPerlでCookieをどのように利用するかを見てみたいと思います。

まずCookieの仕様について必要最低限のことを示したいと思います。先ほどの図でもお分かりのとおり、Cookieはサーバー側からデータを送るのが最初です。このデータを、通常はHTTPヘッダーと呼ばれるHTMLのソースなどでは見えない場所に書き込みます。

Set-Cookie: NAME=VALUE; expires=DATE; path=PATH; domain=DOMAIN_NAME; secure



実際にPerlなどのサーバーサイドプログラムでは下のように書くことになります。

 Perlでの実装方法

 print "Set-Cookie: (〜クッキーの中身 )\n";



では、この中身をいっしょに考えていきたいと思います。

NAME=VALUE

ここに、Cookieの名前と内容を書き込みます。たとえば、このCookieの名前を「IMY」、書き込みたい内容を「ABCDEFG」だとすると、

Set-Cookie:IMY=ABCDEFG;

というようになります。
ネットスケープのページにはこの内容の部分は「%XX%XX%XX」というように、URLエンコードされた文字がお勧め、、、とかかれてますが、実際違う方法で書き込むとどうなるのでしょうか。機会があれば実験結果を公開します。上の引用部分でCookieの仕様を書きましたが、全て書き込まれなくても、最低この部分のデータさえあればCookieとして動きます。

expires=DATE

Cookieのデータをサーバーからパソコンに記憶させた場合に、いつまでそのデータが有効か、いつまで保存されるべきかを指定します。このexpires=「〜」で有効期限を書き込むと、その日付まで保存されるようになります。

このDATEの部分の書式は下のようになります。

Wdy, DD-Mon-YYYY HH:MM:SS GMT

(Wdy:曜日 / DD: 日 / Mon: 月 / YYYY: 年 / HH: 時 / MM: 分 / SS: 秒)

日本時間の場合に「JST」とか指定ますが、Cookieの場合には「GMT」しか指定できないそうです。 ですが、この「expires」というのは先ほどの「NAME=VALUE」と違い必須ではありません。ですから、ここを省略すると、セッションが終了と同時にCookieは消去されます。

domain=DOMAIN_NAME

ここには、Cookieが書き出されたドメイン名が入ります。通常、Cookieは書き込まれたサイトにしかその情報を返しません。AAAというホームページで書き込まれたCookieをBBBというホームページに返したりはしません。(こんなことがおきると、セキュリティー上も問題ですが、、、)

何も指定しなければ、サーバーのホスト名が入ります。

path=PATH

先ほどはドメインでしたが、ここでは更にドメインの中のPath、わかりやすく言うなら、どのディレクトリから受けとったCookieかという情報を書き込みます。逆にここを違うPathに書き換えることで、別のPathにあるCGI用プログラムとかにCookieを渡したりできるようになります。

何も指定しなければ、書き出されたプログラムがあるPathが入ります。

secure

この「secure」というオプションを書き加えると、HTTPS(SSL)といった安全な環境での通信時にしかCookieをやり取りできないようにできます。



●Cookieの利用方法について〜読み込み編

Cookieの仕様および書き込む方法について見てきましたが、次は書き込まれたCookieを読み出す方法です。

これは意外にも簡単で、Cookieを呼び出す専用の環境変数を利用します。


 Perlでの呼び出し方法(環境変数を利用)

 $cook = $ENV{'HTTP_COOKIE'};


ブラウザは先ほどの「Domain」と「Path」が一致すれば、そのサーバーに対してCookieを送り返します。それがサーバーの環境変数である「 $ENV{'HTTP_COOKIE'} 」に格納されるのです。

これを上の例のようにプログラム中で変数に格納して利用します。 では、Cookieがどのようにデータをやり取りしているのかを見るために、下のようなプログラムを作成してみました。

>>サンプルプログラムはこちらから(別窓)

このプログラムは適当な内容をCookieとして有効期限を指定して書き込むものです。有効期限内であればブラウザを落としても情報を保持しています。また、削除したい場合には過去の有効期限を指定するとCookieは消えます。

実際にプログラムの中では下記のようにヘッダーとしてCookieを書き込み、環境変数の$ENV{'HTTP_COOKIE'}で読み込むという形をとります。


■書き込み(ヒアドキュメントとして書く場合)

01: print <<HTML;
02: Content-Type: text/html
03: Set-Cookie: IMYLAB=Cookieの内容; expires=有効期限
04:
05: <html>
06: <head>...
07: ・・・

*行番号は便宜的につけたものです。

Perlをメインに紹介してきましたが、JavaScriptやHTMLでもCookieを書き出すことは可能です。

JavaScriptの場合

「document.cookie="cookieの値";」で書き込み、「変数=document.cookie;」で読み込みます。このCookieの値のフォーマットは先ほどのPerlと同様です。

ちなみに、現在参照しているページでどんなCookieが書き込まれているか見てみたい場合に、アドレス欄に「JavaScript:document.cookie;」と入力してEnterを押すと、そのページで書き込まれたCookieをブラウザで表示できます。

HTMLの場合

「<meta http-equiv="Set-Cookie" content="〜">」というメタタグで書き込みは出来ます。この「http-equiv」というのはヘッダーに書き込むのと同等な働きをHTMLファイルレベルで実現するためのもので、Perlの時にヘッダーに書き込んだのと同等ですが、残念ながらHTMLレベルでは読み込む方法がありません。(私が知らないだけかも、、、)



●Cookieの有効?な利用方法

技術的にはCookieをどのように扱うかを知ることができましたが、実際のプログラムの中でどのように使っていくかということが重要です。上手に使えば、かなり効果的なページを作ることもできます。

掲示板等フォーム入力時の前回の書き込みの内容の記録

普段のインターネットで一番目にするのがこれかもしれません。掲示板などの書き込みを行った場合に、次回その掲示板を訪問したとき自分の名前やメールアドレスが既に記録されていて便利・・・(こわい?)と思ったことはないでしょうか。これもCookieを利用しています。

最初の書き込みで再度入力する可能性のある情報をCookieとして保存して、2回目以降に表示します。ぱっと見たときには自分の情報がそのホームページで管理されているような錯覚を覚えますが、実際には自分のブラウザから読み出されているだけなのです。



パスワード認証におけるセッションの保持として利用

おそらく、最近のウェブアプリケーションで一番よく使われているのがパスワード認証を行った場合のセッション保持としての利用だと思います。セッションの保持でも書きましたが、HTTPというのはステートレスな通信ですので、リクエストをするたびに誰が通信するということを気にしません。よって、それ以外の方法、以前はHIDDEN属性などで先ほどの通信と今の通信が連続しているという状態を教える必要があります。

HIDDEN属性なら、画面が変わるたびにHTMLとしてHIDDEN属性に対してパスワードまたはセッションIDのようなものを書き出す必要がありますが、Cookieに埋め込めば利用者が意識することなく、セッションのチェックを行うことが可能になります。



どのようにCookieを利用するべきかはアイディア次第という部分も多数あるので、今後気がついた時点でいろいろと実験していきたいと思います。

●Cookieを利用する場合の注意点

これまでいろいろ便利な面を見てきましたが、注意点もいくつかあります。

まずCookieは利用者側で受け取りを拒否することが可能であるということです。よって、受け取りを拒否されてしまうと、Cookieを使った仕組みだけに依存している場合、プログラムがうまく動かないということが想定されます。先ほどの例でいうなら、パスワード認証におけるセッション保持の場合がそうですね。

このような場合には、最初にCookieを利用しないとその機能も利用できないこと、また、受け入れるような設定になっていない場合にはエラーメッセージでCookieを受け入れるように促すことも必要になってきます。

プライバシー云々として誤解を受けることが多いCookieですので、あくまでも利用者の利益のために利用しているということを説明しておくといいのかもしれません。

あと、追記ですが、Cookieが書き込める範囲、読み込める範囲についての実験も公開していますので、 参考までにどうぞ。

(2004/7/16 by あいまい)
(2005/2/12 更新)
一つ前にもどる 目次にもどる 次のページへ

トップへ > Web Program Lab.> No.8 Cookieの利用

copyright(C) 2001-2004 all rights reserved
『ウェブ・プログラムの実験場!』

by あいまいモード・コム(www.iMYmode.com)