HTTP cookie
HTTP cookie (cookie, クッキー)とは、ステートレスなHTTP で Webサーバーとウェブブラウザ(Webクライアント)の間で状態を管理するためにつかわれる仕組みです。
読み方
- HTTP cookie
- えいちてぃーてぃーぴー くっきー
- cookie
- くっきー
- クッキー
- くっきー
目次
概要
HTTP cookie (cookie, クッキー)とは、ステートレスなHTTP で Webサーバーとウェブブラウザ(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 以外は、省略可能です。
属性 | 説明 |
---|---|
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の緩和策として機能しません。
対応ブラウザ
- Internet Explorer 6 SP1 +
- Firefox 2.0.0.5
- Chrome 1.0+
- Safari 4+
- Opera 9.5+
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.com と https://*.foo.com のアクセス時に送信されます。 SSL という cookie は、 https://*.foo.com のアクセス時に送信されます。
HTTP のリクエストは、通信が暗号化されないため、信頼されないネットワーク(暗号化されていない無線LANなど)で、cookie が盗難される可能性があります。
HTTPS と HTTP のサイトを使い分けている場合、ログインセッションのcookieの Secure 属性をつけることが難しいかもしれません。 HTTPSとHTTPで同じログインセッションのための 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時間のセッションクッキー ?>
関連項目
- supercookie
- プライバシー
- Hypertext Transfer Protocol (HTTP)
- HTTPS
- HTTP cookie
- 同一生成元ポリシー
ツイート