Cookieほどプログラミング初心者を混乱させる用語はないでしょう。名が体を表していないですし、何か魔術的な雰囲気1を醸し出しています。ネット上で見られる情報も誤りがあったり本質を掴んでいないものがほとんど です。そんなCookieをなるべく簡潔に説明してみようと思います。
Cookieとは
CookieとはWebサービスが クライアントを識別するために使用する短い文字列 です。Webサーバからの応答にSet-Cookieヘッダがあると、クライアント(ブラウザ)は以降の要求の際にCookieヘッダに指定された文字列(Set-Cookieヘッダの値)を設定します。
できる限り簡潔に説明するなら これですべて です。
なぜCookieを使うのか
Cookieを使う理由は、Web以前のシステムの知識があると理解しやすいでしょう。Web以前のクライアント/サーバシステムでは、クライアントはまずサーバに接続し、ユーザID/パスワードでログインします。サービスを使い終えるとログアウトし、接続を切断します。つまり、認証済みの単一の接続を通してサービスを受ける形態になります。ですので、サーバ側は認証後はその接続になりすましがないと信用することができます2。
一方Webでは、ページや画像などにアクセスする度に接続/切断を繰り返すので、接続を信用することができません34。そこで発明された仕組みがCookieであり、Web黎明期の1994年に当時もっとも人気のあったブラウザNetscapeに実装されました。先に述べたように、サーバが指定した(ユーザー個別の)文字列を、ブラウザが(自動的に)要求に含めることで「合言葉」の要領で相手を識別しようという仕組みがCookieなのです。
Cookieの設定手順
Cookieは以下の手順で設定/使用されます。
- サーバは20~100バイト程度のランダムな文字列5を生成し、これをSet-Cookieヘッダに設定して応答する
- これを受けたクライアントは、以降そのサーバへの要求の際にCookieヘッダに指定された文字列を設定する
1の際に 2の送信条件などを指定することもできます。例えば、以下のものがあります。
- サーバの特定のURL配下の場合にだけCookieを送信せよ(Path)
- HTTPS接続のときだけCookieを送信せよ(Secure)
- 指定された有効期限までこのCookieを使い続けよ(Expires)
- JavaScriptからCookieへのアクセスを禁止せよ(HttpOnly)
Cookieの有効期限はデフォルトではブラウザを終了するまでですが、上記のようにExpiresで有効期限を指定された場合は、次にブラウザを使用するときに以前のCookieを使用し続けなければなりません。このためにブラウザはCookieをブラウザのストレージに便宜的に保存します。ですがこれは有効期限までCookieを使い続けるための「副作用」であり、巷によくみられる 「Cookieをデータストアとして使う」は誤った用法 です。
ブラウザのJavaScriptから document.cookie を参照してCookieにアクセスすることもできますが、これが脆弱性となることが多かったため上記のようにHttpOnlyで禁止することができます。また、Cookieをデータストアとして使う(という誤った)目的で、document.cookie に値を設定するコーディングを見かけますが、これを行うと以降の要求の際に設定した値も送信されるようになってしまいます。ローカルに保存したつもりのデータがネットワーク上に流れている 訳ですので、この用法は大変危険です。
セッションとの関係
Cookieに関連して セッション という言葉を聞いたことがあるかもしれません。セッションの本来の意味はクライアント/サーバ間の一連のデータのやり取りの期間を指します。Web以前のシステムであれば接続がセッションであり、WebシステムではCookieを使用した一連のやり取りがセッションになります。
ですが、セッションと言ったときに「セッション情報」を話者が意図していることが多々あるので注意が必要です。セッション情報という用語自体があいまいなのですが、多くの場合は「Webベースのアプリケーションサーバ(TomcatやExpressなど)上に実装された セッションの最中に使用するデータの格納とアクセスの方法、およびそこで管理されるデータ のこと」と思えばよいでしょう。
セッション情報として管理されるデータの典型例は、ユーザID・氏名などの個人情報や「買い物かご」に入れられた商品一覧などでしょう。セッション情報を提供するアプリケーションサーバではCookieを直接扱うことはなく、代わりにCookieと1対1に対応づけられた セッションID をキーとしたデータストアとして実装されていることが多いです。つまりセッション情報とはアプリケーションサーバのメモリやストレージに格納されるサーバ側の情報のことです6。「Cookieとはデータストアである」という誤った言説をよく見かけますが、これはCookieとセッション情報を混同しているものと思われます。
まとめ
- CookieとはWebサービスが クライアントを識別するために使用する短い文字列 である
- Cookieはデータストアではない
- document.cookieを使うな
- Cookieとセッションを混同するな