본문 바로가기
Spring|Spring-boot/Spring Security

Spring Security(2)

by oncerun 2021. 3. 21.
반응형

Spring Security

 

 서블릿 컨테이너

Tomcat과 같은 웹 애플리케이션을 서블릿 컨테이너라고 부릅니다. 이러한 애플리케이션은 기본적으로 필터와 서블릿으로 구성되어 있습니다.

톰캣을 웹 서버와 서블릿 컨테이너를 동시에 포함하고 있기에 서버 역할도 내장되어있긴 합니다. 

 

순서를 보면 request가 threadlocal로 실행되어서 filterchain을 거쳐서 실제 DispatchServlet에 들어오고

이러한 컨테이너에서 서블릿의 생성과 종료를 위임받아 실행됩니다.

 

그래서 스프링 시큐리티는 DelegatingFilterProxy라는 필터를 만들어 메인 필터 체인에 끼워 넣고, 그 아래 다시 SecurityFilterChain 그룹을 등록합니다.

spring security reference

본래의 메인 필터를 반드시 통과해야만 서블릿에 들어갈 수 있다는 단점을 보안하기 위해서 필터체인 Proxy를 두었다고 합니다.

web resource처럼 html,css,images파일들은 패턴을 따르더라도 필터를 무시하고 통과시켜주기도 합니다.

 

이러한 필터체인에는 다양한 종류들이 제공됩니다.

docs.spring.io/spring-security/site/docs/current/reference/html5/#servlet-applications

 

Spring Security Reference

In Spring Security 3.0, the codebase was sub-divided into separate jars which more clearly separate different functionality areas and third-party dependencies. If you use Maven to build your project, these are the modules you should add to your pom.xml. Ev

docs.spring.io

9.5에 보안 필터의 포괄적인 목록이 나열되어 있습니다.

각각의 필터는 하나의 책임을 가지고 서로 다른 관심사를 해결합니다.

 

    • HeaderWriterFilter : Http 해더를 검사한다. 
    • CorsFilter : 허가된 사이트나 클라이언트의 요청인가?
    • CsrfFilter : 내가 내보낸 리소스에서 올라온 요청인가?
    • LogoutFilter : 지금 로그아웃하겠다고 하는 건가?
    • UsernamePasswordAuthenticationFilter : username / password로 로그인을 하려고 하는가?
    • ConcurrentSessionFilter : 세션 별로 로그인하는 걸 허용할 것인가?
    • BearerTokenAuthenticationFilter : Authorization 해더에 Bearer 토큰을 주는가?
    • BasicAuthenticationFilter : Authorization 해더에 Basic 토큰을 주는가?
    • RequestCacheAwareFilter : 방금 요청한 request 이력이 다음에 필요할 수 있으니 캐시 저장
    • SecurityContextHolderAwareRequestFilter : 보안 관련 Servlet 3 스펙을 지원하기 위한 필터
    • RememberMeAuthenticationFilter : 아직 Authentication 인증이 안된 경우라면 RememberMe 쿠키를 검사해서 인증 처리
    • AnonymousAuthenticationFilter :  Anonymous 사용자
    • SessionManagementFilter : 서버에서 지정한 세션 정책을 검사
    • ExcpetionTranslationFilter :  이후에 인증이나 권한 예외가 발생하면 필터가 잡아서 처리
    • FilterSecurityInterceptor : 여기까지 살아서 왔다면 인증이 완료 클라이언트가 요청한  request에 들어갈 자격이 있는지 그리고 리턴한 결과를 클라이언트에게 보내줘도 되는 건지 마지막 점검
    • 그 밖에... OAuth2 나 Saml2, Cas, X509 등에 관한 필터들도 있습니다.
  • 필터는 넣거나 뺄 수 있고 순서를 조절할 수 있습니다. (이때 필터의 순서가 매우 critical 할 수 있기 때문에 기본 필터들은 그 순서가 어느 정도 정해져 있습니다.)

 

여기서 config클래스에서 webSecurityConfigurerAdapter가  Spring Security의 필터 체인을 구성하는 클래스라고 생각할 수 있다.

 

@EnableWebSecurity(debug = true)를 사용하면 다음과 같이 디버그 모드로 실행해서 요청이 올 때마다 적용된 필터 체인들을 볼 수 있습니다.

 

 

 @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests((requests) ->
                requests
                        .antMatchers("/").permitAll()
                        .anyRequest()
                        .authenticated());
        http.formLogin();
        http.httpBasic();
    }

다음과 같이 이 오버라이드 된 configure메서드에서 각 필터를 추가하고 제거할 수 있다는 것입니다.

정책을 정할 때 나는 모든 리소스 요청에 대해서 권한 검사를 할 것이라면 

http.antMatchers("/**")를 통해 검사할 수 있고 특정한 /api와 같이 특정 리소스에만 적용할 수 있습니다.

 

만약 필터 체인을 여러 개 사용하고 싶다면 config클래스를 생성해주면 되는데 이 경우에는 순서가 중요해집니다.

@Order를 통해 각 필터 체인의 순서를 지정해주어야 합니다. 낮은 번호부터 먼저

 

반응형

'Spring|Spring-boot > Spring Security' 카테고리의 다른 글

Spring Security(4)  (0) 2021.04.04
Spring Security Basic  (0) 2021.03.28
Spring Security Form Login  (0) 2021.03.28
Spring Security(1)  (0) 2021.03.21
Spring Security  (0) 2021.03.21

댓글