カテゴリ: Spring認証(Spring Security) 更新日: 2025/12/04

SecurityFilterChainの仕組みと設定方法をやさしく解説!Spring Security入門ガイド

SecurityFilterChainの仕組みと設定方法
SecurityFilterChainの仕組みと設定方法

新人と先輩の会話形式で理解しよう

新人

「Spring Securityを使ってみたいんですが、SecurityFilterChainって何のためにあるんですか?」

先輩

「SecurityFilterChainは、リクエストに対してセキュリティのルールをどのように適用するかを定義するクラスだよ。Spring Securityの中核的な仕組みなんだ。」

新人

「セキュリティのルールって、ログインが必要なページを決めたりとかですか?」

先輩

「そうそう。どのURLにアクセス制限をかけるか、ログインページはどれにするか、ログアウト後の遷移先などを全部SecurityFilterChainで指定できるんだ。これから詳しく見ていこう!」

1. SecurityFilterChainとは何か

1. SecurityFilterChainとは何か
1. SecurityFilterChainとは何か

SecurityFilterChainは、Spring Securityでリクエストごとのセキュリティ処理を制御するための設定クラスです。簡単に言うと、どのURLにどのセキュリティルールを適用するかを記述する場所です。

Spring Securityは内部で複数のフィルターを持っており、HTTPリクエストを受け取ると、まずそれらのフィルターが順番に実行されます。例えば、認証フィルター、認可フィルター、CSRF対策フィルターなどがあります。

SecurityFilterChainは、それらのフィルターの適用ルールをまとめて定義する役割を持っており、基本的には@BeanとしてSpringコンテナに登録します。


@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .anyRequest().authenticated()
            )
            .formLogin();
        return http.build();
    }
}

このように記述することで、全てのリクエストに対してログインが必要となり、ログインページが自動で生成されます。

2. Spring BootとSecurityFilterChainの関係

2. Spring BootとSecurityFilterChainの関係
2. Spring BootとSecurityFilterChainの関係

Spring Bootでは、Spring Securityの依存関係を追加するだけで、SecurityFilterChainが自動構成され、セキュリティが有効になります。つまり、開発者が自分で設定を書かなくても、初期状態ではフィルターが動作するようになっています。

実際には、Spring Bootの中でSecurityAutoConfigurationクラスが内部的にSecurityFilterChainのBeanを用意してくれています。このおかげで、デフォルトのログイン画面や認証機能がすぐに使える状態になります。

たとえば、PleiadesでSpring Bootの新規プロジェクトを作成するときに、「Spring Security」にチェックを入れると、Gradleの依存関係に次のような記述が追加されます。


dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-security'
}

この状態でアプリケーションを起動して、http://localhost:8080にアクセスすると、ログイン画面が表示されます。


http://localhost:8080

このログイン機能は、Spring BootがSecurityFilterChainを自動で構成していることによって動作しています。

ただし、開発が進むと「特定のURLだけ公開したい」「ログイン後の遷移先を変えたい」といった要望が出てくるため、手動でSecurityFilterChainを定義してカスタマイズする必要が出てきます。

このように、Spring Bootは初心者にもやさしく、自動でセキュリティ設定を整えてくれますが、本格的なアプリケーション開発ではSecurityConfigクラスを作って制御していくのが一般的です。

3. SecurityFilterChainの基本的な書き方(JavaConfigでの記述)

3. SecurityFilterChainの基本的な書き方(JavaConfigでの記述)
3. SecurityFilterChainの基本的な書き方(JavaConfigでの記述)

ここでは、SecurityFilterChainを使ってSpring Securityの設定を手動で行う方法を紹介します。自動設定だけでは対応できない細かな制御を、自分で記述して実現するためには設定クラスを作成します。

まずは、すべてのリクエストを認証付きにするだけのシンプルな設定です。Pleiadesで作成したSpring Bootプロジェクト内に、SecurityConfigクラスを作成しましょう。


@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .anyRequest().authenticated()
            )
            .formLogin();
        return http.build();
    }
}

この設定では、すべてのURLに対してログインが必要となり、Spring Securityのデフォルトログイン画面が表示されるようになります。

