HSTS についてよく分かってなかったので軽く調べた

HSTS (HTTP Strict Transport Security) というと、Rails だとforce_ssl で設定されるのですが、外部向けの Web アプリよりも、内部向けの API を書くことがほとんどだったこともあり、あまり意識することがありませんでした。

ASP.NET Core を動かすサーバー構築をしている中で、「あれ、これどうすんだっけ」的なことがちょいちょいあったので今更ながら調べてみました。

HSTS に関して

なるほど、ブラウザに対して HTTPS を強制するための仕組みであると。preload リストがあるのは全然知らなかったです。

実は、この「ブラウザに対して」ってのが特に私が理解できてなかった点でした。

ASP.NET Core の場合

以下の Middleware が該当するようです。

HstsMiddleware の方を見ると、Header に値を追加しているだけです。
ちょっと気になるのは、 max-age のデフォルトが 30 日になっていること。推奨は 2 年のようなのでだいぶ短いようです。

Web API の場合

HSTS は一般にブラウザー専用の命令であるため、既定の API プロジェクトにはHstsは含まれません。 電話やデスクトップアプリなどの他の呼び出し元は、命令に従いません。 ブラウザー内でも、HTTP 経由の API に対して認証された単一の呼び出しにより、セキュリティで保護されていないネットワークに対するリスクが生じます。 セキュリティで保護された方法は、HTTPS 経由でのみリッスンして応答するように API プロジェクトを構成することです。

上記引用は上で貼った Microsoft Docs のものですが、 API プロジェクトの場合は Hsts は入りません。

Web サーバーがアプリケーションの前にある場合は?

NGINX 等がアプリの前にある場合は SSL 終端もそこになることも多いと思いますが、HSTS も NGINX に設定することになりそうです。

HTTP to HTTPS

NGINX 側で Rewrite なり Redirect するなり方法があります。

また、背後のアプリケーションで行う場合には、 X-Forwarded-Proto を見ないと分からないのでその点だけ注意が必要です。
Railsforce_ssl の場合は X-Forwarded-Proto を見るようになっていますが、ASP.NET Core の場合は ForwardedHeadersMiddleware を導入する必要があります。