daisuzz.log

Spring SecurityのSecurity Filterについて

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というクラスで定義されています。

github.com

また、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。より高い権限を持つユーザが一般ユーザに切り替えられるようにしたいといったユースケースで利用する。