認証Cookieが第三者により盗聴されると、第三者が別のユーザーに成り済ましてWebサイトのアクセスできます。ASP.NETのフォーム認証の場合  httpsを使用することで認証クッキーの盗聴を防ぐことができます。

認証Cookieを保護するには Web.config の <froms .. 要素に requireSSL を true に設定します。requireSSL を true にしている場合、認証クッキーは https を使用している場合にのみ認証クッキーをクライアントからサーバーに送信するようになりますことはMSDNの説明からわかったのですが、今更ながら  requireSSL を true / false にしたときに生成されるクッキーの挙動を把握していなかったので調べてみました。

1. requireSSL の true / false による動作の違い

まず、 下記のように requreSSL を false にしてフォーム認証を構成しました。その後、IE10の開発者ツールで認証クッキーがどのように生成されるのかを調べてみました。

    <authentication mode="Forms">
      <forms name=".ASPXAUTH" cookieless="UseCookies" requireSSL="false"/>
    </authentication>

下図がキャプチャした結果になります。HTTPのみ が はい になっているので、javascriptから認証クッキーが読み取れないようになっていることがわかります。セキュリティ保護 は いいえ になっていますので、発行されたクッキーは http/https に関係なく サーバー側に送信されます。

今度は、次のように requreSSL を true にして動作確認をしてみます。

    <authentication mode="Forms">
      <forms name=".ASPXAUTH" cookieless="UseCookies" requireSSL="true"/>
    </authentication>

まず、ブラウザーのアドレスバーに直接ログイン画面のアドレスを入力して、 http を使用して ログイン画面からログインしてみると、 次のように エラーが発生します。

アプリケーションは、セキュリティで保護されたクッキーを発行するように構成されています。これらのクッキーでは、サーバーが SSL (https プロトコル) 経由で要求を発行することが必要ですが、現在の要求は SSL 経由ではありません。

ログインは https (SSL) を使用するようにフォーム認証を構成したのでエラーが発生すること自体は想定通りになります。

今度は https (ssl) を使用してアクセスしてみると、次のようなキャプチャ結果になります。今度は セキュリティ保護に はい が設定されているので、 https 通信を使用しているときのみ 認証クッキーがサーバーサイドに送信されるようになり認証クッキーがセキュアになります。

2.アプリケーションで使用するすべてのクッキーをセキュアにするには

Cookie を 既定で https (Secure)にしか使用しないようにするには Web.config の httpCookies 要素を変更します。httpCookeis 要素の詳細に関してはMSDNのページhttp://msdn.microsoft.com/ja-jp/library/ms228262%28v=vs.100%29.aspxを参照してください。

<httpCookies  httpOnlyCookies="false" requireSSL="true" />

3. まとめ

説明は以上です。 requireSSL を使用することでセキュアな通信を行う場合のみサーバーとクライアント間で認証クッキーの送受信を行うようにできます。

一昔前はSSLを使用した暗号化処理はサーバー側に負荷がかかるので、そこまでセキュアであることを要求されないページはhttpを使用した通信をしていた覚えがあるのですが、最近は個人情報を取り扱うようなサイトはすべてのページでhttpsを使用するのがトレンドみたいです(とっくの昔からそうだったらごめんなさい)。例えば google は検索結果のページはすべてhttpsを使用します。その他 Twitter やfacebookもログインの有無に関係なく すべてのページで https を使用しているようでした。