CookieのSecure属性を試す。

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();
});

そのあと、同様の手順でhttpsCookieを設定し、httpでリダイレクト試す。

そうすると、httpsのときだけしか、

cookie: key=secret

は送信されなくなった。httpのリダイレクトの時には送信されず、 httpsになった時だけ送信されるようになった。

httpのリンクを踏まされてしまうと漏らしてしまいかねないので、確かに怖い。*3 Secure属性の設定は必須ですね。。。

*1:設定方法は過去記事にも書いた。https://ma38su.hatenablog.com/entry/2020/06/27/235451

*2:ほんとうはパケットキャプチャとかまで試すべきなのかもしれないが。。。

*3:もちろんパケットキャプチャを仕掛けられている場合に限るのだけど、、、