タヌキのお散歩
タヌキのお散歩

HTTPクッキーに関して

現在人来訪中
トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン 印刷

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を削除する」にチェックを入れます。

複数の設定をするには、

次のようにいくつかの行に分けてクッキーの名前と値を設定します。

 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では、

 $cookie1 = sprintf("%s=%s; expires=%s;",$name,$value,$expires);
 print "Set-Cookie: $cookie1\n";

設定値の呼び出しは、

次のように表示されます。(HttpHeader内に)

 Cookie: クッキーの名前a=値; クッキーの名前b=値

PERLによるクッキーの出力

以下の path,domain,expires,secure は省略できます。
このすべて省略すると (Set-Cookie: なまえ=値; path=/) が出力されます。

 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分間。

 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の設定と取得

 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の設定と取得

 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のヘッダー出力内容(参考)

 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を設定する場合、

 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]);

最終更新時間:2008年09月22日 15時03分53秒