Spring Securityについての学習備忘録
0. はじめに
この記事は、駆け出しバックエンドエンジニアによる学習記録です。
初学で調べたことをまとめたものなので、多少間違った説明もあるかもしれません。ご了承くださいmm
1. Spring Securityとは?
Spring Securityとは、認証と認可を主としたセキュリティ周りの機能。
認証と認可の違い
認証(Authentication)
認証は、アプリケーションを使用する「相手」を特定する行為。
ここで言う「相手」とは、ユーザーや外部システムのことを指す。
確認する手段としては、パスワードを使用したり、生体認証を使用するなど様々なものがある。
また、相手のことを「Principal」とも呼ぶ。
Spring Securityでは、様々な認証の手段を提供している。
- ログイン画面で認証するForm認証
- HTTP標準のBasic認証
- シングルサインオンが可能なOAuth2.0
など
認可(Authorization)
認可は、認証した相手がアクセスするリソース(データや操作を指す)に対して、アクセスの可否を制御する行為。
相手が持っている権限とリソースに設定されている条件を比較し、アクセスの可否を判断する。
権限のことを「Authority」と呼ぶ。
また、来たような言葉で「Role」と言う言葉を使うこともある。
Spring Securityでは、代表的なものとして3種類ある。
- リクエストの認可
- ブラウザからのリクエストに対して、アクセスの可否を判断する。
- メソッドの認可
- 呼び出されるメソッドに対して、呼び出しの可否を判断する。
- 画面表示の認可
- 画面の中の特定の箇所を、ログイン中のユーザーの権限に応じて表示したり非表示にしたりする判断をする。
2. Spring SecurityのFilter
Spring Securityは、Servlet Securityの仕組みを使って、様々な処理を挟み込んでいる。
Spring MVCは、裏ではDispacherServletと呼ばれるServletが動いているため、DispacherServletオブジェクトに処理が行き着く前にServlet Filterを使って処理が挟み込まれることになる。

引用元: プロになるためのSPRING入門
DispacherServletとは
役割
Spring MVC アプリで HTTP リクエストが来ると、最初に受け取るのが DispatcherServlet。
その後、リクエストを適切なハンドラ(=Controllerのメソッドなど)に振り分けて、処理結果をレスポンスとして返す。
[Client] --> [DispatcherServlet] --> [HandlerMapping] --> [Controller]
--> [ViewResolver] --> [View]
処理の流れ(典型的なリクエストのライフサイクル)
- 受け取り: ブラウザからの HTTP リクエストを受ける
- ハンドラ探索: HandlerMapping を使って、どの @Controller / @RequestMapping に対応させるか決定
- 実行: HandlerAdapter を通して、Controller のメソッドを呼び出す
- 結果処理: Controller から返ってきた ModelAndView を使い、ViewResolver が JSP, Thymeleaf, JSON など適切な View を選択
- レスポンス返却: 選ばれた View が HTML や JSON にレンダリングされ、HTTP レスポンスとしてクライアントへ返る
なぜ必要か?
- 共通の入り口を用意して、すべてのリクエスト処理の流れを統一するため
- フィルタリング・ロギング・エラーハンドリングなどを一元管理できる
- 開発者は「コントローラに書く処理」に集中できる(ルーティングや View 選択はフレームワークが担当)
また、Spring SecurityのFilterは役割毎の複数のFilterから構成されており、それらを順番に処理を行なっていく。
このFilterのつながりのことをSecurity Filter Chainと呼ぶ。

Security Filter Chainの代表的なFilterとして、以下のようなものがある。
- 認証を行うFilter
- リクエストの認可を行うFilter
- 例外をハンドリングするFilter
3. Security Filter Chainのコンフィグレーション
Spring Securityを使用する際は、Security Filter Chainをコンフィグレーションする必要がある。
@Configuration
@EnableWebSecurity
public class SecurityConfig {
任意の名前でクラスを作成し、JavaConfigクラスにするため@Configurationをつける。
また@EnableWebSecurityをつけることでSecurity Filter Chainが用意される。
Spring Boot 3 + Spring Security 6 なら、実際のところ、
@EnableWebSecurityは基本いらない。
メソッド単位(@PreAuthorize 等)の認可を有効化する場合は、@EnableMethodSecurityをつければ良い。
Discussion