「HTTP cookie」の版間の差分

提供: セキュリティ
移動: 案内検索
 
(同じ利用者による、間の6版が非表示)
行1: 行1:
<!--
+
[[HTTP cookie]] (cookie, クッキー)とは、ステートレスな[[Hypertext Transfer Protocol|HTTP]] で [[Webサーバー]]と[[ウェブブラウザ]](Webクライアント)の間で状態を管理するためにつかわれる仕組みです。
vim: filetype=mediawiki
+
-->
+
[[{{PAGENAME}}]] (cookie, クッキー)とは、ステートレスな[[Hypertext Transfer Protocol|HTTP]] で [[Webサーバー]]と[[ウェブブラウザ]](Webクライアント)の間で状態を管理するためにつかわれる仕組みです。
+
  
読み方
+
'''読み方'''
;[[{{PAGENAME}}]]: えいちてぃーてぃーぴー くっきー
+
;[[HTTP cookie]]: えいちてぃーてぃーぴー くっきー
 
;cookie: くっきー
 
;cookie: くっきー
 
;クッキー: くっきー
 
;クッキー: くっきー
行11: 行8:
  
 
== 概要 ==
 
== 概要 ==
 +
[[HTTP cookie]] (cookie, クッキー)とは、ステートレスな[[Hypertext Transfer Protocol|HTTP]] で [[Webサーバー]]と[[ウェブブラウザ]](Webクライアント)の間で状態を管理するためにつかわれる仕組みです。
  
[[{{PAGENAME}}]] (cookie, クッキー)とは、ステートレスな[[Hypertext Transfer Protocol|HTTP]] で [[Webサーバー]]と[[ウェブブラウザ]](Webクライアント)の間で状態を管理するためにつかわれる仕組みです。
+
[[Webサーバ]]にアクセスをしたときに、[[Webサーバ]]から cookie が発行されたり、ウェブページを開いた[[ウェブブラウザ]]で実行される[[JavaScript]]で cookie を設定するときに、cookie は、発生します。
 
+
[[Webサーバー]]にアクセスをしたときに、[[Webサーバー]]から cookie が発行されたり、[[ウェブページ]]を開いた[[ウェブブラウザ]]で実行される[[JavaScript]]で cookie を設定するときに、cookie は、発生します。
+
 
cookie は、ブラウザに保存され、[[ウェブサイト]] にアクセスするたびに自動的に送信されます。
 
cookie は、ブラウザに保存され、[[ウェブサイト]] にアクセスするたびに自動的に送信されます。
 
 
 
== cookie の使われ方 ==
 
== cookie の使われ方 ==
 
 
cookie は、いろいろな目的で利用されます。
 
cookie は、いろいろな目的で利用されます。
  
行33: 行26:
 
cookie は、その cookie が属する [[ドメイン名]] を指定して発行できますが、 cookie は、.jp や .co.jp ドメインでは、発行できません。.jp ドメインで発行ができてしまうと、すべての .jp ドメインのウェブサイトにその cookie が飛んでしまうからです。
 
cookie は、その cookie が属する [[ドメイン名]] を指定して発行できますが、 cookie は、.jp や .co.jp ドメインでは、発行できません。.jp ドメインで発行ができてしまうと、すべての .jp ドメインのウェブサイトにその cookie が飛んでしまうからです。
  
foo.jp ドメインで発行された cookie は、 foo.jp と foo.jp の [[サブドメイン]] のアクセス時に送信されます。
+
foo.jp ドメインで発行された cookie は、 foo.jp と foo.jp の サブドメイン のアクセス時に送信されます。
 
login.foo.jp は、 login.foo.jp と foo.jp のドメインで cookie を発行できます。
 
login.foo.jp は、 login.foo.jp と foo.jp のドメインで cookie を発行できます。
 
 
== セッションクッキー ==
 
== セッションクッキー ==
 
 
有効期限の設定されていない cookie (セッションクッキーと呼ばれます)は、ブラウザが終了するときに破棄されます。
 
