🛡️

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]

処理の流れ(典型的なリクエストのライフサイクル)

  1. 受け取り: ブラウザからの HTTP リクエストを受ける
  2. ハンドラ探索: HandlerMapping を使って、どの @Controller / @RequestMapping に対応させるか決定
  3. 実行: HandlerAdapter を通して、Controller のメソッドを呼び出す
  4. 結果処理: Controller から返ってきた ModelAndView を使い、ViewResolver が JSP, Thymeleaf, JSON など適切な View を選択
  5. レスポンス返却: 選ばれた 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をつければ良い。

認証を行うFilter

Discussion