로그인 및 유저 추가를 해봤는데 어떻게 스프링 시큐리티가 작동하는 지에 대해서 알아보자
servlet container
서버가 여러개의 서블릿을 담고 있기 떄문에 서블릿 컨테이너라 한다.
1. 클라이언트 요청으로부터 서블릿을 생성하고 초기화한 후( init() )에
2. service() 메소드를 호출하여 servlet이 브라우저의 요청을 처리하도록하고
3. HTTP 메서드 (get, post)를 처리하는 doGet() ,doPost()을 호출한 후에 응답이 완료 될때 Servlet객체를 제거한다 (destroy())
많이 사용하는 톰캣도 서블릿 컨테이너다
톰캣의 경우 Servlet객체를 생성하고 이미 생성된 Servlet객체를 메모리에 캐싱함으로써 다음번 요청에 대해 캐싱된 서블릿 객체를 반환하며 톰캣이 종료되기 전이나 reload 전에 모든 Servlet을 제거하는 방식으로 자원을 활용한다.
참조 https://victorydntmd.tistory.com/154
서블릿 컨테이너는 기본 적으로 필터와 서블릿으로 구성이 되어 있다 .
필터는 체인처럼 엮여있기 떄문에 필터 체인이라고도 불린다 , request는 이 필터 체인을 반드시 거쳐야만 서블릿 서비스에 도착하게 된다 그림으로 보면 아래 그림과 같다.
1. 요청이 threadlocal로 실행되어 들어오고
2. 필터를 차례대로 거친 다음 (주로 request에 대해서 공통적으로 적용되야하는 것들이 filter에 정의되어 있다.)
3. url에 따라 서블릿이 분기되고 (DispatchServlet은 등록된 controller와 메소드에서 URL과 매칭되는 메소드를 찾아준다. )
4. 메소드를 찾아 request, response를 처리한다.
스프링 시큐리티의 경우 filter 단에서 동작하며 DelegatingFilterProxy라는 프록시 객체를 통해 정책에 따라 인증,인가가 분리될 수 있게 해준다 .
이전 시간에 만들었던 WebSecurityConfigurerAdapter를 상속받은 SecurityConfig가 그 spring security의 SecurityFilterChain을 구성하는 역할을 한다 .
스프링 시큐리티에서 기본적으로 제공하는 필터를 사용하여 filterchain을 구성할 수 있다.
https://docs.spring.io/spring-security/site/docs/current/reference/html5/#servlet-applications
(스프링 시큐리티에서 제공하는 security filter list)
각 필터들은 각자의 관심사를 갖으며 해당 관심사에 대한 책임을 갖는다.
WebSecurityConfigurerAdapter를 상속받은 Config 클래스에 @EnableWebSecurity(debug = true)로 해주면
현재 요청 서블릿의 정보와 애플리케이션이 어떤 filter를 포함하고 있는지가 나온다 .
기본적으로 위의 필터들이 실행되도록 되어있다 . 만약 특정 필터을 끄고 싶다거나 한다면
configure 메서드에서 원하지 않는 필터를 disable() 해주면 된다.
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests((request)->
request.antMatchers("/").permitAll()
.anyRequest().authenticated()
) .csrf().disable()
.logout().disable()
.headers().disable();
http.formLogin();
http.httpBasic();
//super.configure(http);
}
위의 configure 메서드에서 disable 로 지정한 HeaderWriterFilter , csrfFilter. , logoutFilter가 필터체인에서 제외 된것을 알 수 있다 .
위의 필터체인 구조에서 봤듰이 SecurityFilterChain은 요청 uri에 따라 다르게 적용될 수 있다.
uri와 설정한 필터 체인을 매칭하기 위해서 antMatcher메서드를 사용한다.
@Override
protected void configure(HttpSecurity http) throws Exception {
//해당 필터에 uri를 매칭시키는 메서드
http.antMatcher("/api/**");
http.authorizeRequests((request)->
request.antMatchers("/").permitAll()
.anyRequest().authenticated()
) .csrf().disable()
.logout().disable()
.headers().disable();
http.formLogin();
http.httpBasic();
//super.configure(http);
}
'Spring Security' 카테고리의 다른 글
스프링시큐리티 공부 6 - RoleHierarchy, authenticationDetailsSource 설정하기 (1) | 2021.06.29 |
---|---|
스프링시큐리티 공부 5 - form 로그인 1 (0) | 2021.06.29 |
스프링시큐리티 공부 4 - 스프링 시큐리티에서의 로그인 (0) | 2021.06.27 |
스프링시큐리티 공부 2 - 사용자 추가 (0) | 2021.06.27 |
스프링시큐리티 공부 1 - 스프링 시큐리티란? (0) | 2021.06.27 |