4. URLごとにアクセス制御を設定する方法

4. URLごとにアクセス制御を設定する方法
4. URLごとにアクセス制御を設定する方法

次に、特定のURLだけを公開し、それ以外のページはログイン必須にする方法を紹介します。たとえば、"/login""/public"のようなURLには誰でもアクセスできるようにし、それ以外は認証が必要とする場合の設定は以下のようになります。


@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/login", "/public").permitAll()
                .anyRequest().authenticated()
            )
            .formLogin();
        return http.build();
    }
}

このようにrequestMatchers().permitAll()を使うことで、公開URLを明示的に指定することができます。指定されなかったURLはすべてauthenticated()により、ログインが必要になります。

5. ログインページやログアウトの設定を行う例

5. ログインページやログアウトの設定を行う例
5. ログインページやログアウトの設定を行う例

最後に、ログインページのカスタマイズや、ログアウト処理のURL設定を行う方法を紹介します。ログインページを独自のパスにしたい場合や、ログアウト後のリダイレクト先を設定したい場合に有効です。


@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/login", "/public").permitAll()
                .anyRequest().authenticated()
            )
            .formLogin(form -> form
                .loginPage("/login")
                .defaultSuccessUrl("/home", true)
                .permitAll()
            )
            .logout(logout -> logout
                .logoutUrl("/logout")
                .logoutSuccessUrl("/login?logout")
                .permitAll()
            );

        return http.build();
    }
}

この設定では、次のような制御が行われます。

  • /login をログイン画面として使用
  • ログイン成功時は /home にリダイレクト
  • /logout にアクセスするとログアウトされ、 /login?logout に遷移

これらの指定を行うことで、自分のアプリケーションに合った認証フローを実装することができます。画面遷移やユーザー体験を整えるためにも、これらのカスタマイズは非常に重要です。

6. よくある設定ミスとエラーの対処法

6. よくある設定ミスとエラーの対処法
6. よくある設定ミスとエラーの対処法

Spring SecurityのSecurityFilterChainを使って設定を記述する際、初心者がつまずきやすいポイントがいくつかあります。ここでは、よくある設定ミスとその対処方法を紹介します。

まず多いのが、formLogin()やauthorizeHttpRequests()を設定し忘れるケースです。これを忘れると、すべてのリクエストがブロックされてしまいます。

また、permitAll()の指定を間違えてしまうと、ログインページにすらアクセスできずにループしてしまうことがあります。


http
    .authorizeHttpRequests(auth -> auth
        .requestMatchers("/login").permitAll()
        .anyRequest().authenticated()
    )
    .formLogin();

このように、最低限/loginに対してpermitAll()を指定することで、ログイン画面にアクセスできるようになります。

さらに、formLogin()の設定をしないままログインページのURLだけ指定すると、Spring Securityが自動でログイン画面を用意しなくなるため、404エラーになります。これを防ぐためには、明示的に.formLogin()を設定しましょう。

7. より実践的なカスタマイズ例

7. より実践的なカスタマイズ例
7. より実践的なカスタマイズ例

ここでは、もう少し実践的なSecurityFilterChainのカスタマイズ例を紹介します。たとえば、ログイン後にユーザーのロールによってリダイレクト先を変えたり、アクセス拒否されたときのエラーページを設定する方法があります。

以下は、アクセス拒否時に独自のエラーページを表示する例です。


http
    .authorizeHttpRequests(auth -> auth
        .requestMatchers("/admin").hasRole("ADMIN")
        .anyRequest().authenticated()
    )
    .formLogin(form -> form
        .loginPage("/login")
        .defaultSuccessUrl("/home", true)
    )
    .exceptionHandling(exception -> exception
        .accessDeniedPage("/error/403")
    );

このようにすることで、管理者でないユーザーが/adminにアクセスしようとすると、/error/403にリダイレクトされます。

さらに、ログイン成功後の遷移先を動的に制御したい場合は、AuthenticationSuccessHandlerを利用することもできます。詳細な条件分岐を行いたい場合に便利です。


