「HTTP cookie」の版間の差分
細 (Daemon がページ「HTTP Cookie」を「HTTP cookie」に移動しました) |
|||
(同じ利用者による、間の5版が非表示) | |||
行1: | 行1: | ||
− | + | [[HTTP cookie]] (cookie, クッキー)とは、ステートレスな[[Hypertext Transfer Protocol|HTTP]] で [[Webサーバー]]と[[ウェブブラウザ]](Webクライアント)の間で状態を管理するためにつかわれる仕組みです。 | |
− | + | ||
− | + | ||
− | [[ | + | |
− | 読み方 | + | '''読み方''' |
− | ;[[ | + | ;[[HTTP cookie]]: えいちてぃーてぃーぴー くっきー |
;cookie: くっきー | ;cookie: くっきー | ||
;クッキー: くっきー | ;クッキー: くっきー | ||
行11: | 行8: | ||
== 概要 == | == 概要 == | ||
+ | [[HTTP cookie]] (cookie, クッキー)とは、ステートレスな[[Hypertext Transfer Protocol|HTTP]] で [[Webサーバー]]と[[ウェブブラウザ]](Webクライアント)の間で状態を管理するためにつかわれる仕組みです。 | ||
− | [[ | + | [[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 であり、呼び方が違うだけです。 | ||
− | + | <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) | + | | 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 から発行される | + | 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+ |
− | * | + | * 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 ヘッダーを利用します。 | |
− | + | ||
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> | ||
− | |||
== 関連項目 == | == 関連項目 == | ||
− | * [[ | + | * [[supercookie]] |
− | * [[ | + | * [[HSTS Super Cookies]] |
− | * [[ | + | * [[プライバシー]] |
+ | {{http}} | ||
+ | <!-- | ||
+ | vim: filetype=mediawiki | ||
+ | --> |
2015年9月22日 (火) 12:25時点における最新版
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時間のセッションクッキー ?>