備忘録的リファレンス

cookieについて

ブラウザ上に記録できるデータ Cookieについて

 Cookieとはブラウザ上に読み書きできる小さな記録を残す方法です。

 Cookieにはセキュリティ上の問題や記録できる容量が小さいという欠点を解消するために、Web Storageという一時記録方法もあります。

 web上では、クライアントは特定できない仕組みになっているためにサーバーは誰から通信されているかを知ることができません。それをCookieに記録したユーザIDやパスワードからユーザーを特定することができます。
 ネットショップの買い物状況を記録したり、前回の処理の続きもできます。

Cookieの記録方法

 ブラウザ上にCookieを記録させる方法にはいくつかあります。HTMLタグ、httpdヘッダーデータ、JavaScritと使った方法があります。
 書き込みや読み込み時には、エンコードが必要になる場合があります。

HTMLタグで

<meta http-equiv="Set-Cookie" content="~">

httpdヘッダー

 CGIなどに編集します。

print "Content-type: text/html\n";
print "Set-Cookie: ~\n";
print "\n";

Javascript

document.cookie = "~";

Cookieの値

 "~"の内容は、以下のようにします。

NAME=値; expires=値; domain=値; path=値; secure
パラメータ意味
NAME= 名称と値は任意で必須、値は空もあり。名称は制御文字、空白、タブ、()<>@,;:\"/[]?={}を除いたASCII文字。
値に日本語がある場合はとくにURLエンコードをした方がよい。 要件が満たされた値によってはURLエンコード、デコードすると思ったものと違うときがある。
expires= Cookie の有効期限。非推奨。
   Wed, 1-Jan-2020 00:00:00 GMT
有効期限が過ぎるとCookieを削除する。
Max-Age= Cookie の有効期限、秒数で指定。ゼロまたは負の値は直ちに期限切れに。ExpiresとMax-Ageの両方が設定されたら、Max-Ageを優先。
domain= Cookieの有効なドメインの範囲。省略した場合はCookieを発行したホストのドメン(www.***.comなど)になります。
path= Cookieの有効なパス(URL)の範囲。省略した場合はCookieを発行したパスになる。
secure SSL通信時のみ有効になる。URLにHTTPSとなる場合に有効。HTTPではやりとり不可。
記述例
Set-Cookie: NAME="value"; expires=Wed, 1-Jan-2020 00:00:00 GMT; domain=www.***.com; path=/; secure

Cookieの取得方法

 Cookieの取得は、JavaScriptによって取得することもできます。Cookieの取得は、主にサーバーで行うという前提があるためにサーバー上のCGIなどで取得する方法の説明が多いです。

CGIなど

print "$ENV{'HTTP_COOKIE'}\n";

JavaScript

document.cookie

 値については、「Cookieの値」を参照のこと。

エンコードとデコード

 Cookieはどのサーバーでも参照できるようにするためにMIME形式で保存することが望ましいです。

 いろいろな環境下で読み書きが行われる場合には、記録時にはエンコード、読み込み時にはデコードする必要があります。

Perlなど

エンコード

$xx =~ s/(\W)/sprintf("%%X", unpack("C", $1))/eg;

デコード

$xx =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg;


JavaScript

エンコード

xx = escape(xx);

デコード

xx = unescape(xx);