クッキーもセキュリティ対策 ~ セキュアクッキーの設定
セキュリティ対策として、クッキーを利用する際にセキュアクッキーを使うということがあります。
ここでは、ASP.NET でセキュアクッキーを使うための方法を示します。
セキュアクッキーとは?
まず、セキュアクッキーとは何か?ということですが、これはクッキーを発行するときに "secure" とマークされたクッキーのことです。
サーバーはクッキーを発行、すなわち、クライアントに対して "Set-Cookie" レスポンスヘッダーを返すときに、 "secure" とマークすることによって、クライアントに対して、「このクッキーは HTTPS 通信のときにしか送信しないでくださいね」 と教えることができるのです。
もし、他人に見られてはセキュリティ対策上問題があるようなクッキーをセキュアクッキーにしないと、問題が起きる場合があります。
https (SSL/TLS) 通信しているときは、その中身を覗き見されることはありません。しかしたまたま http で接続に行った場合に secure でないと、クライアントがそのクッキーをヘッダーにセットして HTTP 要求を送ることになってしまいますから、このときにその中身をみられてしまう可能性が出てくる、ということになります。
具体例
では、ASP.NET のセッション ID クッキーを、セキュアクッキーにする方法を示します。
一番簡単なのは、Global.asax の Application_EndRequest を利用することだと思います。
もともと ASP.NET の Cookie オブジェクトには Secure 属性があります。これを True にすればセキュアクッキーになりますから、 "ASP.Net_SessionId" という名前の Cookie に Secure 属性を設定するために、Global.asax で次のようにします。
<%@ Application Language="C#" %> <script runat="server"> void Application_EndRequest(object sender, EventArgs e) { if (Response.Cookies.Count > 0) { foreach (string s in Response.Cookies.AllKeys) { if (s.ToLower().Equals("asp.net_sessionid")) { Response.Cookies[s].Secure = true; } } } } </script>
Secure=True と設定したら break で foreach を抜けてもいいとおもいますけど、サポート技術情報でこんな風なコードが載っていたので、何か抜けない理由があるのか?と思いそのままにしておきます(笑)
では、さっそく実験です。
まずは何もしない状態で、それがセキュアクッキーではないことを確認します。
IIS の SSL を有効にして、セッションの状態を有効にし、さらに Session オブジェクトを利用するコードを書きます。 それに対して WFetch を使って HTTPS の要求送信します。
すると IIS からのレスポンスヘッダー内に ASP.NET_SessionId という名前のクッキーの Set-Cookie ヘッダが確認できます。
この中に "secure" がマークされていないことがわかります。
ちなみに、HttpOnly というのは、サーバーがクライアントに対して、「クライアント側のスクリプトでこのクッキーを書き換えてはダメですよ」 と教えるためのマーカーです。
HttpOnly クッキーもセキュリティ対策の一環として行うものなのですが、今回の secure 指定とはまた別の意味、というわけです。
さて、上の Global.asax を ASP.NET の Web アプリケーションルートに配置して、同じ要求を行います。
すると、次は確かに Set-Cookie ヘッダに secure と書かれていることがわかります。
これでセキュアクッキーの設定ができたことが確認できました。