クッキーもセキュリティ対策 ~ セキュアクッキーの設定

セキュリティ対策として、クッキーを利用する際にセキュアクッキーを使うということがあります。

ここでは、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 と書かれていることがわかります。

これでセキュアクッキーの設定ができたことが確認できました。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 ASP.NET 入門