2006 年 9 月 9 日 23 時 57 分

Cookie の動作


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


[写真]


では、Cookie の動作を追いかけてみよう。

Cookie は色々なサイトで使われているので、
どのサイトでも構わないのだが、
単純なテスト用のページを作成してみた。

■ Cookie デモ
http://loafer.jp/mixi/cookie-test.cgi

まず、上の URL にアクセスしてみよう。
「訪問カウンタ: 1 回目」と表示される。

Web ブラウザでページを更新するか、
下にある「ページを再度読み込む」を押すと、
「訪問カウンタ: 2 回目」と表示される。

この URL にパラメータ等は含まれていないが、
このページにアクセスすればその回数が表示され、
再読み込みすればするだけ回数は増加する。

これは Cookie によって実装されているため、
一度 Web ブラウザを全て閉じて、
再度アクセスしても回数は維持されている。

この Cookie の有効期限は 15 秒にしてある。
Web ページには JavaScript を仕込んでおり、
カウンタが無効になるまでの秒数を表示している。

このページに 15 秒以上アクセスしなければ、
カウンタは無効になり、再度 1 から開始されるのだ。

もし、何度読み込んでもカウンタが増加しない場合、
Web ブラウザのセキュリティ設定によって、
Cookie が無効になっている可能性があるため、
loafer.jp に対して有効にして試して欲しい。

では、実際の動作を Fiddler で確認してみよう。

まず、最初にアクセスしたときには
「訪問カウンタ: 1 回目」と表示された。
その Web サーバの応答の一部を見てみよう。

========== Response #1 ==========
HTTP/1.1 200 OK
Date: Sat, 09 Sep 2006 15:28:17 GMT
Set-Cookie: XSP-ALID=--z-i(...省略...)-d-B; expires=Fri, 08-Dec-2006 15:28:18 GMT; path=/
Set-Cookie: COUNTER=1; expires=Sat, 09-Sep-2006 15:28:33 GMT
Content-Type: text/html; charset=utf-8

========== end of Response #1 ==========

Web サーバは、「Set-Cookie」というヘッダで、
Cookie をブラウザに送り返す。
Cookie は、名前=値という形で送信され、
複数の値がある場合は、その数だけヘッダが送られる。
この例では、「XSP-ALID」と「COUNTER」の 2 つだ。

COUNTER の方に着目してみると、その値は「1」である。
この Cookie で訪問回数を記憶しているのだ。
後ろに続く属性の expires は、有効期限を示している。
「Sat, 09-Sep-2006 15:28:33 GMT」は、
日本時間にすると、2006/9/10 0:28:33 だ。
これはアクセスした 15 秒後になるようにしている。

もう 1 つの「XSP-ALID」には、
値として意味不明の長い文字列が使われている。
また、こちらには path という属性も指定されている。
path は、Cookie を使う領域を指定するためのもので、
この場合、/ 以下の全体で利用される。
これは、ランダムな ID を生成して返却させている。

では、15 秒以内に再度リクエストを送ってみる。
そのリクエストの一部を見てみよう。

========== Request #2 ==========
GET /mixi/cookie-test.cgi HTTP/1.0
Host: loafer.jp
Cookie: COUNTER=1; XSP-ALID=-z-i(...省略...)-d-B

========== end of Request #2 ==========

この 2 回目のリクエストでは、
Web ブラウザは Cookie を送り返す。

Web サーバと違い、Web ブラウザが使うのは、
「Cookie」という名前のヘッダであり、
Web ブラウザが覚えている Cookie 全てを、
名前=値 のペアとして一気に送るのだ。
ここには、有効期限に関する属性は含まれていない。

「訪問カウンタ: 2 回目」と表示されるのだが、
Web サーバは、この Cookie ヘッダに含まれる、
COUNTER パラメータの値が 1 であることを読み取り、
以前に 1 度訪れていることを知ったわけだ。

その Web サーバの応答ももう一度見てみよう。

========== Response #2 ==========
HTTP/1.1 200 OK
Date: Sat, 09 Sep 2006 15:28:21 GMT
Set-Cookie: XSP-ALID=_8D_(...省略...)_991; expires=Fri, 08-Dec-2006 15:28:21 GMT; path=/
Set-Cookie: COUNTER=2; expires=Sat, 09-Sep-2006 15:28:36 GMT
Content-Type: text/html; charset=utf-8

========== end of Response #2 ==========

先ほどと異なり、COUNTER の値は 2 となっている。
また、XSP-ALID も新しい値となっている。
Web ブラウザは同じ名前を持つ Cookie を受け取った場合、
新しい値で、記憶していた以前の値を上書きする。

このようにして訪問回数は記憶されている。
なので、再度読み込むと COUNTER=3 が返される。
この状態を写真として示しておこう。

では、COUNTER の有効期限が切れる 15 秒以上待って、
もう一度読み込んでみよう。
そしてそのリクエストの一部を見てみる。

========== Request #4 ==========
GET /mixi/cookie-test.cgi HTTP/1.0
Host: loafer.jp
Cookie: XSP-ALID=-6_E(...省略...)E6Um

========== end of Request #4 ==========

記憶していた Cookie の期限が切れた場合、
Web ブラウザはその Cookie を破棄し、内容を送信しない。
XSP-ALID は COUNTER よりも長い期限を持っていたため、
このリクエストでは XSP-ALID だけが送信されたのだ。

COUNTER が渡されない場合、
Web サーバには以前の訪問回数が分からない。
そのため、新規訪問と同じように扱われ、
再度「訪問カウンタ: 1 回目」と表示された。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.