Spring Security : Web Ignore 설정

    이 글은 인프런 정수원님의 강의를 복습하며 작성한 글입니다.

    Spring Security : Web Ignore

    Spring Security는 기본적으로 모든 자원에 접근하는 요청에 대해서 인증 + 인가를 확인해서 자원에 접근할 수 있는 경우에만 값을 내려준다. 이렇게 인증 / 인가를 모두 검사하는 것이 좋을 것처럼 보이지만 필요하지 않는 경우가 있다. 예를 들어 정적인 자원들에 대한 값이다. 

    예를 들어 특정 URL에 접근했을 때, View가 렌더링 된다고 가정해보자. 이미 URL에 접근할 수 있다는 인가를 받으면 그 화면이 바로 랜더링이 되면 된다. 그렇지만 스프링 시큐리티는 기본적으로 모든 접근에 대해서 인증/인가를 검색하기 때문에 이 URL을 랜더링 하는데 필요한 정적인 파일(CSS / HTML / JS) 파일들을 모두 다시 한번 검사한다. 

    사실 이렇게 동작하게 되면 쓸데없는 일의 반복이 될 수 있기 때문에 정적인 파일에 한해서는 검사를 Skip할 수 있도록 하는 기원을 지원한다. Spring Security에서 지원하는 이 기능을 Web Ignore라고 한다. 

     

    WebIgnore 설정

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().requestMatchers(PathRequest.toStaticResources().atCommonLocations());
    }

    WebIgnore 설정은 다음과 같이 WebSecurityConfigureAdapater의 configurer(WebSecurity web) 메서드를 오버라이딩 하면서 설정할 수 있다. 주된 항목은 PathRequest.toStaticResources().atCommonLocations()를 통해서 볼 수 있다. 

    PathRequest.toStaticResources().atCommonLocations()이 제공하는 클래스로 넘어가보면 다음과 같이 ENUM 클래스가 있고, 내부적으로 CSS, JAVA_SCRIPT, IMAGES, WEB_JARS, FAVICON등이 포함되어있는 것으로 확인된다. 이 클래스가 요청되는 URL이 각 ENUM 클래스에 설정이 되는 것이 보이는데, 이쪽으로 요청일 왔을 때 requestMatching이 되면 ignoreing 하겠다는 의미다. 

     

     

     

    Web Ignore / PermitAll의 공통점 / 차이점

    Web Ignore와 PermitAll은 같아보이지만 다르다. Web Ignore와 permitAll() 모두 인증없이 접근이 가능하도록 한다는 점에서는 같은 점이 있다. 그렇지만 이 동작 과정을 들여다보면 근본적인 차이가 있다. 

    PermitAll은 인증이 필요없다고 하지만, 반드시 FilterSecurityInterceptor까지 온 다음에 DispatcherServlet으로 넘어간다. 이 말은, 비록 인증이 필요없다고 하지만 반드시 Spring Security가 제공하는 보안 필터를 거친다는 의미이다. 반대로 WebIgnore는 SpringSecurity가 제공하는 Filter를 거치지 않는다는 점이다. 실제로 이 부분은 아래 동작 화면에서 살펴볼 수 있다. 

     

    Web Ignore 설정 안했을 때

    FilterSecurityInterceptor.invoke()

    Web ignore를 설정하지 않았을 때, FilterSecurityInterceptor.invoke()의 beforeInvocation을 한번 확인해본다. 

     

    여기서 filterInvocation 객체를 살펴보면 GET 방식으로 jpg정적 자원에 접근하는 것마저 인증/인가 검사를 하는 것을 확인할 수가 있다. 

     

    Web Ignore 설정했을 때

    위의 경우 GET /로 접근하는 URL만 검사를 하는 것을 확인할 수 있다. 앞서 검사했던 jpg 파일은 검사를 하지 않는다. 

     

    정리

    • Web Ignore를 이용해서 정적인 자원들은 Spring Security의 필터를 거치지 않고 통과하도록 설정할 수 있다. 
    • Web Ignore는 필터를 거치지 않고, permitAll()은 반드시 Spring Security의 필터를 거친다. 
    • Web Ignore 설정을 위해서는 configurer(WebSecurity web) 메서드를 오버라이드하면 된다. 

     

    코드

    https://github.com/chickenchickenlove/spring-security/tree/main/lectureproject/1-2/src

     

    GitHub - chickenchickenlove/spring-security

    Contribute to chickenchickenlove/spring-security development by creating an account on GitHub.

    github.com

     

    댓글

    Designed by JB FACTORY