SpringSecurity - static(css,js...) 파일 설정

Jeong·2023년 8월 30일
0
post-custom-banner

SpringBoot에서 SpringSecurity를 적용하면 Security Filter에 걸려 css가 적용되지 않습니다. 그렇기 때문에 따로 설정을 통해 static 파일을 설정해 줘야합니다.

static 파일 적용

	@Bean
    public WebSecurityCustomizer webSecurityCustomizer(){
    	return web -> web.ignoring()
        	.requestMatchers(PathRequest
            .toStaticResources()
            .atCommonLocations())
            .antMatchers("/fonts/**","/img/**")
            .antMatchers("/h2-console/**");
        
        //        return web -> web.ignoring()
        //                .antMatchers("/css/**","/img/**");
    }
  • PathRequest.toStaticResources().atCommonLocations()
    - Spring Security에서 제공하는 정적 리소스에 대한 경로를 읽어와주는 메서드
    - Spring Security의 편의 기능 중 하나로서, 보통 CSS, JavaScript, 이미지 등과 같은 정적 리소스 파일이 일반적으로 위치하는 경로를 자동으로 설정해줍니다.
    - .atCommonLocations() 메서드는 Spring Security가 정적 리소스 파일을 찾아보는 기본적인 위치들을 나타내며, 이러한 경로들을 일일이 설정하지 않아도 Spring Security가 자동으로 이를 감지하고 접근을 허용함

WebSecurityConfigurerAdapter → Deprecated

  • 스프링 시큐리티가 초기화 되면서 해당 클래스가 실행되면, 설정 초기화 작업에 도움을 주는 api들이 실행 된다.
  • 현재 deprecated 되었다
  • 이전에는 WebSecurityConfigurerAdapter 를 override 해서 사용했으나 deprecated 된 이후에는 빈으로 등록해서 사용한다.
  • SecurityFilterChain Bean을 사용하여 HttpSecurity를 구성, WebSecurityCustomizer Bean을 사용하여 WebSecurity를 구성하도록 안내하고 있다.

WebSecurity와 SecurityFilterchain

  • WebSecurityCustomizer를 사용하여 정적 리소스에 대한 접근을 설정하면, SecurityFilterChain 내부에서 이 설정이 자동으로 적용되게 됩니다.
  • 그렇게 되면 정적 리소스 접근 설정을 SecurityFilterChain 내에서 따로 설정할 필요 없이, WebSecurityCustomizer에 설정한 내용이 전체 보안 설정에 통합되어 사용되기 때문에 두 가지 설정이 중복되거나 충돌할 필요가 없습니다.
  • Spring Security의 경우 정적 리소스에 대한 접근을 처리할 때는 WebSecurityCustomizer를 사용하여 설정하는 것이 보다 효율적이고 권장되는 방법입니다. 이 방법은 정적 리소스에 대한 요청 처리를 Spring Security의 필터 체인에 포함시키지 않기 때문에 더 가벼운 처리가 가능하며, 보다 빠른 성능을 제공할 수 있습니다.
  • 반면에 SecurityFilterChain 내에서 .permitAll()을 사용하여 정적 리소스에 대한 접근을 허용하게 할 경우, 해당 요청 또한 Spring Security의 필터 체인을 통과하게 됩니다. 이는 조금 더 무거운 처리가 되는 방식이며, 특히 정적 리소스가 많고 부하가 큰 상황에서는 약간의 성능 저하가 발생할 수 있습니다.
  • 따라서 성능 측면에서 보다 가벼운 처리를 위해 WebSecurityCustomizer를 사용하여 정적 리소스 접근을 설정하는 것이 권장됩니다.

SecurityFilterChain 로 설정 시

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

WebSecurityCustomizer 로 설정 시

	@Bean
    public WebSecurityCustomizer webSecurityCustomizer(){
    	return web -> web.ignoring()
        	.requestMatchers(PathRequest
            	.toStaticResources()
                .atCommonLocations()
                 );
     }
  • Spring Security의 필터 체인은 보안 관련한 작업을 처리하기 위해 사용되며, 요청이 들어오면 이 필터 체인을 따라 각각의 필터들이 순차적으로 적용됩니다. 그러나 정적 리소스 (CSS, JS, 이미지 등)와 같이 보안과는 직접적인 연관이 없는 리소스들은 필터 체인을 거치지 않고 바로 처리되어야 합니다. 이렇게 하면 보안 필터를 우회하여 정적 리소스의 처리 속도를 높일 수 있습니다.
  • 따라서 web.ignoring()을 사용하여 정적 리소스를 설정하면 Spring Security는 해당 리소스의 요청이 들어왔을 때 보안 필터를 적용하지 않고 직접 처리하도록 설정합니다. 이렇게 하면 정적 리소스에 대한 요청이 필터 체인을 거치지 않고 바로 처리되어 보안 필터의 부하를 줄일 수 있습니다.

Reference

profile
화이팅!!
post-custom-banner

0개의 댓글