SecurityFilterChainの仕組みと設定方法をやさしく解説!Spring Security入門ガイド
新人
「Spring Securityを使ってみたいんですが、SecurityFilterChainって何のためにあるんですか?」
先輩
「SecurityFilterChainは、リクエストに対してセキュリティのルールをどのように適用するかを定義するクラスだよ。Spring Securityの中核的な仕組みなんだ。」
新人
「セキュリティのルールって、ログインが必要なページを決めたりとかですか?」
先輩
「そうそう。どのURLにアクセス制限をかけるか、ログインページはどれにするか、ログアウト後の遷移先などを全部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の関係
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での記述)
ここでは、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ごとにアクセス制御を設定する方法
次に、特定の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. ログインページやログアウトの設定を行う例
最後に、ログインページのカスタマイズや、ログアウト処理の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. よくある設定ミスとエラーの対処法
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. より実践的なカスタマイズ例
ここでは、もう少し実践的な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の設定
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 を理解した君なら、次のステップもスムーズに進めるはずだよ。」