Cookieに値をセットする - Perl,CGI

Cookieに書き込む方法は、CGIなどでHTTPヘッダに埋め込むか、HTMLのMETAタグ、JavaScriptなどで指定する方法がある。ここではCGI(Perl)でよく使用されているCGI::Cookieと呼ばれるモジュールを使用する。

※掲示板などに書き込んだ後、再度訪れると自分の名前やメールアドレスがあらかじめセットされている場合がある。これは書き込みを行った際に、自分のブラウザにそれらの情報が埋め込まれたためだ。このようにサーバではなく、ブラウザに値を記録する仕組みを「Cookie」と言う。

サンプル

#!/usr/bin/perl

;#
;#Cookieセット
;#

use strict;
use CGI::Cookie;

#-- ヘッダ出力 --#
print setCookie('id', 'katsube');
print "Content-type: text/html\n";
print "\n";

#-- 本文出力 --#
print qq|<html>\n|;
print qq|  <head><title>Cookieテスト</title></head>\n|;
print qq|  <body><h1>Hello World</h1></body>\n|;
print qq|</html>\n|;

#---------------------------------------
#Cookieにセットする
#---------------------------------------
sub setCookie{
  my $name    = shift || return;          #Cookie名
  my $value   = shift || '';              #値
  my $expires = shift || '+3M';           #賞味期限
  my $domain  = shift || 'ichikoro.com';  #取得可能なドメイン
  my $path    = shift || '/';             #取得可能なパス

  #-- Cookie値作成 --#
  my $cookie1 = new CGI::Cookie(-name    => $name
                , -value   => $value
                , -expires => $expires
                , -domain  => $domain
                , -path    => $path
        );

  return("Set-Cookie: $cookie1\n");
}

実行例

Set-Cookie: id=katsube; domain=ichikoro.com; path=/; expires=Mon, 15-Jan-2007 02:23:19 GMT
Content-type: text/html

<html>
<head><title>Cookieテスト</title></head>
<body><h1>Hello World</h1></body>
</html>

ブラウザ(FireFox)でCookieを確認したところ

Cookieの各種設定

有効期限を設定したい

下記のように続けて指定できる。この例では現在時刻から3日間有効なCookieを発行する。

setCookie('id1', 'katsube', '+3d');

これはCGIモジュール独自の書式で、下記の記号と組み合わせることで+30s なら 30秒後、-5y なら 5年前 といった記述が可能。「Fri, 31-Dec-2030 23:59:59 GMT」のような時間を固定した記述もできる。

  • s ..... 秒
  • m ..... 分
  • h ..... 時間
  • d ..... 日
  • M ..... 月
  • y ..... 年

CGI::Cookieを利用する際以外にも、通常、Cookieの仕様として、有効期限を何も指定しない場合はブラウザを終了した際に自動的に削除される。本の少しの間だけ、今回のアクセスだけと言った場合にはこの方法を用いるのが良い。

また過去の時間を指定すると削除されるので注意されたい。

ドメイン、パスを設定したい

共用サーバなどで、他のユーザーとドメインを共有している場合はこの設定が必須である。これをしていないと、他者にCookieを盗み見られてしまう恐れがある。

setCookie('id1', 'katsube', '+3d', 'ichikoro.com', '/cgi-bin/');

上記のように書いておくと、ドメインはichikoro.com、/cgi-bin/以下のファイルでないと、今回発行したCookieは呼び出されない設定となる。

日本語などを使用したい

使用してはまずい文字などはCGI::Cookieが自動的にエスケープしてくれるため、特に気にしなくても良い。

Cookieを2つ以上埋め込みたい

print setCookie('id1', 'katsube');
print setCookie('id2', 'ichikoro');
print "Content-type: text/html\n";
print "\n";

Cookieには1つのドメインに対して発行できるCookieの数が制限されているので注意されたし。また1つのCookieの長さにも制限がある。具体的な数や長さについてはブラウザにより異なるが、多くとも5個程度、数十byteあたりにしておくこと。

もし大量のデータをやりとりしたい場合は、セッション管理を利用することになる。