カテゴリ: Spring 更新日: 2025/12/17

Spring SecurityのCSRF対策を完全理解!有効化・無効化の判断基準と実装方法

CSRF対策の正しい理解:有効化/無効化の判断基準と実装手順
CSRF対策の正しい理解:有効化/無効化の判断基準と実装手順

先生と生徒の会話形式で理解しよう

生徒

「Spring SecurityでCSRF対策って自動で有効なんですか?」

先生

「はい、Spring Securityでは初期設定でCSRF(クロスサイトリクエストフォージェリ)対策が有効になっています。」

生徒

「でも、開発中にPOSTリクエストが403でブロックされることがあるんですけど…」

先生

「それはCSRFトークンが含まれていないからですね。まずはCSRFの仕組みと正しい使い方を見ていきましょう。」

1. CSRF(クロスサイトリクエストフォージェリ)とは?

1. CSRF(クロスサイトリクエストフォージェリ)とは?
1. CSRF(クロスサイトリクエストフォージェリ)とは?

CSRFとは、ユーザーがログイン中のアプリケーションに対して、第三者が不正なリクエストを送信させる攻撃手法のことです。例えば、悪意のあるサイトにアクセスした際に、意図しない注文処理やアカウントの変更が実行される可能性があります。

Spring Securityではこのような攻撃を防ぐために、CSRFトークンと呼ばれるランダムな値をフォームに埋め込み、POST・PUT・DELETEなどのリクエストでトークン検証を行う仕組みが標準で提供されています。

2. Spring SecurityでのCSRF対策の基本設定

2. Spring SecurityでのCSRF対策の基本設定
2. Spring SecurityでのCSRF対策の基本設定

Spring SecurityではデフォルトでCSRF保護が有効になっているため、明示的に設定する必要はありません。しかし、SecurityFilterChainを自前で構成する場合は、CSRF設定を明示することが推奨されます。


@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http
        .csrf(csrf -> csrf.enable()) // 明示的に有効化
        .authorizeHttpRequests(auth -> auth
            .anyRequest().authenticated()
        );
    return http.build();
}

このようにcsrf.enable()を記述することで、意図的にCSRF対策を有効化していることを明示できます。

3. CSRFトークンをHTMLフォームに埋め込む方法

3. CSRFトークンをHTMLフォームに埋め込む方法
3. CSRFトークンをHTMLフォームに埋め込む方法

Spring SecurityでCSRFを有効にしている場合、フォームにCSRFトークンを含めないとエラーになります。Spring Bootで提供されるThymeleafテンプレートでは、以下のようにトークンを自動挿入できます。


<form method="post" th:action="@{/submit}">
    <input type="text" name="data" />
    <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}" />
    <button type="submit">送信</button>
</form>

HTMLを自分で記述する場合でも、CSRFトークンを必ずhiddenフィールドで送信するようにしてください。

4. CSRF対策を無効にしてもいい場面とは?

4. CSRF対策を無効にしてもいい場面とは?
4. CSRF対策を無効にしてもいい場面とは?

CSRF対策を無効化するべきケースは限定的です。たとえば、REST APIを提供しており、トークンベース(JWTなど)で認証している場合は、CSRFトークンの意味が薄れるため無効化することがあります。

また、開発中や社内システムなど、公開されない用途に限定する場合に限り、一時的にCSRF対策を無効化することもありますが、本番環境での無効化は原則推奨されません。


@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http
        .csrf(csrf -> csrf.disable()) // CSRF対策を無効化
        .authorizeHttpRequests(auth -> auth
            .anyRequest().permitAll()
        );
    return http.build();
}

5. CSRFのエラーで403が出る理由と解決方法

5. CSRFのエラーで403が出る理由と解決方法
5. CSRFのエラーで403が出る理由と解決方法

Spring SecurityでPOSTリクエスト時に403エラーが発生する主な原因は、CSRFトークンがリクエストに含まれていないことです。たとえば、JavaScriptでfetchやAjaxを使ってPOSTする際も、CSRFトークンをヘッダーに含める必要があります。

以下のように、リクエストヘッダーにCSRFトークンを追加しましょう。


fetch('/submit', {
    method: 'POST',
    headers: {
        'X-CSRF-TOKEN': csrfToken
    },
    body: JSON.stringify(data)
});

csrfTokenは事前にサーバーからHTMLまたはJSONで受け取る必要があります。

6. Spring SecurityでのCSRFトークンのカスタマイズ

6. Spring SecurityでのCSRFトークンのカスタマイズ
6. Spring SecurityでのCSRFトークンのカスタマイズ

CSRFトークンの生成や保持の仕組みを独自に制御したい場合は、CsrfTokenRepositoryを実装または設定することで柔軟なカスタマイズが可能です。デフォルトではセッションに保存されますが、Cookieに保存することもできます。


@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http
        .csrf(csrf -> csrf
            .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
        );
    return http.build();
}

CookieでCSRFトークンを保持することで、JavaScriptからも参照できるようになります。ただし、セキュリティには注意が必要です。

7. CSRF対策の効果的な運用ポイント

7. CSRF対策の効果的な運用ポイント
7. CSRF対策の効果的な運用ポイント

CSRF対策を適切に運用するには、トークンの自動挿入と検証だけでなく、以下のポイントも大切です。

  • ログイン後の全てのPOST/PUT/DELETEリクエストにCSRFトークンを付与する
  • ログイン状態を維持するセッションの管理を適切に行う
  • API設計時は、必要に応じてCSRF対策をオフにし、トークンベース認証を採用する

