1. 문제
현재 작업중인 프로젝트에서
뷰 페이지에 들어갈 때마다 username으로 user를 찾는 쿼리가 마지막에 2번 추가로 날아가는 현상이 발견됨
근데 또 로그인을 하지 않은 상태에서 뷰페이지에 접근하면 username쿼리가 날라가지 않는다
2. 원인
기본적으로 username 쿼리는 Spring Security의 인증인가 필터에서 username으로 user를 확인할 때 날라간다
로그수준을 trace로 설정해서 확인해본 결과
첫번째 user쿼리는 뷰페이지에 접속하기 위해 GET /admin/users/v2 요청에서 인증/인가를 위해 날라가는 쿼리이고(예상했던 결과)
두번째, 세번째는 js, css파일을 가져올때 Spring Security의 인증/인가 처리가 원인이었다.
3. 해결
프로젝트에선 아래와 같이
.requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()
코드를 통해 resources에 대한 접근을 허용한 상태인데 추가 쿼리가 나가지 않을 것이라고 생각했다.
하지만 확인해본 결과 기존 작성한 아래 코드는 Security 필터를 거치지 않는 것이 아니라, 필터를 거치지만 익명사용자라도 permitAll()로 허용했다고 볼 수 있다.
따라서 로그인을 하든 안하든 접근 가능하지만, 로그인을 한 상태에서는 추가 쿼리가 날라가는 등 불필요한 리소스가 사용된다.
http.authorizeHttpRequests((authorizeHttpRequests) ->
authorizeHttpRequests
.requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()// resources 접근 허용 설정
Plain Text
복사
이를 해결하기 위해서는 ignoring()을 사용하여 필터를 아예 타지 않도록 할 수 있다. 아래는 ignoring()을 추가하여 수정한 코드이다.
@Bean
public WebSecurityCustomizer webSecurityCustomizer() {
return (web) -> web.ignoring().requestMatchers(PathRequest.toStaticResources().atCommonLocations());// "/static/**" 으로 들어오는 요청 무시
}
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
// CSRF 설정
http.csrf((csrf) -> csrf.disable());
// 기본 설정인 Session 방식은 사용하지 않고 JWT 방식을 사용하기 위한 설정
http.sessionManagement((sessionManagement) ->
sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
);
http.authorizeHttpRequests((authorizeHttpRequests) ->
authorizeHttpRequests
.requestMatchers(HttpMethod.POST,"/api/users/**").permitAll()// '/api/users/'로 시작하는 POST 요청 모두 접근 허가
.requestMatchers(HttpMethod.GET,"/api/books/search**").permitAll()//
.requestMatchers(HttpMethod.GET,"/api/books/{bookId}").permitAll()//
Plain Text
복사
4. 결과
js와 css에 대한 Security 필터가 작동을 안해서 username으로 user를 찾는 추가 쿼리 2개가 날아가지 않는 상태이다.
추가로 쿼리가 날아가는 문제는 해결하였지만 permitAll()이 아니라 ignorering()을 사용했을 때의 생길 수 있는 문제점도 더 알아보고 생각해봐야 한다고 생각한다.