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
コメント