CSRF対策はフォームログインにおけるセキュリティの基盤とも言える重要な設定です。安易に無効化せず、どの場面で必要かを正しく理解することが求められます。

まとめ

まとめ
まとめ

Spring SecurityにおけるCSRF対策の重要なポイント振り返り

ここまで、Spring SecurityにおけるCSRF対策について、基本的な仕組みから実装方法、無効化の判断基準、そして運用時の注意点までを段階的に理解してきました。CSRFは、ログイン状態を悪用した非常に現実的な攻撃手法であり、Webアプリケーションを開発するうえで避けて通れないセキュリティ課題です。

Spring Securityでは、CSRF対策が初期設定で有効化されているため、特別な設定を行わなくても一定の安全性が確保されています。しかし、その仕組みを正しく理解していないと、POSTリクエスト時に403エラーが発生したり、意図せずCSRF対策を無効化してしまったりするケースも少なくありません。

CSRFトークンとフォーム・JavaScript連携の理解

記事の中で確認した通り、CSRF対策の中核となるのがCSRFトークンです。HTMLフォームを使う場合は、hiddenフィールドとしてトークンを埋め込む必要があり、Thymeleafを利用している場合は、テンプレート機能によって安全かつ簡潔に実装できます。この仕組みにより、ユーザー本人が意図したリクエストであることをサーバー側で検証できます。

また、JavaScriptのfetchやAjax通信を利用する場合でも、CSRFトークンの送信は必須です。ヘッダーにトークンを含めることで、Spring Securityのフィルターが正しく検証を行い、不正なリクエストを防止できます。フロントエンドとバックエンドの連携を意識した設計が、CSRF対策では特に重要になります。

CSRF対策を無効化する際の判断基準

CSRF対策は常に有効にしておくべき、というわけではありません。JWTなどのトークンベース認証を採用したREST APIでは、そもそもセッションを利用しないため、CSRF攻撃の前提条件が成立しないケースもあります。そのような場合に限り、CSRF対策を無効化する選択肢が出てきます。

ただし、無効化の判断は慎重に行う必要があります。開発中の利便性だけを理由にCSRFを無効にしてしまうと、本番環境で重大なセキュリティリスクを抱えることになりかねません。アプリケーションの構成、認証方式、公開範囲を総合的に考慮したうえで判断することが重要です。

CSRF設定を明示することの意味

記事中でも触れたように、SecurityFilterChainでCSRF設定を明示的に記述することは、可読性と保守性の観点から非常に有効です。設定を読むだけで、CSRF対策が有効なのか無効なのかが一目で分かり、チーム開発においても意図の共有がしやすくなります。


http
    .csrf(csrf -> csrf.enable())
    .authorizeHttpRequests(auth -> auth.anyRequest().authenticated());

このような明示的な記述は、後からコードを見直した際の理解を助け、セキュリティ事故を未然に防ぐ効果も期待できます。

先生と生徒の振り返り会話

生徒

「CSRFって、ただ設定をオンにするだけじゃなくて、仕組みを理解することが大事なんですね。」

先生

「その通りです。なぜCSRFトークンが必要なのかを理解していれば、403エラーが出たときも落ち着いて対処できます。」

生徒

「フォームやJavaScriptでトークンを送る理由も、ちゃんと意味があると分かりました。」

先生

「CSRF対策は、Spring Securityを使ったWebアプリケーション開発の基礎です。無効化する場合も、その影響を理解したうえで判断することが大切ですよ。」

生徒

「これからは、セキュリティ設定をなんとなく変更するのではなく、理由を説明できるように意識します。」

先生

「それができれば、Spring Securityを正しく使いこなせている証拠ですね。」

Springの学習を効率化したい方へ

この記事の内容をもっと深く知るには、以下の入門書が最適です。

Spring Framework超入門をAmazonで見る
カテゴリの一覧へ
新着記事
New1
Spring
SpringDataJPAのJPAクエリメソッド「NotLike」の使い方を完全ガイド!初心者向け解説
更新記事
New2
Spring
SpringDataJPAのJPAクエリメソッド「Like」の使い方を完全ガイド!初心者向け解説
更新記事
New3
Java
JavaのLocalDateTimeクラスとplusMinutesメソッドを完全ガイド!初心者でもわかる分単位の時間操作
新規投稿
New4
Spring
SpringDataJPAのJPAクエリメソッド「IsNotNull」と「NotNull」の使い方を完全ガイド!初心者向け解説
更新記事
人気記事
No.1
Java&Spring記事人気No1
Spring
Spring BootとJavaの互換性一覧!3.5/3.4/3.3はJava 21・17に対応してる?
No.2
Java&Spring記事人気No2
Java
JavaのBooleanクラスの使い方を完全ガイド!初心者でもわかる真偽値の操作
No.3
Java&Spring記事人気No3
JSP
JSPの基本タグ一覧と使い方まとめ!実務で使えるタグを紹介
No.4
Java&Spring記事人気No4
Java
JavaのIOExceptionクラス徹底解説!初心者向けファイル入出力エラー対策ガイド
No.5
Java&Spring記事人気No5
JSP
JSPでif文・for文を使う方法!初心者でもわかるJavaとの違いと使い方
No.6
Java&Spring記事人気No6
Spring
SpringのBindingResultを完全ガイド!初心者でもわかる入力チェックとエラー処理
No.7
Java&Spring記事人気No7
Spring
SpringのModelクラスとaddAttributeメソッドの使い方を完全ガイド!初心者でも安心
No.8
Java&Spring記事人気No8
Spring
SpringDataJPAのJPAクエリメソッド「EndingWith」の使い方を完全ガイド!初心者向け解説