Spring SecurityのSecurity Filterについて、どんなFilterがあるのか、どういった順番で登録されているのか、毎回わからなくなるので備忘録としてまとめます。 Spring Security 6.0.0 時点の情報を元に記載しています。
Security Filterとは
Spring Securityはリクエストやレスポンスに対してSecurity FilterというServletFilterを複数登録しておき、各Filterが順番に処理を行なうことで認証, 認可やCSRF対策などのセキュリティに関する機能を実現しています。
(以下の図はhttps://docs.spring.io/spring-security/reference/servlet/architecture.html#servlet-securityfilterchain から抜粋)
そのためSecurityFilterにはどんな種類のものがあるのかということに加えてその挿入順序が重要です。
Security Filterの順序は FilterOrderRegisteraion.javaというクラスで定義されています。
また、Security Filterの順序は公式ドキュメントにも記載されています。
Security Filterの一覧
以下にSecurity Filterの一覧を記載します。上から順番にSecurity Filterが実行されます。
Filter名 | 概要 |
---|---|
DisableEncodeUrlFilter | セッションIDがURLに含まれないようにするために、HttpServletResponseを利用したURLエンコードを無効にするFilter |
ForceEagerSessionCreationFilter | HttpSessionが存在しない場合、作成するFilter |
ChannelProcessingFilter | リクエストが必要なチャネル経由で配信されることを補償するためのFilter |
WebAsyncManagerIntegrationFilter | Callable上のSecurityContextに値を設定させるために、SecurityContextとWebAsyncManagerを連携させるFilter |
SecurityContextHolderFilter | SecurityContextRepositoryからSecurityContextを取得して、SecurityContextHolderにSecurityContextを設定するFilter。SecurityContextRepository.saveContextを明示的に呼び出してSecurityContextを保存する点を除いてSecurityContextPersistenceFilterと同じ。 |
SecurityContextPersistenceFilter | (非推奨) SecurityContextRepositoryから取得した情報をSecurityContextHolderに入れ、リクエストが完了しSecurityContextHolderがクリアされるとSecurityContextRepositoryに情報を戻すFilter |
HeaderWriterFilter | レスポンスにヘッダを追加するFilter。X-Frame-Option, X-XSS-Protection, X-Content-Type-Optionsエスなどブラウザの保護を有効にするヘッダを追加するのに役立つ |
CorsFilter | CORS pre-flight requestを処理し、リクエストをCorsProcessorでインターセプトし、CorsConfigurationSourceと一致したポリシーに基づいてCORSレスポンスヘッダなどのレスポンスを更新するFilter |
CsrfFilter | synchronizer token patternを利用して、CSRF に対する保護を適用するFilter |
LogoutFilter | ログアウト処理を実行するFilter。ログアウト後はLogoutSuccessHandlerで指定したURLかlogoutSuccessUrlのどちらかのURLにリダイレクトされる |
OAuth2AuthorizationRequestRedirectFilter | OAuth2.0(もしくはOIDC)の認可コードグラントを開始するFilter。条件に合致したリクエストを認可サーバの認可エンドポイントにリダイレクトさせるl。 |
Saml2WebSsoAuthenticationRequestFilter | SAML2.0 AuthnRequest を作成し、設定されたasserting partyにリダイレクトするFilter |
X509AuthenticationFilter | X509 |
AbstractPreAuthenticatedProcessingFilter | 認証前の認証リクエストを処理して本人に関する情報を抽出するためのFilter。すでに外部のシステムで認証されていることを想定されている。SecurityContextの中にすでにAuthenticationオブジェクトを含んだいる場合、デフォルトで何もしない。 |
CasAuthenticationFilter | CAS認証を行うFilter |
OAuth2LoginAuthenticationFilter | OAuth2.0 ログインを行うFilter。認可エンドポイントからのリダイレクトによって発生したリクエストを処理する。 |
Saml2WebSsoAuthenticationFilter | SAML認証を行うFilter |
UsernamePasswordAuthenticationFilter | 認証フォームを含んだリクエストを処理するFilter。認証フォームには、ユーザ名とパスワードの2つを含む必要がある。 |
DefaultLoginPageGeneratingFilter | 名前空間の設定を行う内部用Filter。利用者がログインページを設定しない場合代わりにこのフィルターが、デフォルトのログインページを返す。 |
DefaultLogoutPageGeneratingFilter | デフォルトのログアウトページを生成するFilter |
ConcurrentSessionFilter | 並行してセッションを処理するときに必要になるFilter |
DigestAuthenticationFilter | Digest認証を行うFilter。Digest認証ヘッダを処理して、その結果をSecurityContextHolderに格納する。 |
BearerTokenAuthenticationFilter | OAuth2.0 Bearer Tokenを含むリクエストを使って認証を行うFilter |
BasicAuthenticationFilter | Basic認証を行うFilter。Basic Authorizationヘッダを処理して、その結果をSecurityContextHolderに格納する。 |
RequestCacheAwareFilter | キャッシュに保存していたリクエストが現在のリクエストと一致する場合、保存していたリクエストを再構築するFilter |
SecurityContextHolderAwareRequestFilter | Servlet APIのセキュリティに関するメソッドを実装したリクエストラッパーにServletRequestを挿入するFilter |
JaasApiIntegrationFilter | JAAS(Java Authentication and Authorization Service)の Subjectを取得して、そのSubjectとしてFilterChainを実行し続けようとするFilter |
RememberMeAuthenticationFilter | RememberMe認証を行うFilter。SecurityContextにAuthenticationオブジェクトが存在しないかつ、RememberMeServiceの実装クラスが存在する場合、RememberMe認証処理を行い結果をSecurityContextに格納する |
AnonymousAuthenticationFilter | SecurityContextHolderにAuthenticationオブジェクトが存在しない場合、匿名ユーザ用のAuthenticationオブジェクトをSecurityContextに格納する。 |
OAuth2AuthorizationCodeGrantFilter | OAuth2.0 認可コードグラント用のFilter。認可エンドポイントからのリダイレクトによって発生したリクエストを処理する。 |
SessionManagementFilter | セッション管理を行うFilter。ユーザがリクエストを開始以降に認証されているかどうかを判定し、認証されている場合はsession-fixationへの対策を有効化したり、複数同時ログインのチェックなどを行う。 |
ExceptionTranslationFilter | FilterChainの中でthrowされたAccessDeniedExceptionとAuthenticationExceptionを処理するFilter。 |
FilterSecurityInterceptor | (非推奨) HTTPリソースのセキュリティハンドリングを行うFilter |
AuthorizationFilter | AuthorizationManagerを使って、URLへのアクセス制御を行うFilter |
SwitchUserFilter | ユーザのコンテキストの切り替えを行うFilter。より高い権限を持つユーザが一般ユーザに切り替えられるようにしたいといったユースケースで利用する。 |