[Spring Security] 필터

kwang-sub·2024년 12월 27일

시큐리티에서 필터란?

이전 스프링 시큐리티 아케텍처에서 요청을 받으면 인증 필터를 통해 권한 부여 관리자에게 인증 책임의 역할을 맡기는 형태임을 학습했다.

이러한 필터는 하나의 체인을 이루며 순차적으로 동작을 하게 되는데 우선 필터를 정의하는 방법을 알아보자

public class CustomFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        HttpServletResponse httpServletResponse = (HttpServletResponse) response;
        
		...
        
        if (isBadRequest) {
 			// 올바르지 않은 요청인 경우 반환 처리
            httpServletResponse.setStatus(HttpServletResponse.SC_BAD_REQUEST);
        } else {
            // 다음 필터 실행
            chain.doFilter(request, response);
        }

    }
}

request와 response에서 요청, 응답 정보를 얻을 수 있으며 chain을 통해 다음 필터에 실행 여부를 선택할 수 있다.

아래와 같이 필터 체인에 필터를 추가할 수 있는데 추가하는 위체에 따라 addFilterBefore(), addFilterAfter()와 같은 메서드를 제공한다.

	@Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    	...
        http.addFilterAt(new CustomFilter(), BasicAuthenticationFilter.class);

        return http.build();
    }

스프링 시큐리티에서는 Filter 인터페이스를 구현한 여러 클래스가 있는데 아래는 종류에 대한 설명이다.

종류용도
GenericFilterBeanweb.xml 설명자 파일에 정의하여 초기화 매개 변수를 이용가능
OncePerRequestFilterGenericFilterBean을 확장하며 필터 체인에 필터가 복수로 추가되어도 한번만 실행되도록 구현
shouldNotFilter() 메서드를 이용하면 특정 조건에서만 필터 동작하도록 설정 가능

cors 필터

CORS는 교차 출처 리소스 공유를 말하며 하나의 브라우저에서 여러 URL을 호출 못하도록 제한하고 있는데 이를 완화하기 위한 정책이다.
특히 요즘은 프론트엔드, 백엔드 서버가 나누어져있는데 브라우저에서 프론트 서버인 example.com을 호출하고 해당 페이지에서 백엔드 서버인 api.example.com을 호출하면 CORS 정책으로 인해 에러가 발생한다.

여기서 주의할 점은 CORS 정책으로 인해 응답 값을 못쓰는거지 호출 자체는 정상적으로 이루어져 비즈니스 로직은 정상 동작한다는 점을 꼭 명심하자!

이러한 CORS 정책은 아래와 같이 SecurityFilterChane을 통해 설정할 수 있다.

	@Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {

        http
                .cors(cors -> {
                    CorsConfigurationSource source = request -> {
                        CorsConfiguration config = new CorsConfiguration();
                        config.setAllowedOrigins(List.of("http://example.com"));
                        config.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE", "OPTIONS"));
                        return config;
                    };

                    cors.configurationSource(source);
                });
           
        return http.build();
    }
profile
백엔드 개발일지

0개의 댓글