개발(~국비)/Spring
로그인 - 필터, 인터셉터
까만밀가루
2022. 12. 6. 14:18
애플리케이션 여러 로직에서 공통으로 관심이 있는 공통 관심사는 스프링 AOP로 해결할 수 있지만, 웹과 관련된 공통 관심사는 서블릿 필터 또는 스프링 인터셉터를 사용하는 것이 좋다. 웹과 관련된 공통 관심사를 처리 할 때는 HTTP의 헤더나 URL의 정보들이 필요한데, 서블릿 필터나 스프링 인터셉터는 HttpServletRequest를 제공한다.
서블릿 필터
- HTTP 요청 → WAS → 필터 → 서블릿 → 컨트롤러
이 때 필터에서 적절하지 않은 요청이라고 판단하면 거기에서 끝을 낼 수도 있다.
필터는 체인으로 구성되는데 중간에 필터를 자유롭게 추가할 수 있디.
- HTTP 요청 → WAS → 필터1 → 필터2 → 필터3 → 서블릿 → 컨트롤러
예)로그를 남기는 필터를 먼저 적용하고 그 다음에 로그인 여부를 체크하는 필터를 만들 수 있다.
필터 인터페이스
- init(): 필터 초기화 메서드, 서블릿 컨테이너가 생성될 때 호출된다.
- doFilter(): 고객의 요청이 올 때 마다 해당 메서드가 호출된다. 필터의 로직을 구현하면 된다.
- destroy(): 필터 종료 메서드, 서블릿 컨테이너가 종료될 때 호출된다
public class LogFilter implements Filter
필터를 사용하려면 필터 인터페이스를 구현해야한다.
WebConfig - 필터설정
@Configuration
public class WebConfig {
@Bean
public FilterRegistrationBean logFilter() {
FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<>();
filterRegistrationBean.setFilter(new LogFilter()); //등록할 필터 지정
filterRegistrationBean.setOrder(1); //필터는 체인으로 동작, 순서 정하기
filterRegistrationBean.addUrlPatterns("/*"); //필터를 적용할 URL 패턴 지정, 한번에 여러 패턴 지정 가능
return filterRegistrationBean;
}
}
@ServletComponentScan @WebFilter(filterName = "logFilter", urlPatterns = "/*") 로 필터 등록이 가능하지만 필터 순서 조절이 안된다. 따라서 FilterRegistrationBean 을 사용하자.