Cookie(クッキー)について

Webセキュリティを勉強していると、Cookie(クッキー)という文字がよく出てくる。
Cookieの動作を理解しないままプログラムすると、脆弱性を生み出しやすい。

Cookieはセッション管理や CSRF対策などに使われる。
超大切なところだ。

今回はその Cookieについて学ぶ。

1.Cookieについて

Cookieとは、Webアプリケーション側でユーザ識別やセッション管理をするため、ブラウザを通じて訪問者PCに保存する、情報のこと。

Webアプリケーションは HTTPを使うため、通常は「状態」を持たない。
しかし、ユーザ認証を扱うWebアプリケーションでは、ログインの有無を確認するため、訪問者の「状態」が必要となってくる。

昔はその「状態」情報を URLに持たせていたが、セキュリティ的にまずかった。
そこで、訪問者PCへ保存することになり、その情報がクッキーと呼ばれる。

Cookieに含まれる情報は、サイト側が指定する。
・利用者の識別(ユーザ名など)
・利用者の属性
・最後にサイトを訪れた日時など

ブラウザからサーバへ Cookieが渡す方法は以下。
ITProより引用。

次の要求があった場合、ブラウザは保持しているクッキーを検索し、送信先のURLにひも付けられたすべてのクッキーをHTTPヘッダーに含めてリクエストを送信する。

つまり、Cookieは、HTTPヘッダーにSet-Cookieヘッダーを含めることによって、クライアントに渡される。
そのSet-Cookieヘッダーの例を見てみる。

Set-Cookie: <i>NAME</i>=<i>VALUE</i>; expires=<i>DATE</i>;
path=<i>PATH</i>; domain=<i>DOMAIN_NAME</i>; secure

Set-Cookie:から、各属性が設定されている。

NAME=VALUE

必須項目。VALUEのところに好きな名前を指定できる。ヘッダの名前。
セミコロン(;)、カンマ(,)、空白文字( )や日本語を使用する場合は、パーセントエンコーディングを行なう。

expires=DATE

Cookieの有効期限を指定する。
日付文字列のフォーマットはWdy, DD-Mon-YYYY HH:MM:SS GMT。

domain=DAMAIN_NAME

Cookie を発行する Webサーバーの名前を指定、省略すると runble1.com と入る?
後方一致する場合のみ、Cookieを送信する。

path=PATH

ここで指定したパス名にマッチするページを参照したときに、ブラウザは保存しておいた Cookie情報をサーバーに送る。

secure

secureと設定された場合、HTTPS通信でしか Cookieを送信しない。
secureがついてないと、HTTP通信でも送信してしまう。

2.Cookie関連のWebセキュリティ

Cookieが盗まれた場合、「なりすまし」が行なわれることになる。

Cookieを盗む手法としては、JavaScriptなんかを用いてのクロスサイトスクリプティングが挙げられる。
他にはネットワーク盗聴などの手法もある。

「なりすまし」は「セッション管理の不備」と「CSRF」で起こる脅威だった。
これらの脆弱性については以下を参照。

セッション管理の不備(安全なウェブサイトの作り方)

CSRF:クロスサイト・リクエスト・フォージェリ(安全なウェブサイトの作り方)

対策として、クッキーの属性を適切に設定すること。

secure属性を設定すると、HTTPS通信のときのみ Cookieを送信するようになる。
通常、Cookieを使う場面はHTTPS通信のときなので、必須といっていいだろう。

expires属性を設定すると、Cookieの有効期限を決めることができる。
オートログイン機能を実現させるために必要だが、ブラウザが終了しても Cookieが送信されてしまうため、扱いに注意が必要。
指定がない場合は、有効期限はブラウザが終了したときとなる。

以上のことを、アプリケーション側で Cookieを生成する場合に気をつけたい。
てか、すごい詳しいサイト見つけてしまった・・・

参考

「Webからの脅威」を攻略せよ――セッション管理編 – 第1回 まずは「クッキー」を理解すべし:ITpro

とほほのCookie入門

Cookie仕様 日本語訳 – futomi’s CGI Cafe

HTTPSを使ってもCookieの改変は防げないことを実験で試してみた | 徳丸浩の日記

コメント

タイトルとURLをコピーしました