「HTTP cookie」の版間の差分
(ページの作成:「<!-- vim: filetype=mediawiki --> [[{{PAGENAME}}]] (cookie, クッキー)とは、ステートレスなHTTP で Webサーバーと[[...」) |
|||
(同じ利用者による、間の8版が非表示) | |||
行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 のフォーマット == | ||
+ | |||
+ | NAME=VALUE; expires=DATE; path=PATH; domain=DOMAIN; Secure; HttpOnly | ||
+ | |||
+ | NAME=VALUE 以外は、省略可能です。 | ||
+ | |||
+ | {|class="wikitable" | ||
+ | |+ 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 のオプション == | == 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の発行 === | ||
+ | <syntaxhighlight lang="php"> | ||
+ | <?php | ||
+ | setcookie ( 'TestCookie1', 'value1' ); | ||
+ | setcookie ( 'TestCookie2', 'value2', time() + 3600 ); // 有効期限が1時間のセッションクッキー | ||
+ | ?> | ||
+ | </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時間のセッションクッキー ?>