HTTP cookie
（エイチティーティーピークッキー、単にクッキーとも表記される）は、RFC 6265などで定義されたHTTPにおけるウェブサーバとウェブブラウザ間で状態を管理する通信プロトコル、またそこで用いられるウェブブラウザに保存された情報のことを指す。ユーザ識別やセッション管理を実現する目的などに利用される。
HTTPは元来ハイパーテキストにおいて単にファイル転送を行うために開発されたため、同じURLへのアクセスならその状況によらず同一の資源を提供することが前提となっている。動的なコンテンツ生成の仕組みとしてフォームが導入されているが、これは要求に直接対応する応答だけに影響をおよぼす。言い換えるとHTTPでは、同じ瞬間に同じ内容の要求を行っていれば、そのクライアントが以前にどのような通信を行っていても区別されない。HTTPはその意味で現在においてもステートレスなプロトコルである。
その一方でWorld Wide Webが普及するにつれ、状況によって異なる内容のページを提供したいというニーズが生まれた。そのようなニーズをHTTPのみで満たすには、IPアドレスによって区別する、状態を表現したユニークなURLを生成するなどの方法がある。しかし、プライベートネットワークからのアクセスを区別できない、本来二度起きない状態が同じURLにアクセスすることで何度も発生する、セキュリティの問題などいずれも容易に解決できない欠点を抱えていた。
そこで、1994年にネットスケープコミュニケーションズ社によってクッキー が提案・実装された。クッキーでは次のようにサーバとクライアント間の状態を管理する。
この仕組みによって、ステートレスなプロトコルであるHTTP上でステートフルなサービスを実現する。ここで注意すべき点は、一度設定されたクッキーは、条件を満たす限り何度でも要求に組み込まれるという点である。HTMLページの要求だけでなく、画像を含むすべての要求が対象となる。
その後クッキーは1997年にRFC 2109で初めて標準化され、2000年のRFC 2965、2011年のRFC 6265で更新された。2007年現在ほとんどのウェブサーバ、ウェブブラウザで利用可能である。
前述の通り、 には幾つか仕様があるが、IETFの標準化した RFC 2109 や RFC 2965 は、ネットスケープ仕様とcodice_1属性からcodice_2属性への変更等互換性がないため、実際のウェブサイトではほとんど使われていない。一方で、codice_1属性等で用いられる日付形式は仕様外の記述が氾濫しているうえ、セキュリティ上の理由からcodice_4属性やcodice_5属性等が事実上追加されており、長らく文書の存在しない状態が続いていたが、RFC 6265 はこれらの問題を解消することを意図して制定されている。
クッキーの最も代表的な用途は、ショッピングサイトにおけるカートやログイン状態の管理である。また、IPアドレスによらないクライアントの識別を可能にするため、ウェブサイト運営者やインターネット広告配信業者などがユーザの詳細なアクセス履歴を取得する用途にも使われる。
クッキーは毎回送られるものであり、またHTTPヘッダの一部なのでASCII文字列になっている必要がある。そのためクッキーでデータを直接扱うよりも、セッションIDを実装する手段として使うことが多い。この場合、実際のデータは、セッションIDをキーとしてサーバが保持することになる。
例えば特定のページの表示回数を、ウェブページ上に表示したいときには、おおむね次のようなやりとりが行われる。例として、MediaWikiにおけるクッキーの使用をあげる。
MediaWikiソフトウェアでは、ログイン情報をクッキーで実現している。その方法はおおむね次のようである。クッキーは、HTML DOMの一部としてアクセスできる。JavaScriptをはじめとする、クライアント側のスクリプトは、クッキーを操作することができる。ただし後述のようにクッキーには有効範囲が設定されており、そのURLにおいて有効なクッキーだけがアクセス対象となる。
現在使われているウェブブラウザのほとんどはクッキーの送受信が可能であり、初期状態でクッキーを送受信する設定になっている。しかし、クッキーの送受信をするしない、またそのクッキーの内容は、ウェブ閲覧者の自由に置かれるべきものであるので、ブラウザの初期設定でそれらを操作できるようになっている。すなわち、クッキーの送受信を停止する、クッキーの内容を確認する、クッキーを消去するといった機能がウェブブラウザに備わっている。
クッキーを設定する際、どの要求に対してクッキー情報を送り返すのか、URLの範囲を指定する。規定値は、クッキーを設定したサーバに対するすべての要求であり、対象を広げることも狭めることもできる。ただし広げる場合でも、トップレベルドメインより狭い範囲でなければならない。
またクッキーの有効期限は、通常はブラウザを終了するまでだが、指定した期限まではブラウザを再度起動しても保持されるように設定することができる。有効期限の情報も、サーバからブラウザにクッキー情報を送信する段階で付加される。
無期限という設定は出来ない。遥か未来を指定することで半永久的に有効にすることも可能だが、ブラウザやサーバが2038年問題で不具合を起こす場合があることから、2038年1月19日3時14分07秒(UTC)以降の時間を期限とすることはあまりない。
クッキーでセッション管理を行う場合、もし第三者がセッションIDを知ることができれば、そのIDを名乗ることで本来のユーザになりすますことができる。このような「なりすまし」行為をセッションハイジャックと呼ぶ。
例として、以下のような通信を行うシステムがあるとする。
もし第三者がセッションIDを知ることができれば、そのセッションが有効な間だけとはいえ、1～2を飛ばして3から開始することができる。すなわち、パスワードを知らなくても「なりすまし」が可能となる。
第三者のクッキー情報を知る方法のひとつは盗聴である。盗聴を防ぐ手段としてTLSがある。ただしここで、クッキーは有効範囲内のすべての要求に対して自動的に付加されることに注意する必要がある。SSLでクッキー情報を暗号化しているつもりでも、有効範囲の設定によっては、SSLを利用しない要求にもクッキーが付加される可能性がある。情報処理推進機構は2003年8月に、この点に関する注意喚起を行った。
クロスサイトスクリプティングも、クッキー情報を不正に得る手段として使われる場合がある。クッキーには有効範囲が設定されているが、その有効範囲内にクロスサイトスクリプティング脆弱性を持つページがある場合、JavaScript等を併用して、他のサーバにクッキー情報を（URLの一部に組み込むなどして）送信させることが可能になる。
クッキーを使うと、そのユーザからの他の要求と関連付けることができる。
この手法は、Google AdSenseを利用するウェブ広告業者がよく利用する。バナー広告は、業者のサーバへのリンクを介して画像を取得する形式が一般的である。前述のとおりクッキーはHTMLに限らず、画像にも設定することができる。HTTPではリンク元のURL情報も送信することが一般的なので、結果として広告業者は、同社を利用するすべてのサイトを対象としてそのユーザのアクセス履歴を把握することが可能になる。ユーザのアクセス履歴を追跡するという意味からトラッキング・クッキーと呼ばれたり、メインのHTMLではなく画像の提供元が設定するという意味からサードパーティ・クッキーと呼ばれたりする。
これをプライバシーの侵害と考える人も、そう考えない人もいる。このようなクッキーを設定したくないユーザのために、クライアント向けセキュリティ対策ソフトの多くは、トラッキング・クッキーを検出・除去する機能を備えている。しかし、すべてのユーザにその影響が正しく理解されているとは限らず、コンピュータウイルスと誤解して初心者が驚くといった状況も散見される。
ウェブサイト作成者はクッキーを用いなくても、IPアドレス・ユーザーエージェント・ウェブビーコン・HTTPリファラなどを利用してトラッキングをすることが可能である。
またAdobe Flashで使われるLocal Shared Object（フラッシュ・クッキーとも呼ばれる）、HTML5やSilverlightの保存領域を利用してクッキーと同様のトラッキングをすることが可能である。ユーザには非常に気づかれにくい上に、クッキーが拒否あるいは削除されてもそれらの情報から容易に生成・復元することもできる。これらを総称してやなどと呼ばれる。問題になり始めた2011年現在では一般的なウェブブラウザやセキュリティソフトウェアの多くはこれに対処できておらず、除去や防止のためにはサードパーティ製ブラウザアドオンなどが必要である。