본문 바로가기

SpringSecurity

SpringSecurity(위임필터 초기화)

반응형

https://www.inflearn.com/course/%EC%BD%94%EC%96%B4-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8B%9C%ED%81%90%EB%A6%AC%ED%8B%B0

DelegatingFilterProxy이클래스는 서블릿Fiter이다 스프링에서 관리하는 필터가 아니다 그래서  DelegatingFilterProxy 사용자에게 전달받은 데이터를 스프링이 관리하는 빈에 전달해주는 역할을 한다 이후에  스프링 시큐리티는 필터기반으로 요청에 대한 보안처리를 하게된다.

 

1. 서블릿 필터는 스프링에서 정의된 빈을 주입해서 사용할수 없음

2. 특정한 이름을 가진 스프링 빈을 찾아 그 빈에게 요청을 위임

  • SpringSecurityFIlterChain 이름으로 생성된 빈을 ApplicaitonContext 에서 찾아 요청을 위임
  • 실제 보안처리를 하지 않는다

https://www.inflearn.com/course/%EC%BD%94%EC%96%B4-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8B%9C%ED%81%90%EB%A6%AC%ED%8B%B0

 

1.springSecurityFilterChain 의 이름으로 생성되는 되는데 실제로 스프링 시큐리티가 초기화 될때 생성된다.

 

2.DelegatingFilterProxy 으로 부터 요청을 위임 받고 실제 보안처리하는 클래스

 

3.스프링 시큐리티 초기화 시 생성돠는 필터들을 관리하고 제어

  • 스프링 시큐리티가 기본적으로 생성하는 필터
  • 설정 클래스에서 api추가시 생성되는 필터

4.사용자의 요청을 필터 순서대로 호출하여 전달

(필터하나를 호출하고 성공하면 다시 DelegatingFilterProxy 호출 하고 다시 DelegatingFilterProxy 필터를 호출 -> 최종적으로 Servlet을 접근하게된다)

 

5.사용자정의 필터를 생성해서 기존의 필터 전,후로 추가 기능

  • 필터의 순서를 잘 정의

6.마지막 필터까지 인증 및 인가 예외가 발생하지 않으면 통과

 

https://www.inflearn.com/course/%EC%BD%94%EC%96%B4-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8B%9C%ED%81%90%EB%A6%AC%ED%8B%B0

사용자가 처음 요청을 하게 되면 Filter 에서 가장 먼저 요청을 받고 처리를 한다. DelegatingFilterProxy 이클래스가 요청을 받게 되면 자기가 전달받은 요청객체를 SpringSecurityFilterChain 으로 위임 하게된다.

실제로는 DelegatingFilterProxy가 필터로 등록될때 SpringSecurityFilterChain이름으로 등록을하게된다.

그래서 DelegatingFilterProxy가 SpringSecurityFilterChain이름을찾을수가 있다. SpringSecurityFilterChain의 이름을 가진 빈이 FilterChainProxy다

이후에 FilterChainProxy가 관리하는 필터들을 호출하여 보안처리를 하게된다.  그다음 DispatcherServlet 으로 접근을 하게된다.

 

 

 

 

 

SecurityFilterAutoConfiguration.java

DelegatingFilterProxy 여기서 요청을 받아서 필터를 등록하는 과정이다 

 

 

 

AbstractSecurityWebApplicationInitializer.java

여기서 보면 springSecurityFilterChain 으로 등록을 하고 있다.

 

 

 

DelegatingFilterProxyRegistrationBean.java method = DelegatingFilterProxyRegistrationBean

여기서 보면 위에서  springSecurityFilterChain이란 이름으로 등록을 시도했다. DelegatingFilter를 확인하면  확인할수 있다.

 

 

WebSecurityConfiguration.java

여기는 스프링 영역인데 이 설정 클래스 인데 초기회 되는과정을 볼수 있다. 위에서 등록된 springSecurityFilterChain 이라는 이름으로

빈을 생성한다. 이 빈이 바로 FilterChainProxy다 그리고 이필터 체인을 생성하는 클래스가 WebSecurityConfiguration클래스이다.

여기서  webSecurity.build(); 하게되면 

 

 

 WebSecurity.java method= performBuild

FilterChainProxy를 생성하는걸 볼수 있다.  DelegatingFilterProxy가 생성될때 "springSecurityFilterChain"이라는 동일한 이름으로 등록되고스프링에서도 FilterChainProxy를 등록할때 동일한 이름으로 등록을 하게된다.이러면 초기화 과정이 끝이난다.

 

 

 

 

 

DelegatingFilterProxy.java

요청을 하게되면 DelegatingFilterProxy가 가장 먼저 받게되고 요청을 위임할 필터를 찾는다. 아까 위 에서"springSecurityFilterChain" 으로 등록이되었기 때문에 springSecurityFilterChain을 찾는다.

 

 

 

DelegatingFilterProxy.java

getTargetBeanName 으로 "springSecurityFilterChain" 이름을 가진 bean을 가져온다.

 

 

요녀석을 통해서 위임하게 된다 .

delegate.doFilter(request, response, filterChain) 요놈이  FilterChainProxy호출해서 전달한다.

 

 

.FilterChainProxy.java

 

여기서 "springSecurityFilterChain"으로 등록한 빈을 전달해줌으로써 DelegatingFilterProxy의 일은 여기서 끝이난다

 

.FilterChainProxy.java

스프링 시큐리티가 FilterChainProxy 가 List<Filter> filters = getFilters(fwRequest)를 호출해서 FilterChainProxy가 관리하는 필터들들을 호출하여 보안처리를 하게된다. 

 

FilterChainProxy가 필터들을 호출해서 보안처리를 할떄 내부적으로 가상필터체인을 만들어서 여기로 전달한다 실질적으로는 여기서 각 포지션별로 있는 14개의 필터들을 호출하여 요청에대한 보안처리를 하게되고 최종으로 Servlet으로 접근을 하게 된다. 

 

반응형