JakartaEEフィルタで実現するセキュリティ対策|XSSとCSRFを防ぐ方法
生徒
「先生、JakartaEEでウェブアプリを作っているのですが、セキュリティ対策ってどうすればいいんですか?」
先生
「とても大事な視点ですね。JakartaEEではServletフィルタを使って、XSS対策やCSRF対策を実装できますよ。」
生徒
「フィルタってリクエストやレスポンスを処理する仕組みですよね?どうやってセキュリティと関係するんですか?」
先生
「そうです。フィルタを通してリクエストのパラメータをチェックしたり、トークンを検証することで、不正なアクセスを防ぐことができます。」
1. JakartaEEにおけるセキュリティ対策とフィルタの役割
JakartaEEのウェブアプリケーションでは、セキュリティ対策が欠かせません。特に外部からの攻撃としてよく知られているのがクロスサイトスクリプティング(XSS)とクロスサイトリクエストフォージェリ(CSRF)です。これらはユーザーのデータやセッションを狙う代表的な攻撃であり、初心者が作るシンプルなアプリでも簡単に標的になってしまいます。
Jakarta Servletのフィルタを利用することで、これらの攻撃を効率的に防止できます。フィルタはすべてのリクエストやレスポンスの入り口に立つ仕組みであり、チェックや加工を追加できるため、セキュリティ対策に非常に有効です。
2. フィルタを利用したXSS対策の基本
XSS攻撃はユーザー入力に悪意あるスクリプトを仕込み、それを他のユーザーに実行させることで情報を盗んだり画面を改ざんする攻撃です。例えば、コメント欄や検索フォームにスクリプトを埋め込まれると、レスポンス時にそのまま表示されてしまう危険があります。
フィルタを使えば、リクエストパラメータをサニタイズ(無害化)する処理を一括で行えます。例えば、<script>タグを検出してエスケープしたり、特定の危険な文字列を削除するといった方法です。
@WebFilter("/*")
public class XSSFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
XSSRequestWrapper wrappedRequest = new XSSRequestWrapper((HttpServletRequest) request);
chain.doFilter(wrappedRequest, response);
}
}
この例ではリクエストをラップして入力値をサニタイズします。こうすることで全てのリクエストに対して一貫したXSS対策を適用できます。
3. フィルタを利用したCSRF対策の基本
CSRF攻撃は、ユーザーが意図しないリクエストを外部サイトから送らされることで、アカウント操作や重要な処理が不正に実行される攻撃です。例えばログイン中の銀行アプリに不正送金リクエストを送られてしまう危険性があります。
これを防ぐ代表的な方法はトークン方式です。フォーム送信時にCSRFトークンを埋め込み、サーバー側フィルタでトークンを検証します。
@WebFilter("/*")
public class CSRFTokenFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
if ("POST".equalsIgnoreCase(req.getMethod())) {
String token = req.getParameter("csrfToken");
String sessionToken = (String) req.getSession().getAttribute("csrfToken");
if (token == null || !token.equals(sessionToken)) {
throw new ServletException("CSRF攻撃が検出されました");
}
}
chain.doFilter(request, response);
}
}
このようにフィルタでトークンを検証すれば、外部からの不正リクエストを効果的にブロックできます。
4. XSSとCSRF対策を組み合わせたセキュリティ強化
現実的なアプリケーション開発では、XSSとCSRFの両方に同時に備える必要があります。フィルタは複数チェーンとして組み合わせられるため、まず入力をサニタイズするフィルタを適用し、その後にCSRFトークンを検証するフィルタを追加するという流れを構築できます。
また、セキュリティヘッダーの追加もフィルタで実装可能です。例えば、X-Frame-OptionsやContent-Security-Policyをレスポンスに付与することでクリックジャッキングやスクリプト注入のリスクをさらに軽減できます。
5. 初心者が意識すべきJakartaEEセキュリティのポイント
初心者がJakartaEEでアプリを作るとき、つい見落としがちなのがセキュリティ対策です。入力チェックをコントローラごとに書くのは効率が悪く、抜け漏れも発生します。そこでServletフィルタを活用すれば、一箇所で共通処理を管理でき、堅牢で安全なアプリケーションを作れます。
さらに、JakartaEEのフィルタは拡張性が高いため、ログ出力、認証チェック、レスポンス圧縮などにも応用できます。そのため、セキュリティだけでなくパフォーマンスや保守性の向上にもつながります。