본문 바로가기

개발중/Spring Security

[스프링 시큐리티] - 필터 체인

728x90
반응형

 

스프링 시큐리티 필터 체인에 대해 알아보기


 

 WebAsyncManagerIntegrationFilter

 

이 필터는 SecurityContext 와 비동기 요청 처리를 위한

핵심 클래스인 스프링 웹의 WebAsyncManager 간의 통합을 제공한다.

 


 

 SecurityContextPersistenceFilter

 

요청이 도달하는 다음 필터는 SecurityContextPersistenceFilter 이다.

이 필터는 스프링 시큐리티가 정상적으로 동작하기 위해 필터 체인에 꼭 존재해야 하는 필터 체인 중 하나이다.

요청이 들어올 때 이 필터가 SecurityContextPersistenceFilter에서 SecurityContext 를 로딩해서 설정한다.

 

SecurityContext 가 로드되고 나면 SecurityHolder.getContext() 로 SecurityContext 에 접근이 가능하다. 

 

반면에 여러 요청 간에 발생하는 SecurityContext 에 대한 모든 변경 사항이 영구적으로 저장될 수 있도록

요청이 이 필터를 통해 나가면 SecurityContext 는 SecurityContextRepository 로 다시 업데이트 된다.

이 필터는 또한 다른 사용자로부터 온 요청으로의 시큐리티 컨텍스트의 유출을 방지하기 위해

SecurityContextHolder 를 지운다.

 


 

 HeaderWriterFilter

 

이 필터는 현재 요청에 대한 응답을 헤더에 추가한다.

예를 들어 브라우저를 보호할 수 있도록 X-Frame-Options, X-XSS-Protection, X-Content-Type-Options 와

같은 헤더에 추가한다.

 


 

 LogoutFilter

 

이 필터는 인증된 사용자를 로그아웃 시킨다.

기본적으로 로그아웃을 처리하는 URL 은 /logout 이다.

따라서 이 필터는 요청이 해당 경로로 왔을 때만 로그아웃 절차를 실행한다.

로그아웃을 처리하는 URL 은

SecurityConfiguration 에서 활용할 수 있는 HttpSession 에서 활용할 수 있는 HttpSecurity 로 설정이 가능하다.

 


 

 UsernamePasswordAuthenticationFilter 

 

UsernamePasswordAuthenticationFilter 는 인증이 시작되는 곳이다.

이 필터는 ProviderManager 인스턴스에 대한 참조를 가진다.

 

ProviderManager 는 AuthenticationManager 인터페이스의 구현체다.

ProviderManager 는 실제 인증을 수행하기 위해 활용되는 AuthenticationProvider 의 리스트를 가진다.

 

가장 널리 사용되는 인증 제공자는 DaoAuthenticationProvider 이다. DaoAuthenticationProvider 는 UserDetailsService 로 데이터베이스에서 같은 사용자 명을 갖는 UserDetails 을 로드한다.

 

그 다음 DaoAuthenticationProvider 는 요청으로 받은 비밀번호가 UserDetails 에 있는 비밀번호와 일치하는지 검사한다.

일치하면 인증은 성공하고 그렇지 않으면 실패한다.

 

인증이 성공하면 UsernamePasswordAuthenticationFilter 는 SecurityContext 를 업데이트 한다.

그리고 사용자를 인증된 것으로 여긴다.

 

AuthenticationSuccessHandlert 가 요청에 대한 주도권을 가지며 사용자는 기본 성공 URL 로 리다이렉트 한다.

 

인증이 실패하면 SecurityContextHolder 는 지워지며 AuthenticationFailureHandler 가 요청에 대한 주도권을 가진다.

 

기본으로 사용자는 /login?failed 로 리다이렉트 된다.

UsernamePasswordAuthenticationFilter 는 어떤 요청에도 인증 프로세스를 시작하지 않는다.

 

UsernamePasswordAuthenticationFilter 는 HTTP POST 메소드로 /login 경로로