@Bean
public AuthenticationSuccessHandler customSuccessHandler() {
    return new SavedRequestAwareAuthenticationSuccessHandler();
}

http
    .formLogin(form -> form
        .loginPage("/login")
        .successHandler(customSuccessHandler())
    );

このような方法を使うことで、実践的で柔軟な認証処理が可能になります。

8. 今後のステップアップとして学ぶべきSpring Securityの設定

8. 今後のステップアップとして学ぶべきSpring Securityの設定
8. 今後のステップアップとして学ぶべきSpring Securityの設定

SecurityFilterChainを使った基本的なカスタマイズができるようになったら、次のステップとして以下のようなSpring Securityの設定を学んでいくのがおすすめです。

  • ユーザー情報のカスタマイズ(データベースと連携するUserDetailsServiceの実装)
  • パスワードの暗号化(BCryptPasswordEncoderの使い方)
  • ロールによるアクセス制御(hasRoleやhasAuthorityの活用)
  • セッション管理(同時ログイン数の制限やセッションタイムアウト)
  • CSRF対策の有効化と無効化

これらを段階的に学ぶことで、より安全で本格的なWebアプリケーションを構築できるようになります。最初は難しく感じるかもしれませんが、今回学んだSecurityFilterChainの設定をベースに、少しずつ理解を深めていきましょう。

Spring Securityはとても強力で拡張性の高いフレームワークです。しっかりと設定を理解することで、安心して開発に取り組むことができるようになります。

まとめ

まとめ
まとめ

SecurityFilterChain の役割と設定内容を総整理しよう

この記事では、Spring Security の中心的な仕組みである SecurityFilterChain の役割、動作の流れ、そして実際の設定方法についてくわしく学びました。SecurityFilterChain は、アプリケーションに届く HTTP リクエストに対して「どのようなセキュリティルールを適用するか」を定義する重要な構成要素であり、アクセス制御やログイン設定、ログアウト処理など、あらゆる認証・認可に関する振る舞いを統合的に管理してくれます。

Spring Boot の特徴として、starter-security を追加するだけで自動的に SecurityFilterChain が構成され、デフォルトのログイン画面や基本的なセキュリティ機能が利用可能になります。この自動構成のおかげで初心者でもすぐに安全なアプリケーション開発を体験できますが、本格的な開発では「特定の URL だけ認証不要にしたい」「ログイン成功後の画面を変更したい」「API 用にセキュリティを別管理したい」など、柔軟な設定が求められます。そのカスタマイズこそが、SecurityFilterChain を理解する最大の価値といえるでしょう。

SecurityFilterChain 設定例を振り返りながら理解を深める

記事で紹介した基本構成に加えて、より実践的な設定の例を以下に示します。URL ごとにアクセス制御を行ったり、ログインページを自作の画面に変更したり、ログアウト後の遷移先を制御したりといった典型的な設定をまとめています。


