HTTP cookie

提供: セキュリティ
移動: 案内検索
スポンサーリンク

HTTP cookie (cookie, クッキー)とは、ステートレスなHTTPWebサーバーウェブブラウザ(Webクライアント)の間で状態を管理するためにつかわれる仕組みです。

読み方

HTTP cookie
えいちてぃーてぃーぴー くっきー
cookie
くっきー
クッキー
くっきー

概要

HTTP cookie (cookie, クッキー)とは、ステートレスなHTTPWebサーバーウェブブラウザ(Webクライアント)の間で状態を管理するためにつかわれる仕組みです。

Webサーバにアクセスをしたときに、Webサーバから cookie が発行されたり、ウェブページを開いたウェブブラウザで実行されるJavaScriptで cookie を設定するときに、cookie は、発生します。 cookie は、ブラウザに保存され、ウェブサイト にアクセスするたびに自動的に送信されます。

cookie の使われ方

cookie は、いろいろな目的で利用されます。

  • ログインセッションの管理
  • 設定情報の保持
  • アクセス分析
  • テンポラリデータの格納
  • 閲覧履歴

cookie 送信のルール

cookie は、ドメインに対して発行されます。 cookie は、その cookie が属する ドメイン名 を指定して発行できますが、 cookie は、.jp や .co.jp ドメインでは、発行できません。.jp ドメインで発行ができてしまうと、すべての .jp ドメインのウェブサイトにその cookie が飛んでしまうからです。

foo.jp ドメインで発行された cookie は、 foo.jp と foo.jp の サブドメイン のアクセス時に送信されます。 login.foo.jp は、 login.foo.jp と foo.jp のドメインで cookie を発行できます。

セッションクッキー

有効期限の設定されていない cookie (セッションクッキーと呼ばれます)は、ブラウザが終了するときに破棄されます。

サードパーティ cookie

ファーストパーティ cookieは、ユーザがウェブブラウザでアクセスしているドメインが発行したcookieです。そのページ内に埋め込まれたバナー広告は、別のドメインから配信され、その広告のサーバーが発行するcookieは、サードパーティ cookieと呼ばれます。 ファーストパーティ cookieとサードパーティ cookieは、ただの cookie であり、呼び方が違うだけです。

Brower
+-------+                           +---------------+
|       | ------------------------> | example.co.jp |
|Content| <-- first party cookie -- |               |
|       |                           +---------------+
|       |
|       |                           +---------------+
|-------| ------------------------> | adserver.co.jp|
|Banner | <-- third party cookie -- |               |
|Ad     |                           +---------------+
+-------+

cookie のフォーマット

NAME=VALUE; expires=DATE; path=PATH; domain=DOMAIN; Secure; HttpOnly

NAME=VALUE 以外は、省略可能です。

cookie の属性値
属性 説明
NAME=VALUE cookieの名前(NAME)と値(VALUE)です。
expires=DATE cookieの有効期限(DATE)を設定します。RFC 1123 で定義されたフォーマット ( Wdy, DD Mon YYYY HH:MM:SS GMT ) を利用します。
path=PATH cookie のパス(PATH)を設定します。HTTPリクエストを送信するときに、URIとcookieごとのパスを比較し、前方一致でマッチしたURIに対して、cookie を送信します。cookieのパスが / であれば、そのサーバのすべてのリソースに対するアクセスで、cookie が送信されます。cookie No が /foo であれば、 /foobar や /foo/bar.html がマッチします。path が省略された場合は、/ が指定されたことになります。
domain=DOMAIN cookie の所属するドメイン名を指定します。ドメイン名は、後方一致のため bar.com というドメインは、 domain=.bar.com と指定します。そうでなければ、foobar.com にマッチしてしまいます。省略された場合、その cookie を生成した FQDNドメイン名となります。
Secure Secure 属性が指定された場合、その cookie は、HTTPS の通信でのみ利用されます。
HttpOnly HttpOnly 属性が指定された場合、その cookie は、ブラウザで実行される JavaScript でアクセスできなくなります(document.cookie)。

cookie のオプション

HttpOnly 属性

HttpOnly 属性を指定された場合、 JavaScript から document.cookie へアクセスできなくなります。 HttpOnly によって XSS を緩和することになるかもしれませんが、根本的な解決にはなりません。

JavaScript から発行される HTTPリクエスト のアクセスでは、cookie が送信されます。

意図的な外部ドメインのスクリプトの利用時に、ログインセッションのcookieにアクセスさせないために、HttpOnly 属性を利用する意味があるかもしれません。

HttpOnly 属性をサポートしていないブラウザでは無視されるため、XSSの緩和策として機能しません。

対応ブラウザ

Secure 属性

Secure 属性とは、HTTPS のアクセス時のみ、送信される cookie のことです。

Set-Cookie: SESSION=hoge; path=/; domain=.foo.com
Set-Cookie: SSL=meta; path=/; domain=.foo.com Secure

上記の場合、 SESSION という cookie は、 http://*.foo.comhttps://*.foo.com のアクセス時に送信されます。 SSL という cookie は、 https://*.foo.com のアクセス時に送信されます。

HTTP のリクエストは、通信が暗号化されないため、信頼されないネットワーク(暗号化されていない無線LANなど)で、cookie が盗難される可能性があります。

HTTPSHTTP のサイトを使い分けている場合、ログインセッションのcookieの Secure 属性をつけることが難しいかもしれません。 HTTPSHTTPで同じログインセッションのための cookie を共有する場合は、Secure 属性が付けられません。 ログインセッション cookie とは別に、ログインセッション cookie の正当な保持者として証明するための cookie を別途 Secure 属性で発行しておくことで、ログインセッション cookie をHTTPS通信時に確認することができます。

cookie の制限

ウェブブラウザ における制限として、以下の制限があります。

  • 300 個までの cookie を保持する
  • cookie は、それぞれ 4k byte まで。
  • ドメインやサーバあたり 20 個までの cookie 。

HTTP ヘッダーにおける cookie

cookie の発行

Webサーバが cookie の発行を行う場合は、HTTPレスポンスのHTTPレスポンスヘッダーで Set-Cookie ヘッダーを利用します。

Set-Cookie: B=xxx&b=3&s=cl; expires=Tue, 12-May-2015 04:41:53 GMT; path=/; domain=.yahoo.com

複数の cookie を同時に発行する場合には、複数行の Set-Cookie を指定します。

Set-Cookie: B=xxx&b=3&s=cl; expires=Tue, 12-May-2015 04:41:53 GMT; path=/; domain=.yahoo.com
Set-Cookie: fpt=d=x&v=1; path=/; domain=www.yahoo.com

cookie の削除

cookie の削除にも Set-Cookie ヘッダーが利用されます。 expire フィールドの日時を「現在」よりも前にすることで、削除を実現しています。

Set-Cookie: PH=deleted; expires=Fri, 11-May-2012 04:41:52 GMT; path=/; domain=.yahoo.com

プログラミング

PHPでのcookieの発行

<?php
setcookie ( 'TestCookie1', 'value1' );
setcookie ( 'TestCookie2', 'value2', time() + 3600 ); // 有効期限が1時間のセッションクッキー
?>

関連項目




スポンサーリンク