전송된 요청을 위해서만 인증 프로세서를 시작한다.

 


 

 RequestCacheAwareFilter

 

이 필터는 이전에 캐시된 요청을 복원한다.

이전에 캐시된 요청은 대게 실패할 때 ExceptionTranslationFilter 에 의해 저장된다.

 

예를 들어 하나의 인증된 요청이 보호되는 리소스에 접근하기 위해 전송 됐을 때 스프링 시큐리티는 이 요청을 차단한다.

 

그리고 사용자를 로그인 페이지로 보낸다.

 

인증이 성공한 후에 사용자는 다시 리다이렉트돼서 보호 리소스로 온다.

스프링 시큐리티는 캐시된 요청을 확인해서 인증 후 사용자가 어디로 가야 하는지 알 수 있다.

 


 

 SecurityContextHolderAwareRequestFilter

 

이 필터는 다음과 같은 서블릿 API 보안 메소드를 구현한 래퍼 (wrapper) 를 활용하는 요청에 대한 책임이 있다.

 

- HttpServleRequest.authenticate( HttpServleResponse )

- HttpServleRequest.login( String, String )

- HttpServleRequest.logout( )

 

TaskAgile 에서는 이 API 를 사용하지 않는다.

 


 

 AnonymousAuthenticationFilter

 

이 필터는 SecurityContext 에 어떤 Authebtication 도 존재하지 않으면

SecurityContext 를 AnonymousAuthenticationFilter 으로 업데이트 한다.

 

이 필터는 익명 사용자에 대해서 실제로 인증을 수행하지는 않는다.

이 필터는 요청이 익명 사용자로부터 온 것임을 확실하게 하기 위해 플레이스홀더 인증을 SecurityContext 에 저장한다.

 


 

 SessionManagementFilter

 

이 필터는 세션 고정 보호를 활성화하는 책임과 동시 세션( concurrent session )을 컨트롤 하는 책임이 있다.

 

동시 세션은 ConcurrebtSessionFilter 가 필터 체인에 있어야 한다.

HttpSecurity 가 제공하는 다음 설정으로 동시 세션 관리를 활성화할 수 있다.

기본적으로 세션 수에 제한은 없다.

 

http.sessionManagement().maximumSession(n);

 


 

 ExceptionTranslationFilter

 

필터 체인의 마지막에서 두번째 필터다.

이름이 말해주듯이 이 필터는 스프링 시큐리티의 예외를 해석하는 책임이 있다.

 

AuthenticationException 예외가 잡히면 이 필터는 인증 엔드 포인트를 시작한다.

AccessDeniedException 예외가 잡히고 사용자가 익명일지라도 이 필터는 인증 엔드 포인트를 시작한다.

사용자가 익명이 아니면 AccessDefindHandler 는 기본적으로 HTTP 403 응답을 전송한다.

 


 

▶ FilterSecurityInterceptor

 

필터 체인의 마지막 필터는 FilterSecurityInterceptor 이다. 

FilterSecurityInterceptor는 AccessDecisionManager 에 대한 참조를 가진다.

이 필터는 SecurityContext 를 가져온다.

 

그다음 허용된 요청인지 결정하는 작업을 AccessDecisionManager 에게 위임한다.

그리고 요청이 거부되면 예외를 발생 시킨다.

 

요청이 허용되면 요청은 대응하는 Controller 에 도달한다.

AccessDecisionManager 가 내리는 결정은 투표에 기반한다.

 

여기서 결정은 요청 단위다.

 

이것은 스프링 시큐리티가 요청의 경로를 HttpSecurity 의 설정과 비교하여 확인하고

SecurityContext 에 있는 부여된 권한이 접근을 허용하지에 충분한지 확인한다는 의미다.

 


 

특정 기능을 활성화 해서 필터 체인에 추가할 수 있는 다른 많은 내장 필터도 존재 한다.

 


 

728x90
반응형