有効期限の設定されていない cookie (セッションクッキーと呼ばれます)は、ブラウザが終了するときに破棄されます。
 +
== サードパーティ cookie ==
 +
ファーストパーティ cookieは、ユーザが[[ウェブブラウザ]]でアクセスしているドメインが発行したcookieです。そのページ内に埋め込まれたバナー広告は、別のドメインから配信され、その広告のサーバーが発行するcookieは、サードパーティ cookieと呼ばれます。
 +
ファーストパーティ cookieとサードパーティ cookieは、ただの cookie であり、呼び方が違うだけです。
  
== サードパーティ cookie ==
+
<pre>
 +
Brower
 +
+-------+                          +---------------+
 +
|      | ------------------------> | example.co.jp |
 +
|Content| <-- first party cookie -- |              |
 +
|      |                          +---------------+
 +
|      |
 +
|      |                          +---------------+
 +
|-------| ------------------------> | adserver.co.jp|
 +
|Banner | <-- third party cookie -- |              |
 +
|Ad    |                          +---------------+
 +
+-------+
 +
</pre>
  
 
== cookie のフォーマット ==
 
== cookie のフォーマット ==
行60: 行66:
 
|-
 
|-
 
| path=PATH
 
| path=PATH
| cookie のパス(PATH)を設定します。[[HTTPリクエスト]]を送信するときに、URIとcookieごとのパスを比較し、前方一致でマッチしたURIに対して、cookie を送信します。cookieのパスが / であれば、そのサーバのすべてのリソースに対するアクセスで、cookie が送信されます。cookie No が /foo  であれば、 /foobar や /foo/bar.html がマッチします。path が省略された場合は、/ が指定されたことになります。
+
| cookie のパス(PATH)を設定します。HTTPリクエストを送信するときに、URIとcookieごとのパスを比較し、前方一致でマッチしたURIに対して、cookie を送信します。cookieのパスが / であれば、そのサーバのすべてのリソースに対するアクセスで、cookie が送信されます。cookie No が /foo  であれば、 /foobar や /foo/bar.html がマッチします。path が省略された場合は、/ が指定されたことになります。
 
|-
 
|-
 
| domain=DOMAIN
 
| domain=DOMAIN
行73: 行79:
  
 
== cookie のオプション ==
 
== cookie のオプション ==
 
 
=== HttpOnly 属性 ===
 
=== HttpOnly 属性 ===
 
 
HttpOnly 属性を指定された場合、 [[JavaScript]] から document.cookie へアクセスできなくなります。
 
HttpOnly 属性を指定された場合、 [[JavaScript]] から document.cookie へアクセスできなくなります。
 
HttpOnly によって [[XSS]] を緩和することになるかもしれませんが、根本的な解決にはなりません。
 
HttpOnly によって [[XSS]] を緩和することになるかもしれませんが、根本的な解決にはなりません。
  
JavaScript から発行される [[HTTPリクエスト]] のアクセスでは、cookie が送信されます。
+
JavaScript から発行される HTTPリクエスト のアクセスでは、cookie が送信されます。
  
 
意図的な外部ドメインのスクリプトの利用時に、ログインセッションのcookieにアクセスさせないために、HttpOnly 属性を利用する意味があるかもしれません。
 
意図的な外部ドメインのスクリプトの利用時に、ログインセッションのcookieにアクセスさせないために、HttpOnly 属性を利用する意味があるかもしれません。
  
 
HttpOnly 属性をサポートしていないブラウザでは無視されるため、[[XSS]]の緩和策として機能しません。
 
HttpOnly 属性をサポートしていないブラウザでは無視されるため、[[XSS]]の緩和策として機能しません。
 
 
==== 対応ブラウザ ====
 
==== 対応ブラウザ ====
 
 
* [[Internet Explorer]] 6 SP1 +
 
* [[Internet Explorer]] 6 SP1 +
 
* [[Firefox]] 2.0.0.5
 
* [[Firefox]] 2.0.0.5
 
* [[Chrome]] 1.0+
 
