HttpCookie クラス
アセンブリ: System.Web (system.web.dll 内)


HttpCookie クラスは、各 cookie のプロパティを取得または設定します。HttpCookieCollection クラスは、複数の Cookie を格納、取得、および管理するメソッドを提供します。
ASP.NET には 2 つの cookie コレクションが組み込まれています。HttpRequest オブジェクトの Cookies コレクションを使用してアクセスしたコレクションには、クライアントからサーバーに Cookie ヘッダーで送信された Cookie が含まれています。HttpResponse オブジェクトの Cookies コレクションを使用してアクセスしたコレクションには、サーバーで生成されてクライアントに Set-Cookie HTTP 応答ヘッダーで送信された新しい Cookie が含まれています。

HttpRequest オブジェクト内の DateCookieExample という名前の Cookie を確認する方法を次のコード例に示します。この Cookie は、見つからない場合には作成され、HttpResponse オブジェクトに追加されます。この Cookie の有効期限は 10 分に設定されています。
<%@ Page Language="VB" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server"> Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Dim sb As New StringBuilder() ' Get cookie from current request. Dim cookie As HttpCookie cookie = Request.Cookies.Get("DateCookieExample") ' Check if cookie exists in the current request If (cookie Is Nothing) Then sb.Append("Cookie was not received from the client. ") sb.Append("Creating cookie to add to the response. <br/>") ' Create cookie. cookie = New HttpCookie("DateCookieExample") ' Set value of cookie to current date time. cookie.Value = DateTime.Now.ToString() ' Set cookie to expire in 10 minutes. cookie.Expires = DateTime.Now.AddMinutes(10D) ' Insert the cookie in the current HttpResponse. Response.Cookies.Add(cookie) Else sb.Append("Cookie retrieved from client. <br/>") sb.Append("Cookie Name: " + cookie.Name + "<br/>") sb.Append("Cookie Value: " + cookie.Value + "<br/>") sb.Append("Cookie Expiration Date: " & _ cookie.Expires.ToString() & "<br/>") End If Label1.Text = sb.ToString() End Sub </script> <html > <head runat="server"> <title>HttpCookie Example</title> </head> <body> <form id="form1" runat="server"> <div> <asp:Label id="Label1" runat="server"></asp:Label> </div> </form> </body> </html>
<%@ Page Language="C#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server"> protected void Page_Load(object sender, EventArgs e) { StringBuilder sb = new StringBuilder(); // Get cookie from the current request. HttpCookie cookie = Request.Cookies.Get("DateCookieExample"); // Check if cookie exists in the current request. if (cookie == null) { sb.Append("Cookie was not received from the client. "); sb.Append("Creating cookie to add to the response. <br/>"); // Create cookie. cookie = new HttpCookie("DateCookieExample"); // Set value of cookie to current date time. cookie.Value = DateTime.Now.ToString(); // Set cookie to expire in 10 minutes. cookie.Expires = DateTime.Now.AddMinutes(10d); // Insert the cookie in the current HttpResponse. Response.Cookies.Add(cookie); } else { sb.Append("Cookie retrieved from client. <br/>"); sb.Append("Cookie Name: " + cookie.Name + "<br/>"); sb.Append("Cookie Value: " + cookie.Value + "<br/>"); sb.Append("Cookie Expiration Date: " + cookie.Expires.ToString() + "<br/>"); } Label1.Text = sb.ToString(); } </script> <html > <head runat="server"> <title>HttpCookie Example</title> </head> <body> <form id="form1" runat="server"> <div> <asp:Label id="Label1" runat="server"></asp:Label> </div> </form> </body> </html>


System.Web.HttpCookie


Windows 98, Windows 2000 SP4, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


HttpCookie コンストラクタ (String)
アセンブリ: System.Web (system.web.dll 内)



Windows 98, Windows 2000 SP4, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


HttpCookie コンストラクタ

名前 | 説明 |
---|---|
HttpCookie (String) | 新しい cookie を作成し、名前を付けます。 |
HttpCookie (String, String) | 新しい cookie を作成し、名前を付け、値を割り当てます。 |

HttpCookie コンストラクタ (String, String)
アセンブリ: System.Web (system.web.dll 内)



Windows 98, Windows 2000 SP4, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


HttpCookie プロパティ

名前 | 説明 | |
---|---|---|
![]() | Domain | cookie を関連付けるドメインを取得または設定します。 |
![]() | Expires | cookie の有効期限の日時を取得または設定します。 |
![]() | HasKeys | cookie にサブキーがあるかどうかを示す値を取得します。 |
![]() | HttpOnly | クライアント側のスクリプトで Cookie にアクセスできるかどうかを示す値を取得または設定します。 |
![]() | Item | HttpCookie.Values プロパティへのショートカットを取得します。このプロパティは、Active Server Pages (ASP) の旧バージョンとの互換性のために用意されています。 |
![]() | Name | cookie の名前を取得または設定します。 |
![]() | Path | 現在の cookie を使用して送信する仮想パスを取得または設定します。 |
![]() | Secure | SSL (Secure Sockets Layer) を使用して (つまり、HTTPS 経由だけで) Cookie を送信するかどうかを示す値を取得または設定します。 |
![]() | Value | 各 cookie の値を取得または設定します。 |
![]() | Values | 1 つの Cookie オブジェクト内に格納されているキー/値ペアのコレクションを取得します。 |

HttpCookie メソッド

名前 | 説明 | |
---|---|---|
![]() | Equals | オーバーロードされます。 2 つの Object インスタンスが等しいかどうかを判断します。 ( Object から継承されます。) |
![]() | GetHashCode | 特定の型のハッシュ関数として機能します。GetHashCode は、ハッシュ アルゴリズムや、ハッシュ テーブルのようなデータ構造での使用に適しています。 ( Object から継承されます。) |
![]() | GetType | 現在のインスタンスの Type を取得します。 ( Object から継承されます。) |
![]() | ReferenceEquals | 指定した複数の Object インスタンスが同一かどうかを判断します。 ( Object から継承されます。) |
![]() | ToString | 現在の Object を表す String を返します。 ( Object から継承されます。) |

名前 | 説明 | |
---|---|---|
![]() | Finalize | Object がガベージ コレクションにより収集される前に、その Object がリソースを解放し、その他のクリーンアップ操作を実行できるようにします。 ( Object から継承されます。) |
![]() | MemberwiseClone | 現在の Object の簡易コピーを作成します。 ( Object から継承されます。) |

HttpCookie メンバ
HTTP cookie のそれぞれをタイプ セーフな方法で作成および操作できるようにします。
HttpCookie データ型で公開されるメンバを以下の表に示します。


名前 | 説明 | |
---|---|---|
![]() | Domain | cookie を関連付けるドメインを取得または設定します。 |
![]() | Expires | cookie の有効期限の日時を取得または設定します。 |
![]() | HasKeys | cookie にサブキーがあるかどうかを示す値を取得します。 |
![]() | HttpOnly | クライアント側のスクリプトで Cookie にアクセスできるかどうかを示す値を取得または設定します。 |
![]() | Item | HttpCookie.Values プロパティへのショートカットを取得します。このプロパティは、Active Server Pages (ASP) の旧バージョンとの互換性のために用意されています。 |
![]() | Name | cookie の名前を取得または設定します。 |
![]() | Path | 現在の cookie を使用して送信する仮想パスを取得または設定します。 |
![]() | Secure | SSL (Secure Sockets Layer) を使用して (つまり、HTTPS 経由だけで) Cookie を送信するかどうかを示す値を取得または設定します。 |
![]() | Value | 各 cookie の値を取得または設定します。 |
![]() | Values | 1 つの Cookie オブジェクト内に格納されているキー/値ペアのコレクションを取得します。 |

名前 | 説明 | |
---|---|---|
![]() | Equals | オーバーロードされます。 2 つの Object インスタンスが等しいかどうかを判断します。 (Object から継承されます。) |
![]() | GetHashCode | 特定の型のハッシュ関数として機能します。GetHashCode は、ハッシュ アルゴリズムや、ハッシュ テーブルのようなデータ構造での使用に適しています。 (Object から継承されます。) |
![]() | GetType | 現在のインスタンスの Type を取得します。 (Object から継承されます。) |
![]() | ReferenceEquals | 指定した複数の Object インスタンスが同一かどうかを判断します。 (Object から継承されます。) |
![]() | ToString | 現在の Object を表す String を返します。 (Object から継承されます。) |

名前 | 説明 | |
---|---|---|
![]() | Finalize | Object がガベージ コレクションにより収集される前に、その Object がリソースを解放し、その他のクリーンアップ操作を実行できるようにします。 (Object から継承されます。) |
![]() | MemberwiseClone | 現在の Object の簡易コピーを作成します。 (Object から継承されます。) |

HTTP cookie
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2024/10/18 01:32 UTC 版)
![]() | この記事は検証可能な参考文献や出典が全く示されていないか、不十分です。(2021年3月) |
HTTP |
---|
主要項目 |
リクエストメソッド |
ヘッダーフィールド |
|
ステータスコード |
|
認証方式 |
セキュリティホール |
|
HTTP cookie(エイチティーティーピークッキー)は、マジッククッキーの一種。単にクッキー(cookie)とも表記される。
RFC 6265などで定義されたHTTPにおけるウェブサーバとウェブブラウザ間で状態を管理する通信プロトコル、またそこで用いられるウェブブラウザに保存された情報のことを指す。ユーザ識別やセッション管理を実現する目的などに利用される。
概要
HTTPは元来ハイパーテキストにおいて単にファイル転送を行うために開発されたため、同じURLへのアクセスならその状況によらず同一の情報源[1]を提供することが前提となっている。動的なコンテンツ生成の仕組みとしてフォームが導入されているが、これは要求に直接対応する応答だけに影響をおよぼす。言い換えるとHTTPでは、同じ瞬間に同じ内容の要求を行っていれば、そのクライアントが以前にどのような通信を行っていても区別されない。HTTPはその意味で現在においてもステートレスなプロトコルである。
その一方でWorld Wide Webが普及するにつれ、状況によって異なる内容のページを提供したい[2]というニーズが生まれた。そのようなニーズをHTTPのみで満たすには、IPアドレスによって区別する、状態を表現したユニークなURLを生成するなどの方法がある。しかし、プライベートネットワークからのアクセスを区別できない、本来二度起きない状態が同じURLにアクセスすることで何度も発生する、セキュリティの問題などいずれも容易に解決できない欠点を抱えていた。
そこで、1994年にネットスケープコミュニケーションズ社によってクッキー[3] が提案・実装された。クッキーでは次のようにサーバとクライアント間の状態を管理する。
- ウェブサーバがウェブブラウザにその状態を区別する識別子をHTTPヘッダに含める形で渡す。
- ブラウザは次にそのサーバと通信する際に、与えられた識別子をHTTPヘッダに含めて送信する。
- サーバはその識別子を元にコンテンツの内容をユーザに合わせてカスタマイズし、ブラウザに渡す。必要があれば新たな識別子もHTTPヘッダに含める。
- 以降2、3の繰り返し。
この仕組みによって、ステートレスなプロトコルであるHTTP上でステートフルなサービスを実現する。ここで注意すべき点は、一度設定されたクッキーは、条件を満たす限り何度でも要求に組み込まれるという点である。HTMLページの要求だけでなく、画像を含むすべての要求が対象となる。
その後クッキーは1997年にRFC 2109で初めて標準化され、2000年のRFC 2965、2011年のRFC 6265で更新された。2007年現在ほとんどのウェブサーバ、ウェブブラウザで利用可能である。
仕様間の違い
前述の通り、HTTP Cookie には幾つか仕様があるが、IETFの標準化した RFC 2109 や RFC 2965 は、ネットスケープ仕様とExpires
属性からMax-Age
属性への変更等互換性がないため、実際のウェブサイトではほとんど使われていない[4]。一方で、Expires
属性等で用いられる日付形式は仕様外の記述が氾濫しているうえ[5]、セキュリティ上の理由からhttponly
属性やsecure
属性等が事実上追加されており、長らく文書の存在しない状態が続いていたが、RFC 6265 はこれらの問題を解消することを意図して制定されている。
2016年頃から、RFC 6265の改訂作業が行われている[6]。クッキープレフィックス(__Secure-
と__Host-
)、SameSite属性の追加などが行われる予定で、すでにウェブブラウザでの実装も並行して進められている[7][8]。
用途
クッキーの最も代表的な用途は、ショッピングサイトにおけるカートやログイン状態の管理である。また、IPアドレスによらないクライアントの識別を可能にするため、ウェブサイト運営者やインターネット広告配信業者などがユーザの詳細なアクセス履歴を取得する用途にも使われる。
クッキーは毎回送られるものであり、またHTTPヘッダの一部なのでASCII文字列になっている必要がある。そのためクッキーでデータを直接扱うよりも、セッションIDを実装する手段として使うことが多い。この場合、実際のデータは、セッションIDをキーとしてサーバが保持することになる。
例
例えば特定のページの表示回数を、ウェブページ上に表示したいときには、おおむね次のようなやりとりが行われる。
- ブラウザがサーバに閲覧を要求する。ここにはクッキーの情報はない。
- サーバはブラウザに対し「1」回目というクッキー情報と、「1回目」と表示するようなデータを送信する。
- ブラウザがサーバに閲覧を要求する。このときブラウザは、そのサーバから受け取ったクッキーを探して、「1」のクッキー情報をサーバに送信する。
- サーバは「1」というクッキー情報に基づき、ブラウザに対し「2」回目というクッキー情報と、「2回目」と表示するようなデータを送信する。
例:MediaWikiにおけるログイン情報
例として、MediaWikiにおけるクッキーの使用をあげる。
MediaWikiソフトウェアでは、ログイン情報をクッキーで実現している。その方法はおおむね次のようである。
- ログインページからユーザ名とパスワードをサーバに送信する。この時点でクッキーは使われていない。
- サーバは、ユーザ名とパスワードを確認し、ユーザーにカスタマイズされた「ログイン成功」のページを送信するとともに、ユーザー名とパスワードを(そのままではないが)クッキーとして送信する。
- 次の閲覧からはブラウザがページ閲覧要求とともに先のクッキーを送信する。サーバはクッキー情報によってユーザにカスタマイズされたページを送信する。
- ログアウトをクリックすると、「ログアウト」のページとともに、空のクッキー情報を送信する。ブラウザは、先のクッキー情報を空のクッキー情報で上書きする。これにより最初のクッキー情報は消去される。
クライアント側スクリプトによるクッキーの操作
クッキーは、HTML DOMの一部としてアクセスできる。JavaScriptをはじめとする、クライアント側のスクリプトは、クッキーを操作することができる。ただし後述のようにクッキーには有効範囲が設定されており、そのURLにおいて有効なクッキーだけがアクセス対象となる。
ブラウザの環境設定によるクッキーの操作
現在使われているウェブブラウザのほとんどはクッキーの送受信が可能であり、初期状態でクッキーを送受信する設定になっている。しかし、クッキーの送受信をするしない、またそのクッキーの内容は、ウェブ閲覧者の自由に置かれるべきものであるので、ブラウザの初期設定でそれらを操作できるようになっている。すなわち、クッキーの送受信を停止する、クッキーの内容を確認する、クッキーを消去するといった機能がウェブブラウザに備わっている。
クッキーの適用範囲と有効期限
クッキーを設定する際、どの要求に対してクッキー情報を送り返すのか、URLの範囲を指定する。規定値は、クッキーを設定したサーバに対するすべての要求であり、対象を広げることも狭めることもできる。ただし広げる場合でも、トップレベルドメインより狭い範囲でなければならない。
またクッキーの有効期限は、通常はブラウザを終了するまでだが、指定した期限まではブラウザを再度起動しても保持されるように設定することができる。有効期限の情報も、サーバからブラウザにクッキー情報を送信する段階で付加される。 無期限という設定は出来ない。遥か未来を指定することで半永久的に有効にすることも可能だが、ブラウザやサーバが2038年問題で不具合を起こす場合があることから[9]、2038年1月19日3時14分07秒(UTC)以降の時間を期限とすることはあまりない。
セキュリティ、プライバシーの問題
![]() | この節の加筆が望まれています。 |
セッションハイジャック
クッキーでセッション管理を行う場合、もし第三者がセッションIDを知ることができれば、そのIDを名乗ることで本来のユーザになりすますことができる。このような「なりすまし」行為をセッションハイジャックと呼ぶ。
例として、以下のような通信を行うシステムがあるとする。
- トップページでユーザIDとパスワードの入力を求める。
- 認証に成功するとサーバはセッションIDを割り当て、クッキーとしてクライアントに通知する。
- クライアントは以降の要求にクッキーとしてセッションIDを付加する。サーバは対応するセッション情報にアクセスし、どのユーザであるか識別する。
もし第三者がセッションIDを知ることができれば、そのセッションが有効な間だけとはいえ、1~2を飛ばして3から開始することができる。すなわち、パスワードを知らなくても「なりすまし」が可能となる。
第三者のクッキー情報を知る方法のひとつは盗聴である。盗聴を防ぐ手段としてTLSがある。ただしここで、クッキーは有効範囲内のすべての要求に対して自動的に付加されることに注意する必要がある。SSLでクッキー情報を暗号化しているつもりでも、有効範囲の設定によっては、SSLを利用しない要求にもクッキーが付加される可能性がある。情報処理推進機構は2003年8月に、この点に関する注意喚起[10]を行った。
クロスサイトスクリプティングも、クッキー情報を不正に得る手段として使われる場合がある。クッキーには有効範囲が設定されているが、その有効範囲内にクロスサイトスクリプティング脆弱性を持つページがある場合、JavaScript等を併用して、他のサーバにクッキー情報を(URLの一部に組み込むなどして)送信させることが可能になる。
トラッキング・クッキー
クッキーを使うと、そのユーザからの他の要求と関連付けることができる。
この手法は、アドネットワーク(Google AdSenseなど)を利用するウェブ広告業者がよく用いる。インターネット広告の配信において、バナー広告は、業者のサーバ(サードパーティー)へのリンクを介して画像を取得する形式が一般的である。前述のとおりクッキーはHTMLに限らず、画像にも設定することができる。HTTPではリンク元のURL情報も送信することが一般的なので、結果として広告業者は、同社を利用するすべてのサイトを対象としてそのユーザのアクセス履歴を把握することが可能になる。詳細はCookieとスパイウェアの関係も参照。ユーザのアクセス履歴を追跡するという意味からトラッキング・クッキーと呼ばれたり、メインのHTMLではなく画像の提供元が設定するという意味からサードパーティー・クッキーと呼ばれたりする。これらは、行動ターゲティング広告やコンテンツ連動型広告および検索連動型広告などに活用され、時にフィルターバブルの原因ともなっているが、今後Federated Learning of Cohortsに移行する動きがある。
これをプライバシーの侵害と考える人も、そう考えない人もいる。このようなクッキーを設定したくないユーザのために、クライアント向けセキュリティ対策ソフトの多くは、トラッキング・クッキーを検出・除去する機能を備えている[11][12]。しかし、すべてのユーザにその影響が正しく理解されているとは限らず、コンピュータウイルスと誤解して初心者が驚くといった状況も散見される。
類似のトラッキング技術
ウェブサイト作成者はクッキーを用いなくても、サードパーティーのGoogle Analytics等を使うことでIPアドレス・ユーザーエージェント・ウェブビーコン・HTTPリファラなどを利用してアクセス解析をおこないウェブ トラッキングをすることが可能である。JavaScriptおよびHTML5(WebGL、canvas要素、Webフォントなど)を用いたその他の手法についてはフィンガープリントも参照。
またAdobe Flashで使われるLocal Shared Object(フラッシュ・クッキーとも呼ばれる)やSilverlightの保存領域、HTML5(インストール済みのWebフォントなど)、Faviconなどを利用してクッキーと同様のトラッキングをすることが可能である。ユーザには非常に気づかれにくい上に、クッキーが拒否あるいは削除されてもそれらの情報から容易に生成・復元することもできる。これらを総称して
問題になり始めた2011年現在では一般的なウェブブラウザやセキュリティソフトウェアの多くはこれに対処できておらず、防止や除去のためにはサードパーティー製ブラウザアドオンの使用とJavaScriptの制御や無効化、ウェブブラウザのプライバシーモードやCCleanerを用いたキャッシュおよび閲覧履歴の完全な削除などの対策が必要である。なお、Tor BrowserやOnion Browserに関しては、いまのところウェブトラッキングやキャンバス・フィンガープリンティングなどの回避に有効[14]である。
国内法における規制
2019年にリクナビの運営会社が目的を十分に説明しないまま、クッキーで得られた情報を外部に販売した問題が発覚したことを受けて、2022年4月1日施行の個人情報の保護に関する法律によって、クッキーの活用に規制がかけられるようになった[15][16]。
脚注
- ^ ここで言う資源とは、HTML文書や画像、音声、などのコンテンツ全般を指す。
- ^ ウィキペディアを例に挙げると、同じURLでもログインしていない場合はページの一番上が「ログインまたはアカウント作成」、している場合は「(ユーザ名) 自分の会話 個人設定 ウォッチリスト 自分の投稿記録 ログアウト」と表示が変化する。
- ^ Netscape Communications Corporation. “PERSISTENT CLIENT STATE HTTP COOKIES” (英語). 2011年9月29日閲覧。
- ^ Dan Winship. “2009-08-05-Dan-Winship.txt” (英語). 2011年9月29日閲覧。
- ^ Dan Winship. “2009-08-11-Dan-Winship.txt” (英語). 2011年9月29日閲覧。
- ^ draft-ietf-httpbis-rfc6265bis-06
- ^ Can I use: headers HTTP header: Set-Cookie: Cookie prefixes
- ^ Can I use: 'SameSite' cookie attribute
- ^ Microsoft. “[IIS]2038 年 1 月 19 日以降の有効期限のクッキーにおける ASP 200 エラー”. 2008年6月16日閲覧。
- ^ 情報処理推進機構. “経路のセキュリティと同時にセキュアなセッション管理を”. 2008年5月24日閲覧。
- ^ Symantec Corporation. “システムの完全スキャンを実行するとトラッキング・クッキーのリスクが表示される”. 2008年6月15日閲覧。
- ^ Trend Micro Incorporated. “スパイウェア検索をすると「COOKIE_・・・・」が多量に検出されるのですが、大丈夫ですか?”. 2008年6月15日閲覧。 [リンク切れ]
- ^ “アドネットワークは、常にあなたを監視している”. japan.internet.com. (2011年10月25日) 2011年10月26日閲覧。
- ^ Fingerprint解説サイト - 明治大学 情報セキュリティ研究室
- ^ “NTTコムオンライン”. NTT. 2023年1月30日閲覧。
- ^ 坪井宏彰 (2024年10月17日). “Cookieバナー多すぎ? ダークパターンに注意”. NHKニュース. 日本放送協会. 2024年10月18日閲覧。
関連項目
外部リンク
- RFC 2965 - HTTP State Management Mechanism
- RFC 6265 - HTTP State Management Mechanism
- Cookies: HTTP State Management Mechanism (日本語訳)
- HTTP cookieのページへのリンク