이 글은 인프런 정수원님의 강의를 복습하며 작성한 글입니다.
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 설정 안했을 때
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
'Spring > Spring Security' 카테고리의 다른 글
Spring Security : 계정 생성 + 권한 설정 + 인증/인가 설정 (0) | 2022.04.09 |
---|---|
Spring Security : 아키텍쳐 / 필터 초기화와 보안 클래스 다중 설정 (0) | 2022.04.06 |
Spring Security : 아키텍쳐(DelegatingFilterProxy, FilterChainProxy) (0) | 2022.04.06 |
Spring Security : CSRF / CSRF Filter (0) | 2022.04.05 |
Spring Security : 선언적 권한 설정과 표현식 (0) | 2022.04.05 |