CookieのSecure属性を付けないとどうなるか試した。Secure属性を有効にすると、httpsのときのみCookieを送信するようになる。
事前準備
事前の準備として、検証の内容的にhttpsアクセスは必須なので、nginxのリバースプロキシでhttps化の設定しておく。*1
今回は以下のアドレスで、expressにアクセスできるようにしておく。
https://127.0.0.1/
また、httpでアクセスした場合には、httpsにリダイレクトするようにしておく。
この設定自体はよくあると思う。
Cookieの設定
まずexpressで以下のようにSecure属性なしでCookieを設定
var app = express(); app.use(function(req, res, next) { res.setHeader("Set-Cookie", "key=secret"); next(); });
HTTPSアクセスしてみる。
https://127.0.0.1/にアクセスして、Chromeの開発者ツールなどで確認すると、Response Headerに以下が設定される。
set-cookie: key=secret; Secure
もう一度アクセスすると以下のようにsetされたcookieがRequest Headerに含まれることが確認できる。
cookie: key=secret
ここまでは通常通り。
HTTPアクセスした場合。
次に、http://127.0.0.1/にアクセスしてみる。そうすると当然ではあるのだがヘッダに以下のcookieが送信させていることが確認できた。
cookie: key=secret
つまり、httpの暗号化していない通信でkey=secretが送信されている。 これリダイレクトさせてるとほとんど気付かないが、開発者ツールなどでちゃんと確認していくと確認できる。*2
そもそもCookieってどういう条件で送付するんだっけ、とわからなくなったが、同一ドメインで指定したパス以下であればCookieは送付されるよう。同一オリジンと誤解している書籍などもあるが、オリジンではない様子。
CookieにSecure属性を追加
そこでSecure属性を追加して振る舞いの変化を確認してみる。
var app = express(); app.use(function(req, res, next) { res.setHeader("Set-Cookie", "key=secret; Secure"); next(); });
そのあと、同様の手順でhttpsでCookieを設定し、httpでリダイレクト試す。
そうすると、httpsのときだけしか、
cookie: key=secret
は送信されなくなった。httpのリダイレクトの時には送信されず、 httpsになった時だけ送信されるようになった。
httpのリンクを踏まされてしまうと漏らしてしまいかねないので、確かに怖い。*3 Secure属性の設定は必須ですね。。。
*1:設定方法は過去記事にも書いた。https://ma38su.hatenablog.com/entry/2020/06/27/235451
*2:ほんとうはパケットキャプチャとかまで試すべきなのかもしれないが。。。
*3:もちろんパケットキャプチャを仕掛けられている場合に限るのだけど、、、