「HTTP cookie」の版間の差分

提供: セキュリティ
移動: 案内検索
(ページの作成:「<!-- vim: filetype=mediawiki --> [[{{PAGENAME}}]] (cookie, クッキー)とは、ステートレスなHTTPWebサーバーと[[...」)
 
行35: 行35:
 
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 のフォーマット ==
 +
 +
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 のオプション ==
  
=== HTTP ONLY ===
+
=== HttpOnly 属性 ===
  
=== HTTPS Only SECURE 属性 ===
+
HttpOnly 属性を指定された場合、 [[JavaScript]] から document.cookie へアクセスできなくなります。
 +
HttpOnly によって [[XSS]] を緩和することになるかもしれませんが、根本的な解決にはなりません。
  
== インストール ==
+
JavaScript から発行される [[HTTPリクエスト]] のアクセスでは、cookie が送信されます。
  
<syntaxhighlight lang="bash">
+
意図的な外部ドメインのスクリプトの利用時に、ログインセッションのcookieにアクセスさせないために、HttpOnly 属性を利用する意味があるかもしれません。
</syntaxhighlight>
+
 
 +
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">
<syntaxhighlight lang="bash">
+
<?php
 +
setcookie ( 'TestCookie1', 'value1' );
 +
setcookie ( 'TestCookie2', 'value2', time() + 3600 ); // 有効期限が1時間のセッションクッキー
 +
?>
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 
== 関連項目 ==
 
== 関連項目 ==
 +
* [[Hypertext Transfer Protocol|HTTP]]
 +
* [[HTTPS]]
 +
* [[ウェブブラウザ]]

2013年5月11日 (土) 14:21時点における版

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 のフォーマット

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

関連項目