본문 바로가기
Programming/Spring Boot

[Spring boot] Spring Security static 폴더(CSS,JS) 적용 문제 해결하기

by 공부합시다홍아 2024. 6. 15.

Spring Security를 이용해 접속시 CSS, JS가 적용이 되지 않는 문제를 직면할 것이다.
이런 문제는 아래의 코드를 @Configuration, @EnableWebSecurity가 적용된 클래스에 삽입해주면 간단하게 적용이 되는 것을 확인할 수 있다.

@Bean
public WebSecurityCustomizer webSecurityCustomizer() {
    return (web) -> web.ignoring()
            .requestMatchers(PathRequest.toStaticResources().atCommonLocations());
}

위 구문만 적용해주면 Static 폴더 내의 모든 것을 시큐리티 필터에서 무시한채 가져올 수 있다.
그리고 하나씩 접속권한을 부여하는 것보다 속도 측면과 개발 유지보수 측면에서 훨씬 효율적이다.

먼저 각 구문을 하나씩 알아보려고 한다.

WebSecurityCustomizer

WebSecurityCustomizerSecurityFilterChain 두 가지 모두는 스프링 시큐리티에서 보안 구성을 커스터마이징 가능하다.

WebSecurityCustomizer는 보통 FilterChainProxy에 대한 것을 커스터마이징하기 위해 사용한다고 하는데, 아직 FilterChainProxy에 대해 자세히 모르기 때문에 설명을 하진 않을 예정이다.
그냥 현재는 간단히 WebSecurityCustomizer정적 리소스에 대한 접근을 설정 가능하는 점만 알 수 있다.

그렇게 되면 SecurityFilterChain 내에서 따로 설정할 필요 없이, WebSecurityCustomizer에 설정한 내용이 전체 보안 설정에 통합되어 사용되기 때문에 두 가지 설정이 중복되거나 충돌날 일이 없다.

스프링 시큐리티의 경우 정적 리소스에 대한 접근을 처리할 때, WebSecurityCustomizer 를 사용하여 설정하는 것이 다른 어떤 것보다 효율적이고 권장되는 방법이다. 이 방법은 정적 리소스에 대한 요청 처리를 Spring Security의 필터 체인에 포함시키지 않기 때문에 더 빠르고 가벼운 처리가 가능하다.

반대로 SecurityFilterChain 내에서 .permitAll()를 사용하여 정적 리소스에 대한 접근을 허욜할 경우, 동일하게 스프링 시큐리티의 필터 체인을 통과하게 되지만, 모든 사람들에게 접근을 허용하고, 무거운 처리 방식이며 정적 리소스가 많고 다양한 경우에 부하가 커지고 성능이 저하되게 만드는 상황을 야기할 수도 있다.

SecurityFilterChain으로 설정한 경우

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
return http
    .authorizeHttpRequests()
        .antMatchers("/css/**","/js/**").permitAll()
        .anyRequest().permitAll()
        .build();
}

위와 마찬가지로, 하나씩 모두 별도로 입력해주어야 하기 때문에 유지보수에도 불편하고, 입력 시 까먹을 우려가 있다.


PathRequest.tostaticResources().atCommonLocations()

스프링 시큐리티에서 제공하는 정적 리소스에 대한 경로를 읽어와주는 메서드이자, 스프링 시큐리티에서 제공하는 편의 기능 중 하나로 보통 CSS, JS, IMG 등과 같은 정적 리소스 파일이 일반적으로 위치하는 경로를 자동으로 설정해준다.

atCommonLocations()

스프링시큐리티가 정적 리소스 파일을 찾아보는 기본적인 위치(Static)를 나타내며, 이러한 경로들을 일일이 설정하지 않아도 Spring Security가 자동으로 이를 감지하고 접근을 허용한다.

 

 

728x90