[Spring] 필터

merci·2023년 3월 19일
0

Spring

목록 보기
14/21

Filter

필터를 사용하는 이유가 뭘까?
내가 경험해본 바로는 어떤 권한을 먼저 확인하는 용도로 사용했던것 같다.
예를들어 ip차단이나 블랙리스트에 등록이되면 해당 사이트에 접속못하게 되는 경우말이다.

또한 보안문제등을 해결하기 위함인데 예를들어 SQL Injection 공격을 사전에 차단할 수도 있게 만들어 준다.

그럼 이제 필터를 등록하고 이용해보자

필터 정의

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.springframework.util.ObjectUtils;

public class MyBlackListFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
    					throws IOException, ServletException {
        String value = request.getParameter("value"); 
        if(ObjectUtils.isEmpty(value)){
            response.setContentType("text/plain; charset=utf-8");
            response.getWriter().println("value 파라미터를 전송해주세요");
            return;
        }
        if(value.equals("바보")){
            response.setContentType("text/plain; charset=utf-8");
            response.getWriter().println("당신은 블랙리스트가 되었습니다.");
            return;
        }
        chain.doFilter(request, response); // 정삭적일경우 필터체인을 타면됨
    }
}

Filter 를 구현하게 되면 web.xml에 등록하지 않아도 스프링 컨테이너에 등록이 된다.
또는 필터 자체를 컴포넌트스캔이 가능하게 만들어서(@Conponent) DB에 접근가능하게 할수도 있지만 권장하지는 않는다.

필터에서 로직을 처리할 경우 들어온 버퍼를 reader로 읽을 수는 있지만 모든 버퍼를 읽을 필요가 없고 읽게되면 버퍼가 날라가서 다시 넣어야 하는 과정이 필요하게 되므로 필터에서는 조금더 전역적인 일을 해야 한다. - ( ip차단, 블랙리스트 )

request.getParameter를 이용하면 x-www-form-urlencoded 기본파싱전략에 의해 읽게 되는데 특정한 단어가 들어오게 되면 필터링을 할 수도 있다.
이때 한글을 넣게 되면 깨지게 되는데 일반적인 서블릿 컨테이너의 인코딩방식이 UTF-8 이고 아직 디스패처서블릿으로 들어가지 않았으므로 response.setContentType("text/plain; charset=utf-8"); 을 이용해서 인코딩 방식을 지정해줘야 한다.

필터 등록

이제 만들어 놓은 필터를 등록해 보자.

@Configuration
public class FilterRegisterConfig {
    // private final MyBlackListFilter myBlackListFilter; // 이렇게 할 필요는 없음
    
    @Bean 
    public FilterRegistrationBean<?> blackListFilter(){
        FilterRegistrationBean<MyBlackListFilter> registration = new FilterRegistrationBean<>();
        registration.setFilter(new MyBlackListFilter());
        registration.addUrlPatterns("/filter");
        registration.setOrder(1);
        return registration;
    }
}

설정파일들을 @Configuration 어노테이션을 붙여주면 된다.
Configuration으로 등록된 클래스에서 @Bean을 이용해 개발자가 직접 만든 객체를 스프링 컨테이너에 등록해준다.

FilterRegistrationBean는 필터를 등록하기 위한 유틸클래스인데 필터를 등록하고, 어떤 url에 필터가 적용될지, 필터의 순서 또한 지정할 수가 있다.

서버를 실행하면 컴포넌트스캔이 실행되어 @Configuration이 스캔되고 @Bean이 스캔되어 해당 필터가 IOC에 등록되고 필터가 필요하게 될때 스프링이 컨테이너에서 해당 Beaninvoke()하게 된다.

Post Man으로 확인


을 보내보면 아래의 결과를 얻을 수 있고


을 보내면 아래의 결과를 얻게 된다.

profile
작은것부터

0개의 댓글