クッキーのSecureフラグはリバースプロキシに立てさせたい


HTTPクッキーで秘密情報、例えばログインセッションIDなどを扱う場合はSecureフラグを立てるのが定石です(例え秘密情報を扱わないとしても立てるのが定石と考えるべきかもしれません。セキュリティテストでは機械的に問題点として検出されてしまいますから)。

Secureフラグとは「HTTPS通信時にしか送り返さないでください」というブラウザへの指示。

Set-Cookie: session_id=8Zf60baQ4;secure

などと、Set-Cookieヘッダにsecureと追記することで実現します。こうしておけば、平文通信に秘密情報が流れてパケットキャプチャで盗聴されてしまうという心配がなくなります。

開発時にはsecureフラグが邪魔だったり

というわけでまともなユーザアカウント管理のあるWebシステムならsecureフラグは当然付けなければいけないのですが、問題は開発中です。

開発マシンのローカルにサーバを立てて動かしているときなど、HTTPSアクセスってことはまずしません。HTTPでアクセスしますよね。すると、secureフラグのせいでログインができなくなってしまうのです。

本番環境に発行したときだけsecureがオンになるように設定する? 設定漏れが怖いですね、だってsecureをオンにし忘れたって異常動作は出ないから気付きませんよ…?

HTTPS通信の付属品だと考えればHTTPSリバースプロキシの責務

HTTPS通信をサーバ側でどう実現するかですが、Apacheをフロントエンドに立ててHTTPSリバースプロキシとして働かせる場合、 HTTPS通信をしていることでsecureフラグが必要になっているんだから、HTTPS通信を実現しているApacheがそれもやってください と考えると機能が一箇所にまとまります。

Apacheにset-cookieヘッダの書き換えをさせるのです。ここで使うのはmod_headersモジュール。標準モジュールです。httpd.confへの記述は一行だけ。

Header edit Set-Cookie ^(.*)$ $1;secure

Nginxだと一筋縄ではいかない

Apacheよりは全般的に設定のシンプルに書けるNginxですが、これに相当する設定をするのは単純ではありません。自力でスクリプトを記述する必要があります。