* [[Chrome]] 1.0+
* [[Safari]] 4+
+
* Safari 4+
* [[Opera]] 9.5+
+
* Opera 9.5+
 
+
 
=== Secure 属性 ===
 
=== Secure 属性 ===
 
 
Secure 属性とは、[[HTTPS]] のアクセス時のみ、送信される cookie のことです。
 
Secure 属性とは、[[HTTPS]] のアクセス時のみ、送信される cookie のことです。
  
行108: 行108:
 
[[HTTPS]]と[[HTTP]]で同じログインセッションのための cookie を共有する場合は、Secure 属性が付けられません。
 
[[HTTPS]]と[[HTTP]]で同じログインセッションのための cookie を共有する場合は、Secure 属性が付けられません。
 
ログインセッション cookie とは別に、ログインセッション cookie の正当な保持者として証明するための cookie を別途 Secure 属性で発行しておくことで、ログインセッション cookie を[[HTTPS]]通信時に確認することができます。
 
ログインセッション cookie とは別に、ログインセッション cookie の正当な保持者として証明するための cookie を別途 Secure 属性で発行しておくことで、ログインセッション cookie を[[HTTPS]]通信時に確認することができます。
 
 
== cookie の制限 ==
 
== cookie の制限 ==
 
 
[[ウェブブラウザ]] における制限として、以下の制限があります。
 
[[ウェブブラウザ]] における制限として、以下の制限があります。
  
行116: 行114:
 
* cookie は、それぞれ 4k byte まで。
 
* cookie は、それぞれ 4k byte まで。
 
* ドメインやサーバあたり 20 個までの cookie 。
 
* ドメインやサーバあたり 20 個までの cookie 。
 
 
== HTTP ヘッダーにおける cookie ==
 
== HTTP ヘッダーにおける cookie ==
 
 
=== cookie の発行 ===
 
=== cookie の発行 ===
 
+
[[Webサーバ]]が cookie の発行を行う場合は、[[HTTPレスポンス]]のHTTPレスポンスヘッダーで Set-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
 
  Set-Cookie: B=xxx&b=3&s=cl; expires=Tue, 12-May-2015 04:41:53 GMT; path=/; domain=.yahoo.com
  
行128: 行123:
 
  Set-Cookie: B=xxx&b=3&s=cl; expires=Tue, 12-May-2015 04:41:53 GMT; path=/; domain=.yahoo.com
 
  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
 
  Set-Cookie: fpt=d=x&v=1; path=/; domain=www.yahoo.com
 
 
=== cookie の削除 ===
 
=== cookie の削除 ===
 
 
cookie の削除にも Set-Cookie ヘッダーが利用されます。
 
cookie の削除にも Set-Cookie ヘッダーが利用されます。
 
expire フィールドの日時を「現在」よりも前にすることで、削除を実現しています。
 
expire フィールドの日時を「現在」よりも前にすることで、削除を実現しています。
  
 
  Set-Cookie: PH=deleted; expires=Fri, 11-May-2012 04:41:52 GMT; path=/; domain=.yahoo.com
 
  Set-Cookie: PH=deleted; expires=Fri, 11-May-2012 04:41:52 GMT; path=/; domain=.yahoo.com
 
 
== プログラミング ==
 
== プログラミング ==
 
 
=== PHPでのcookieの発行 ===
 
=== PHPでのcookieの発行 ===
 
 
<syntaxhighlight lang="php">
 
<syntaxhighlight lang="php">
 
<?php
 
<?php
行146: 行136:
 
?>
 
?>
 
</syntaxhighlight>
 
</syntaxhighlight>
 
 
== 関連項目 ==
 
== 関連項目 ==
* [[Hypertext Transfer Protocol|HTTP]]
+
* [[supercookie]]
* [[HTTPS]]
+
* [[HSTS Super Cookies]]
* [[ウェブブラウザ]]
+
* [[プライバシー]]
 +
{{http}}
 +
<!--
 +
vim: filetype=mediawiki
 +
-->

2015年9月22日 (火) 12:25時点における最新版

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時間のセッションクッキー
?>

関連項目