JakartaEE レスポンスヘッダーを追加するフィルタの作成方法!初心者向け解説ガイド
生徒
「先生、Webアプリケーションでセキュリティ対策を強化したいときにレスポンスヘッダーを追加する方法ってあるんですか?」
先生
「あるよ。JakartaEEのフィルタを使えば、すべてのレスポンスに共通のヘッダーを簡単に追加できるんだ。例えばセキュリティ関連のHTTPレスポンスヘッダーやキャッシュ制御の設定などがあるね。」
生徒
「なるほど!それなら毎回サーブレットに書かなくてもいいんですね。実際にどうやって作るんですか?」
先生
「それじゃあ、レスポンスヘッダーを追加するフィルタの作成方法を実際に見てみよう。」
1. レスポンスヘッダーとは
HTTPレスポンスヘッダーは、サーバーがクライアント(ブラウザなど)に返す情報の一部です。例えばセキュリティ関連のX-Frame-OptionsやContent-Security-Policy、キャッシュ制御のCache-Controlなどがあります。これらのレスポンスヘッダーを適切に設定することで、セキュリティ強化やパフォーマンス改善が可能になります。
2. フィルタでレスポンスヘッダーを制御する仕組み
JakartaEEのフィルタは、リクエストとレスポンスの両方にアクセスできるため、レスポンスをクライアントに返す直前にヘッダーを追加することが可能です。この仕組みを使えば、アプリ全体で共通のヘッダーを一括管理でき、セキュリティや運用面で大きなメリットがあります。
3. レスポンスヘッダーフィルタのサンプルコード
以下は、セキュリティ強化のためにレスポンスヘッダーを追加するシンプルなフィルタの例です。
@WebFilter("/*")
public class ResponseHeaderFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
if (response instanceof HttpServletResponse) {
HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.setHeader("X-Frame-Options", "DENY");
httpResponse.setHeader("X-Content-Type-Options", "nosniff");
httpResponse.setHeader("Cache-Control", "no-store, no-cache, must-revalidate, max-age=0");
}
chain.doFilter(request, response);
}
}
このコードでは、クリックジャッキング対策やキャッシュ無効化の設定を行っています。
4. 実行結果のイメージ
このフィルタを導入すると、ブラウザの開発者ツールでレスポンスを確認した際に次のようなヘッダーが追加されます。
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
Cache-Control: no-store, no-cache, must-revalidate, max-age=0
5. web.xmlでの設定方法
アノテーションではなくweb.xmlを使ってレスポンスヘッダー用フィルタを設定する方法もあります。レガシー環境や設定ファイルで統一したい場合にはこちらを利用します。
<filter>
<filter-name>ResponseHeaderFilter</filter-name>
<filter-class>com.example.ResponseHeaderFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ResponseHeaderFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
6. レスポンスヘッダーフィルタを使うメリット
レスポンスヘッダーフィルタを導入することで、以下のような利点があります。
- セキュリティ関連のHTTPレスポンスヘッダーを一括で追加できる
- キャッシュ制御を統一的に行える
- サーブレットごとに記述する必要がなくメンテナンスが容易になる
- アプリ全体のセキュリティポリシーを中央集約的に管理できる
7. 実運用での注意点
レスポンスヘッダーはブラウザやクライアントの挙動に直接影響を与えるため、導入時には十分なテストが必要です。例えばX-Frame-OptionsをDENYにすると外部サイトからのiframe埋め込みが完全に禁止されるため、意図した挙動か確認する必要があります。またContent-Security-Policyなど強力なヘッダーを設定する場合は、実際の画面表示や外部リソースの読み込みに問題が出ないか注意が必要です。