●Cookieの利用についてこれまではサーバー側に処理された情報を記録する方法を中心に扱ってきました。たいていそのような処理で問題ないのですが、利用者のパソコン(クライアント)側にデータを記録できるといいなぁ、、、と思ったことはないでしょうか?掲示板などで毎回入力する必要のある決まった項目(名前、メールアドレスなど)といったことから、ログインするまでもないけど利用者が設定した画面構成を再度表示したい場合まで、、、 このような場合にCookieという技術を利用することができます。このCookieの歴史について深くはここでは触れませんが、もともとNetscape社がブラウザにデータを記録するために開発した技術で、それが他のブラウザにも採用され、現在では標準的となっている技術の一つです。 下の図でもわかるように、1)最初にページを見に行くと(リクエスト)、2)Webサーバーからページがダウンロードされて各個人のパソコンにホームページが表示されると同時に、3)Cookieも送信されてパソコンに保存されます。4)そのCookieは次回そのページを表示するときに、そのページが置かれたサーバーに戻される仕組みとなります。 (どの範囲でCookieが読み書きされるかはこちらから)
Cookieを利用されるとプライバシーが、、、ということが懸念されていたりしますが、基本的に情報を持っていかれるのではなく、情報を利用者側に埋め込まれるのです。使い方を正しく明示して利用者の不安を取り除いてあげる必要もありますね。(場合によってはプライバシーを侵害するような使い方もできるので注意が必要です。) また、このCookieという技術はPerlやPHPといったサーバー側でのプログラムでないと実現できないかというとそうでもなく、JavaScriptやHTMLの中でも簡単に利用できてしまいます。よく、貴方は○○回目の訪問ですね?とかいうちょっと目障りなメッセージとかに遭遇しませんか?この程度のことならJavaScriptで簡単に可能なのです。 ●Cookieの利用方法について〜書き込み編それでは、実際にPerlでCookieをどのように利用するかを見てみたいと思います。まずCookieの仕様について必要最低限のことを示したいと思います。先ほどの図でもお分かりのとおり、Cookieはサーバー側からデータを送るのが最初です。このデータを、通常はHTTPヘッダーと呼ばれるHTMLのソースなどでは見えない場所に書き込みます。
実際にPerlなどのサーバーサイドプログラムでは下のように書くことになります。
では、この中身をいっしょに考えていきたいと思います。 NAME=VALUE
ここに、Cookieの名前と内容を書き込みます。たとえば、このCookieの名前を「IMY」、書き込みたい内容を「ABCDEFG」だとすると、 expires=DATE
Cookieのデータをサーバーからパソコンに記憶させた場合に、いつまでそのデータが有効か、いつまで保存されるべきかを指定します。このexpires=「〜」で有効期限を書き込むと、その日付まで保存されるようになります。
(Wdy:曜日 / DD: 日 / Mon: 月 / YYYY: 年 / HH: 時 / MM: 分 / SS: 秒)
domain=DOMAIN_NAME
ここには、Cookieが書き出されたドメイン名が入ります。通常、Cookieは書き込まれたサイトにしかその情報を返しません。AAAというホームページで書き込まれたCookieをBBBというホームページに返したりはしません。(こんなことがおきると、セキュリティー上も問題ですが、、、) path=PATH
先ほどはドメインでしたが、ここでは更にドメインの中のPath、わかりやすく言うなら、どのディレクトリから受けとったCookieかという情報を書き込みます。逆にここを違うPathに書き換えることで、別のPathにあるCGI用プログラムとかにCookieを渡したりできるようになります。
secure
この「secure」というオプションを書き加えると、HTTPS(SSL)といった安全な環境での通信時にしかCookieをやり取りできないようにできます。
●Cookieの利用方法について〜読み込み編Cookieの仕様および書き込む方法について見てきましたが、次は書き込まれたCookieを読み出す方法です。これは意外にも簡単で、Cookieを呼び出す専用の環境変数を利用します。
ブラウザは先ほどの「Domain」と「Path」が一致すれば、そのサーバーに対してCookieを送り返します。それがサーバーの環境変数である「 $ENV{'HTTP_COOKIE'} 」に格納されるのです。 これを上の例のようにプログラム中で変数に格納して利用します。 では、Cookieがどのようにデータをやり取りしているのかを見るために、下のようなプログラムを作成してみました。 >>サンプルプログラムはこちらから(別窓) このプログラムは適当な内容をCookieとして有効期限を指定して書き込むものです。有効期限内であればブラウザを落としても情報を保持しています。また、削除したい場合には過去の有効期限を指定するとCookieは消えます。 実際にプログラムの中では下記のようにヘッダーとしてCookieを書き込み、環境変数の$ENV{'HTTP_COOKIE'}で読み込むという形をとります。
Perlをメインに紹介してきましたが、JavaScriptやHTMLでもCookieを書き出すことは可能です。 JavaScriptの場合
「document.cookie="cookieの値";」で書き込み、「変数=document.cookie;」で読み込みます。このCookieの値のフォーマットは先ほどのPerlと同様です。
HTMLの場合「<meta http-equiv="Set-Cookie" content="〜">」というメタタグで書き込みは出来ます。この「http-equiv」というのはヘッダーに書き込むのと同等な働きをHTMLファイルレベルで実現するためのもので、Perlの時にヘッダーに書き込んだのと同等ですが、残念ながらHTMLレベルでは読み込む方法がありません。(私が知らないだけかも、、、) ●Cookieの有効?な利用方法技術的にはCookieをどのように扱うかを知ることができましたが、実際のプログラムの中でどのように使っていくかということが重要です。上手に使えば、かなり効果的なページを作ることもできます。掲示板等フォーム入力時の前回の書き込みの内容の記録
普段のインターネットで一番目にするのがこれかもしれません。掲示板などの書き込みを行った場合に、次回その掲示板を訪問したとき自分の名前やメールアドレスが既に記録されていて便利・・・(こわい?)と思ったことはないでしょうか。これもCookieを利用しています。
パスワード認証におけるセッションの保持として利用
おそらく、最近のウェブアプリケーションで一番よく使われているのがパスワード認証を行った場合のセッション保持としての利用だと思います。セッションの保持でも書きましたが、HTTPというのはステートレスな通信ですので、リクエストをするたびに誰が通信するということを気にしません。よって、それ以外の方法、以前はHIDDEN属性などで先ほどの通信と今の通信が連続しているという状態を教える必要があります。
どのようにCookieを利用するべきかはアイディア次第という部分も多数あるので、今後気がついた時点でいろいろと実験していきたいと思います。 ●Cookieを利用する場合の注意点これまでいろいろ便利な面を見てきましたが、注意点もいくつかあります。まずCookieは利用者側で受け取りを拒否することが可能であるということです。よって、受け取りを拒否されてしまうと、Cookieを使った仕組みだけに依存している場合、プログラムがうまく動かないということが想定されます。先ほどの例でいうなら、パスワード認証におけるセッション保持の場合がそうですね。 このような場合には、最初にCookieを利用しないとその機能も利用できないこと、また、受け入れるような設定になっていない場合にはエラーメッセージでCookieを受け入れるように促すことも必要になってきます。 プライバシー云々として誤解を受けることが多いCookieですので、あくまでも利用者の利益のために利用しているということを説明しておくといいのかもしれません。 あと、追記ですが、Cookieが書き込める範囲、読み込める範囲についての実験も公開していますので、 参考までにどうぞ。
(2004/7/16 by あいまい)
(2005/2/12 更新) |
| copyright(C) 2001-2004 all rights reserved |
|
『ウェブ・プログラムの実験場!』 by あいまいモード・コム(www.iMYmode.com) |