!!!HTTPクッキーに関して !!HTTP Cookieに保存されている情報 ::NAME=VALUE :::NAME属性はHTTP Cookieに保存されるデータの変数名と変数に保存される値で構成されています。空白、セミコロン、コンマを除く文字列です。セミコロン、カンマ、スペースが含まれるようなデータを設定する必要がある場合(URLエンコードのような物を扱う場合)にはこの限りではありません。なお、日本語を扱う場合には、URLエンコードを設定する必要があります。この情報はHTTP Cookieに絶対不可欠な唯一のものです。 ::expires=DATE :::expires属性は、HTTP Cookieの有効期限の定義です。有効期限に達したHTTP CookieはWebブラウザから削除されます。または、Webブラウザからサーバーに送信されなくなります。 ::domain=DOMAIN_NAME :::domain属性は、アクセスしたドメインに有効なクッキーを探すため、HTTP CookiesのリストからリクエストされたURLのホストのドメイン名を検索する時に使用されます。 ::path=PATH :::path属性は、HTTP Cookieが有効なドメインのURLのサブセットを特定するのに使われます。HTTP Cookieがあるdomainにマッチすると、URLのパス名の要素がpath属性と比較されます。そして、一致したなら、クッキーは有効とみなされ、 URLリクエストと一緒に送られます。 ::secure :::もしHTTP Cookieのsecureにフラグが立てられている場合は、ホストとの通信チャネルが安全なチャネルの場合にのみ送られます。現在では、secureにフラグの立っているHTTP Cookieは、HTTPSサーバのみに送られます。 !!HTTP Cookieの種類 HTTP Cookiesには Persistent Cookie(パーシステントクッキー)と呼ばれるものと Session Cookie(セッションクッキー)と呼ばれるものの二通りがあります。 セッションクッキーは一時的なクッキーです。Persistent(=永続的)Cookieといっても未来永劫残るものではありません。セッションクッキーより保存される期間の長いクッキーと言う意味です。 セッションクッキーは、インターネットメールプロバイダにログインするときなどに使用されています。最初にログインすると、メールを表示させようとする度にアクセス情報(IDやパスワード)を入力しなくても良いのは、このセッションクッキーのおかげです。また、オンラインバンクの認証もセッションクッキーが使用されています。いずれも、サーバーに対する要求が特定の時間内(たとえば、5分)であれば、ユーザ認証が継続されている事例です。 セッションクッキーはサーバーに対するセッションが終了した時点で(通常、ブラウザを終了した時点で)破棄されます。 パーシステントクッキーはフォーラム等に利用されています。一回ログインすると一定期間(2週間とか60日とか)の間にそのフォーラムにアクセスすると自動ログインされるのは、パーシステントクッキーがサーバーに読み戻されていることによります。 セッションクッキーと異なりパーシステントクッキーはWebブラウザを終了してもWebブラウザ内部に保存されています。Webブラウザ終了時にパーシステントクッキーを削除したい場合は、Webブラウザの設定で「終了時にCookieを削除する」にチェックを入れます。 !!複数の設定をするには、 次のようにいくつかの行に分けてクッキーの名前と値を設定します。 {{code Perl,0,0 Content-Type:test/html; charset=euc\n Set-Cookie: クッキーの名前a=値; expires=値; domain=値; path=値; secure\n Set-Cookie: クッキーの名前b=値; expires=値; domain=値; path=値; secure\n \n }} EXPIRESの形式は、次のようにGMTの時刻単位なります。通常は日本時間から9時間引いた値を用います。又次の値をそのまま使用すると、強制的に(クッキーの名前=値)相手のブラウザーからクッキーが排除されます。 ""Thu, 01-Jan-1970 00:00:00 GMT PERLでは、 {{code Perl,0,0 $cookie1 = sprintf("%s=%s; expires=%s;",$name,$value,$expires); print "Set-Cookie: $cookie1\n"; }} !!設定値の呼び出しは、 次のように表示されます。(HttpHeader内に) {{code Text,0,0 Cookie: クッキーの名前a=値; クッキーの名前b=値 }} !!PERLによるクッキーの出力 以下の path,domain,expires,secure は省略できます。 このすべて省略すると (Set-Cookie: なまえ=値; path=/) が出力されます。 {{code Perl,0,0 use CGI; my $query = new CGI; my $charset = 'shift_jis'; my $cookie = $query->cookie( -name => 'なまえ', -value => 'その値', -path => 'パス', -domain => 'ドメイン', -expires => '有効期限', -secure => 1 ); print $query->header(-charset => $charset,-cookie =>$cookie); }} クッキー使用例 その1 ブラウザーを再表示するごとにカウントアップしていきます。有効期限は2分間。 {{code Perl,0,0 use CGI; my $query = new CGI; #//Cookie,Get/Postが実行される。 my $value=0; #//Cookieを取得した値の参照 if (defined $query->cookie("countx")){$value=$query->cookie("countx");$value++;} else{$value=0;} my $charset = 'shift_jis'; #//shift_jis//iso-2022-jp//euc-jp// my $cookie= query->cookie( #//Cookieの設定 -name=>'countx',-value=>"$value",-expires=>'+2m' ); print $query->header(-type =>'text/plain',-charset => $charset,-cookie => $cookie); #//環境変数でcookie内容を参照 print "Cookie--GETENV--($ENV{'HTTP_COOKIE'})\n" if exists $ENV{'HTTP_COOKIE'}; print "Cookie-Set---($value)-----\n"; }} その例2 use CGI::Cookie;を使用してCookieの設定と取得 {{code Perl,0,0 use CGI; use CGI::Cookie; my $value=0; my %cookies = fetch CGI::Cookie; #//Cookieの取得 if(exists $cookies{'countx'}){ $value = $cookies{'countx'}->value; $value++; } my $charset = 'shift_jis'; #//shift_jis//iso-2022-jp//euc-jp// my $cookie= new CGI::Cookie( #//Cookieの設定 -name=>'countx',-value=>"$value",-expires=>'+2m' ); print $query->header(-type =>'text/plain',-charset => $charset,-cookie => $cookie); }} その3 Use CGI;を使用しない場合のCookieの設定と取得 {{code Perl,0,0 use CGI::Cookie; my $value=0; #//Cookie取得 my %cookies; if (exists $ENV{'HTTP_COOKIE'}){ foreach my $pairx (split(/;/,$ENV{'HTTP_COOKIE'})) { my ($namex, $valuex) = split(/=/, $pairx); $valuex =~ s/ //; $cookies{$namex} = $valuex; } } if(exists $cookies{'countx'}){ $value = $cookies{'countx'}; $value++; } my $cookie= new CGI::Cookie( #//Cookieの設定 -name=>'countx',-value=>"$value" ); print "Set-Cookie: $cookie\n"; print "Content-Type: text/plain; charset=shift_jis\n\n"; }} その1およびその2のヘッダー出力内容(参考) {{code Perl,0,0 Set-Cookie: countx=0; path=/; expires=Thu, 01-Nov-2007 12:09:53 GMT Date: Thu, 01 Nov 2007 12:07:53 GMT Content-Type: text/plain; charset=shift_jis }} 複数のCookieを設定する場合、 {{code Perl,0,0 my $cookie= $query->cookie( #//Cookie設定 -name=>'countx',-value=>"$value",-expires=>'+2m' ); my $cookie2= $query->cookie( #//Cookie設定 -name=>'counts',-value=>"$value2",-expires=>'+20s' ); print $query->header(-type =>'text/plain',-charset => $charset,-cookie =>[$cookie,$cookie2]); }}