クッキーはウェブサーバーとウェブブラウザ間で状態を管理する仕組みである。
Wikipediaではその動作を以下のように説明している。
クッキーでは次のようにサーバとクライアント間の状態を管理する。
1. ウェブサーバがウェブブラウザにその状態を区別する識別子をHTTPヘッダに含める形で渡す。
2. ブラウザは次にそのサーバと通信する際に、与えられた識別子をHTTPヘッダに含めて送信する。
3. サーバはその識別子を元にコンテンツの内容をユーザに合わせてカスタマイズし、ブラウザに渡す。必要があれば新たな識別子もHTTPヘッダに含める。
以降2、3の繰り返し。この仕組みによって、ステートレスなプロトコルであるHTTP上でステートフルなサービスを実現する。ここで注意すべき点は、一度設定されたクッキーは、条件を満たす限り何度でも要求に組み込まれるという点である。HTMLページの要求だけでなく、画像を含むすべての要求が対象となる。
HTTP cookie – Wikipedia
http://ja.wikipedia.org/wiki/HTTP_cookie
サーバー・ブラウザ間でやり取りされるHTTPヘッダを実際にダンプして動作を検証してみる。
ブラウザがクッキーを食べていない状態
HTTPヘッダにはクッキーの情報が含まれていない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
GET /test/cookie/test1.php HTTP/1.1 Host: localhost User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us Accept-Encoding: gzip, deflate Connection: keep-alive Cache-Control: max-age=0 HTTP/1.1 200 OK Date: Tue, 29 Jul 2014 20:15:09 GMT Server: Apache/2.4.9 (Win32) OpenSSL/1.0.1g PHP/5.5.11 X-Powered-By: PHP/5.5.11 Content-Length: 0 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Content-Type: text/html |
サーバーからブラウザへクッキーを送信するとき
サーバーが送るHTTPヘッダにクッキーの情報が含まれている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
GET /test/cookie/test1.php HTTP/1.1 Host: localhost User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us Accept-Encoding: gzip, deflate Connection: keep-alive Cache-Control: max-age=0 HTTP/1.1 200 OK Date: Tue, 29 Jul 2014 20:15:57 GMT Server: Apache/2.4.9 (Win32) OpenSSL/1.0.1g PHP/5.5.11 X-Powered-By: PHP/5.5.11 Set-Cookie: accessed=1 Content-Length: 8 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Content-Type: text/html |
以後、クライアントがサーバーとやり取りするとき
クライアントが送るリクエストにクッキーの情報が含まれている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
GET /test/cookie/test1.php HTTP/1.1 Host: localhost User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us Accept-Encoding: gzip, deflate Cookie: accessed=1 Connection: keep-alive Cache-Control: max-age=0 HTTP/1.1 200 OK Date: Tue, 29 Jul 2014 20:17:23 GMT Server: Apache/2.4.9 (Win32) OpenSSL/1.0.1g PHP/5.5.11 X-Powered-By: PHP/5.5.11 Content-Length: 30 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Content-Type: text/html |
クッキーの有効期限が切れた後
もはやクライアントはサーバーにクッキーの情報を送らない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
GET /test/cookie/test1.php HTTP/1.1 Host: localhost User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us Accept-Encoding: gzip, deflate Connection: keep-alive HTTP/1.1 200 OK Date: Tue, 29 Jul 2014 20:24:45 GMT Server: Apache/2.4.9 (Win32) OpenSSL/1.0.1g PHP/5.5.11 X-Powered-By: PHP/5.5.11 Content-Length: 5 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Content-Type: text/html |
HTTPヘッダで見ると動作が理解しやすい。