Cookieとは
[HOME] [BACK]ここでは、Cookie(クッキー)について説明します。CGIとASPによる利用方法についても解説します。
Cookieというと「個人情報が知らないうちに知られてしまうからブラウザ設定はずしてる」という人もいる様です。
確かに間違った使い方をするとそれを悪用する事も可能です。しかし正しく利用すればWebサイト管理者とそのサイトの利用者にとって大変便利なものです。ここでぜひ正しい知識を身に付けてください。
- 概要
Cookieとはブラウザに保存しておくデータの事です。このデータはホームページを作成した人が意図的に送信し、ブラウザがこれを受信して保存します。ブラウザに保存されているCookieは、そのCookie自信が覚えているパス(URL) に再びアクセスした時にそのページを公開しているサーバーに自動送信されます。サーバーに送信されたCookieは CGI等のプログラムにより、サーバーがセットした環境変数を使って読み出す事ができます。
この様にサーバー側に保存するのではなくブラウザ側にデータを保存しておいてもらう事によりいろいろ便利な事ができます。 以下に代表的なCookieの使い方を上げておきます。これら以外にもたくさんあると思います。 - クッキーカウンター
ホームページの訪問回数をサーバー側でなくブラウザ側に保存しておいてもらう事により、 訪問者毎のアクセスカウンターを作れます。 - ユーザー情報入力の省略
例えば会員制掲示板等、ユーザー名を入力してサーバー側に保存してある登録情報と一致したら次へ進める様な構成にする場合、 そのユーザー情報をCookieとしてブラウザに保存しておけば、2回目以後は Cookieとしてブラウザが自動で送信してきますので利用者の入力作業を省略できます。 - 簡易的なセッション管理
そのサイトにアクセスした時の時刻をブラウザにCookieとして保存すれば再訪問の時にどのぐらいの時間このサイトを 訪問しているかがわかります。つまり例えば20分以上再アクセスが無いとこの利用者のアクセスセッション は終了したという判断をする事も可能です。(何分に設定するかは難しいところですが。。)
セッション継続中の人数をサーバー側に保存しておけば、現在訪問中の人数をページに表示する事も可能になるわけです。 - Cookieとして既読フラグを持たせておく事により、掲示板等の発言ツリーで既読のタイトルと未読のタイトルを色分けする事も可能です。
- クッキーデータの構成
クッキーは以下の様な構成になっています。
<name>=<value1>; expires=<date>; domain=<value2>; path=<value3>; secure
<>内は各自設定できる項目です。 nameという名前のクッキーデータの値がvalue1だと言う意味です。 また、「name=value1」以外は省略可能です。
;,(Space)を使う場合はそれぞれ、%3B、%2C、%20にエンコードして送信文を書きます。また2バイト文字(日本語) を使う場合も相応のエンコードをしてから送信文とします。
expiresの右辺のdateはブラウザ側に保存しておく有効期限です。書式はWday, dd-mm-yy HH:MM:SS GMT
WdayはSun,Mon,Tueという省略された曜日名、mmはJan,Feb,Marという省略された月名を 書きます。HH:MM:SSは24時間制の時刻です。
expireの式を省略するとCookieはブラウザのキャッシュのみにストアされて、セッション切断時(ブラウザを閉じた時等) に破棄されます。 domainの右辺のvalue2はCookieを発行するWWWサーバーの名前です。この式を省略するとWWWサーバーの ドメイン名(「http://www02.u-page.so-net.ne.jp」等)などになります。
pathの右辺のvalue3はCookieを発行するhtmlファイルやCGIのパス名を指定します。
この式を省略すると、例えば「http://www.hage.ne.jp/abc/cgi-bin/cook.cgi」が発行する場合、 NNでは「/abc/cgi-bin」IEでは「/abc/cgi-bin/」としてブラウザに保存されます。
「path=/」とすると「http://www.hage.ne.jp」というドメイン(プロバイダー)のページ全てに対してブラウザ からCookieが渡されてしまうので注意してください。 - METAタグによるCookieの送信
Cookieのブラウザに対しての送信は、htmlファイルの中のMETAタグの中にCookieデータを埋め込む事で可能です。以下は例です。<META_EQUIV="Set-Cookie" CONTENT="user=denden; expire=Sat, 04-Apr-2000 09:30:30 GMT">
- PerlによるCookie送受信
Perlによるブラウザへの送信はSet-Cookieヘッダーを使ってContent-typeヘッダーの前で出力します。 以下に現在時刻からちょうど5年後までの有効期限を持たせて、Cookieを送信する例です。・・・・・・・・・・・・・・・・ $start = time; $ysec = $start+60*60*24*365*5; #5年後を秒で表す ($sec,$min,$hour,$mday,$mon,$year,$wday) = (gmtime($ysec))[0,1,2,3,4,5,6]; $seireki_nen = $year + 1900; @month = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'); $month = $month[$mon]; @youbi = ("Sun","Mon","Tue","Wed","Thr","Fri","Sat"); $youbi = $youbi[$wday]; $current_time = sprintf("%02d:%02d:%02d",$hour,$min,$sec); $value2 = $youbi.','.' '.$mday.'-'.$month.'-'.$seireki_nen.' '.$current_time.' GMT'; $u =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; #エンコード print "Set-Cookie: USER=$u; expires=$value2\n"; #ユーザー名をクッキーで送信 print "Content-type: text/html\n\n"; ・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・ $cookie=$ENV{'HTTP_COOKIE'}; @part=split(';',$cookie); foreach $w (@part){ if ($w =~ /USER/){ ($u,$uname)=split('=',$w); #変数にユーザー名を代入 $uname =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg; #デコード } } ・・・・・・・・・・・・・・・・
- ASPによるCookie送受信(下記情報はASP.NETでは当てはまらない可能性があります)
ASPを知らない人や興味の無い人は読まなくてもいいです。。
ASPはサーバーで実行できるScript言語としてVBScript、JScript、PerlScriptに対応していますが、以下に記載するスクリプト言語は「VBScript」です。(デフォルトのScript言語がVBScriptです)
ASPでブラウザにCookieを送信するにはASPの組み込みオブジェクトであるResponseオブジェクトのCookieコレクション を使います。ResponseオブジェクトのCookieコレクションの定義は以下です。 <>で囲まれた部分が各自設定するものです。また []で囲まれた部分は省略可能です。Cookieデータ全体の名前と、その名前に属するサブキー の名前を設定できる所はPerlと大きく違うところです。Response.Cookies(<クッキー名>)[[(<key>)][.attribute]] = <value> クッキー名:Cookieデータ全体の名前 key :「クッキー名」で指定されるデータのサブキー名 attribute :プロパティ。以下がある。 Domain --- 指定した場合このドメインからの要求時のみブラウザが送信してくる。書き込み専用。 Expires --- 有効期限。書き込み専用。 Haskeys --- サブキーを持っているかどうかのフラグ。読み取り専用。 Path --- 指定するとこのパスからの要求時のみブラウザが送信してくる。 指定しないとスクリプトのパスが使用される。 書き込み専用。 Secure --- 保護されたセッションかどうかを指定。書き込み専用。 value :設定する値
・・・・・・・・・・・・・・・・・・・・・・・・・・ Response.Cookies("asp_user")("mem_name") = Request.Form("aspname") '「aspname」という名前のテキストボックスフォームの入力文字を '「asp_user」というCookieの「mem_name」サブキーの値として発行 Response.Cookies("asp_user").Expires = Date + 3650 '10年有効 ・・・・・・・・・・・・・・・・・・・・・・・・・・
Request.Cookies(<クッキー名>)[[(<key>)][.HasKeys]] クッキー名:取得するCookieデータ全体の名前 key :「クッキー名」で指定されるデータのサブキー名 Haskeys : サブキーを持っているかどうかのフラグ。読み取り専用。
・・・・・・・・・・・・・・・・・・・・・・・・・・ c_name = Request.Cookies("asp_user")("mem_name") ・・・・・・・・・・・・・・・・・・・・・・・・・・