@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/", "/public/**").permitAll() // 公開ページ
                .requestMatchers("/admin/**").hasRole("ADMIN")   // 管理者専用
                .anyRequest().authenticated()                   // その他はログイン必須
            )
            .formLogin(login -> login
                .loginPage("/login")           // カスタムログインページ
                .defaultSuccessUrl("/home")     // ログイン後の遷移先
                .permitAll()
            )
            .logout(logout -> logout
                .logoutUrl("/logout")
                .logoutSuccessUrl("/login?logout") // ログアウト後に表示する画面
            );

        return http.build();
    }
}

このように SecurityFilterChain の設定は柔軟で、URLパターンごとのアクセス制御ログインページの変更ログイン後の遷移先権限別制御ログアウト処理 といった実務で頻繁に必要となるすべての動作をひとまとめに記述できます。アプリケーション開発が進むほど、SecurityFilterChain の理解は安全な Web アプリケーションの設計に欠かせない知識になります。

SecurityFilterChain とフィルターの流れを理解する重要性

Spring Security は内部で多数のフィルターを持ち、認証、認可、セッション管理、CSRF対策などを段階的に処理しています。SecurityFilterChain はこれらフィルターをどのように動作させるかを定義する重要な役割を持ちます。これを理解することで「なぜログインが必要なのか」「なぜアクセスが拒否されるのか」「どうしてリダイレクトされるのか」といった疑問にも自然と答えが見えてきます。

また、複数の SecurityFilterChain を登録することも可能で、API用チェーンとWeb用チェーンを分けるといった高度な設計もできます。これにより REST API、管理画面、ユーザー画面など異なる特性を持つルートごとに最適なセキュリティ設定を行うことができ、柔軟性の高い構成を実現できます。

実務でも役立つ SecurityFilterChain の応用ポイント

SecurityFilterChain の応用により、多言語アプリケーションや複数の認証方式を組み合わせるシステム、SNSログインとの統合など、多様なセキュリティ要件に対応できます。また、カスタムフィルターを追加すればログ記録、トークン検証、ヘッダー付与など、独自の処理も組み込めます。

開発初心者のうちは複雑に感じやすい部分ですが、実際に設定を書いてみると「このURLは許可」「このURLは管理者だけ」「ログインページはこちら」といった明確なロジックが見えるようになり、セキュリティ設計の理解が格段に深まります。

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

生徒:「SecurityFilterChain の設定がこんなに重要だって初めて知りました!」

先生:「そうだね。URLごとのアクセス制限やログインの流れは全部ここで制御するから、とても大切なんだよ。」

生徒:「設定内容を見ると、ログインページや遷移先も自由に変更できるんですね。」

先生:「その通り。Spring Security は柔軟だから、アプリの要件に合わせて細かく調整できるんだ。」

生徒:「もっと複雑なアクセス制御や API 用のセキュリティも試してみたいです!」

先生:「ぜひ挑戦してみよう。SecurityFilterChain を理解した君なら、次のステップもスムーズに進めるはずだよ。」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

SecurityFilterChainとは何ですか?初心者向けにわかりやすく教えてください

SecurityFilterChainとは、Spring Securityにおいてリクエストごとにどんなセキュリティルールを適用するかを定義する仕組みで、アクセス制御や認証の設定を記述する重要なクラスです。
コメント
コメント投稿は、ログインしてください

まだ口コミはありません。

カテゴリの一覧へ
新着記事
New1
Springの基本
Spring Bootの@ConfigurationPropertiesScanとは?設定クラス自動検出の仕組みを解説
New2
SpringのAPI開発(REST & GraphQL)
Spring Boot GraphQLでResolverを理解しよう!初心者でもわかるデータ取得の基本
New3
SpringのAPI開発(REST & GraphQL)
Spring Boot GraphQL入門!Query・Mutation・Subscriptionの基本を初心者向けに解説
New4
SpringのDB操作
JPQLのパラメータバインド(:name / ?1)の使い方を完全解説!初心者でも迷わない基本の考え方
人気記事
No.1
Java&Spring記事人気No1
Thymeleaf
Thymeleaf とは?初心者向けにThymeleafの基本を徹底解説
No.2
Java&Spring記事人気No2
SpringのWeb開発(Spring MVC)
DispatcherServletの仕組みを理解する!初心者向け完全ガイド
No.3
Java&Spring記事人気No3
Springの基本
Spring Bootのデフォルトログ設定を徹底解説(Logback / SLF4J)
No.4
Java&Spring記事人気No4
SpringのDB操作
JPAの標準クエリメソッド(findById, findAll)を完全解説!初心者でもわかるデータ取得の基本
No.5
Java&Spring記事人気No5
SpringのWeb開発(Spring MVC)
Spring Bootでの@GetMappingと@PostMappingの基本を完全解説!初心者でも理解できる使い方
No.6
Java&Spring記事人気No6
Spring認証(Spring Security)
セッション管理の基本(@SessionAttributes)を完全解説!初心者でもわかるセッションの仕組み
No.7
Java&Spring記事人気No7
SpringのWeb開発(Spring MVC)
@Controller と @RestController の違いを完全解説!初心者向けSpring MVC入門
No.8
Java&Spring記事人気No8
SpringのWeb開発(Spring MVC)
ループ処理(th:each)の基本を完全ガイド!Thymeafの繰り返し処理の使い方