BLOG

Spring Security Filter

April 03, 2022

logo

Spring Security Filter

일반적인 웹 환경에서 브라우저가 서버에게 요청을 보내게 되면, DispatcherServlet이 요청을 받기 이전에 많은 ServletFilter를 거치게 됩니다. Spring Security도 서블릿 필터로써 작동하여 인증, 권한과 관련한 처리를 진행하게 됩니다




SecurityContextPersistenceFilter

SecurityContextRepository를 통해 SecurityContext를 Load/Save 처리합니다.

요청이 들어오기 전에, SecurityContextRepository에서 받아온 정보를 SecurityContextHolder에 주입합니다.

LogoutFilter

로그아웃 URL(기본값: /logout)로의 요청을 감시하여 해당 사용자(principal)를 로그아웃 시킵니다.

하지만 기본 로그아웃 페이지는 LogoutFilter가 생성하는것이 아닌 DefaultLogoutPageGeneratingFilter 가 생성합니다.

LogoutFilter의 두가지 구성 요소

1.Logout handler

다른 여러 로그아웃 핸들러를 감싸는 객체

사실상 다른 여러개의 로그아웃 핸들러를 사용

기본적으로 2개의 로그아웃 핸들러가 사용

  • CsrfLogoutHandler
  • SecurityContextLogoutHandler

2.Logout Success Handler

로그아웃 처리를 하고난 뒤 어떻게 처리를 할것인지 를 결정하는 핸들러

기본 핸들러는 SimpleUrlSuccessHandler

기본으로 명시되어있는 URL로 리다이렉트

UsernamePasswordAuthenticationFilter

로그인 인증 과정을 진행하는 필터

ID/비밀번호 기반 Form 인증 요청 URL(기본값: /login)을 감시하여 사용자를 인증합니다.

사용자 인증 요청을 Authentication 인터페이스로 추상화하고, AuthenticationManager를 호출

Authentication 인터페이스에서 제공하는 핵심 메소드

Object getPrincipal()

  • 인증 아이디

Object getCredentials()

  • 인증 비밀번호

Collection<? extends GrantedAuthority> getAuthorities()

  • 인증된 사용자의 권한 목록

Object getDetails()

  • 인증된 사용자의 부가정보

DefaultLoginPageGeneratingFilter

사용자가 별도의 로그인 페이지를 구현하지 않은 경우, 스프링에서 기본적으로 설정한 로그인 페이지를 처리합니다.

시큐리티 설정파일에서 직접 로그인페이지로 갈 url 을 맵핑시켜주면 FilterChainProxy에서 빠지게 됩니다.

http.formLogin()
    .loginPage("/login")

BasicAuthenticationFilter

HTTP 요청의 (BASIC)인증 헤더를 처리하여 결과를 SecurityContextHolder에 저장합니다.

Basic 인증이란

요청 헤더에 username 과 password를 (username:password) 를 Base64 로 인코딩한 값을 실어서 보내는 것

이 필터를 이용하면, 이전에 폼요청으로 받아온 데이터로 UsernamePasswordAuthenticaton 토큰을 생성하지 않아도, 요청 헤더의 정보를 사용하여 UsernamePasswordAuthenticaton 토큰을 생성할 수 있다.

토큰이 생성된 이후의 과정은 UsernamePasswordAuthenticationFilter 의 과정과 동일하다.

RememberMeAuthenticationFilter

SecurityContext에 인증(Authentication) 객체가 있는지 확인하고, RememberMeServices를 구현한 객체의 요청이 있을 경우, Remember-Me(ex. 사용자가 바로 로그인을 하기 위해서 저장 한 아이디와 패스워드)를 인증 토큰으로 컨텍스트에 주입합니다.

SecurityContextHolderAwareRequestFilter

시큐리티 관련 서블릿 API 를 지원해주는 필터

-> 개발자가 직접 건드릴 일이 거의 업다. -> “ROLE_” prefix 붙이는 역할 등

AnonymousAuthenticationFilter

SecurityContextHolder에 인증(Authentication) 객체가 있는지 확인하고, 필요한 경우 Authentication 객체를 주입합니다.

만약 SecurityContext 에 Authentication 이 있다면 넘어가게 됩니다.

SessionManagementFilter

요청이 시작된 이후 인증된 사용자 인지 확인하고, 인증된 사용자일 경우SessionAuthenticationStrategy를 호출하여 세션 고정 보호 메커니즘을 활성화하거나 여러 동시 로그인을 확인하는 것과 같은 세션 관련 활동을 수행합니다.

주요 역할

  • 세션 변조 방지 전략을 설정
  • 유효하지 않은 세션을 Redirect 시킬 URL을 설정
  • 동시성 제어 설정
  • 세션생성전략 설정

ExceptionTranslationFilter

요청을 처리하는 중에 발생할 수 있는 예외를 위임하거나 전달 필터 체인 내에서 발생(Throw)되는 모든 예외(AccessDeniedException, AuthenticationException)를 처리합니다.

FilterSecurityInterceptor 와 연계가 강하게 되는 필터로, FilterSecurityInterceptor 가 AccessDecisionManager 를 통해 AuthenticationException 혹은 AccessDeniedException 을 발생시킨 경우 해당 Exception을 받아 AuthenticationException의 경우 AuthenticationEntryPoint 로 보내주고, AccessDeniedException 의 경우에는 AccessDeniedHandler 로 보내는 역할을 담당합니다.

FilterSecurityInterceptor

접근 권한 확인을 위해 요청을 AccessDecisionManager로 위임 이 필터가 실행되는 시점에는 사용자가 인증됐다고 판단

HTTP 리소스의 보안 처리를 수행합니다.




Reference


# spring security# spring security filter


Written by Johnie Yeo