웹/Spring

[Spring Boot] 0.3. Filter Check Uri 설정하기(SpringMVC)

개발하는소유밍 2024. 1. 24. 07:26

지난 시간에 이어

웹 페이지에서는 페이지 접근에 대한 조건을 체크해주는

Filter를 적용해보려고 한다.

 

 

❕ 필터란?

디스패처 서블릿(Dispatcher Servlet)에 요청이 전달되기 전/후에

Url 패턴에 맞는 모든 요청에 대해

부가작업을 처리할 수 있는 기능 제공

 

 

❕ 필터(Filter) 적용이 필요한 이유

웹페이지에서 허락한 사용자가 아닌 유저가

(ex) 관리자 페이지 등에 강제로 접근하게 될 때

접근 조건을 체크해서 판단해줘야

문제 발생을 대비할 수 있음

 

 

- 프로젝트의 이전 세팅이 궁금하다면 이전 게시글 참고 요망 -

 

 

 

[Spring Boot] 0.1.Project 세팅하기(이클립스/spring.io/maven/war)

이번 게시글에서는 리얼 찐찐 간단한(?) 프로젝트 생성 설정에 대한 정보만 담았다 쏘 씜쁠 * 우선 시작 전에 프로젝트 스펙 사전 계획! 0. 계획한 스펙을 sping initailizr에서 작성 https://start.spring.io/

younimini.tistory.com

 

 

 

[Spring Boot] 0.2. MyBatis 연동하기(이클립스/mysql/SpringMVC)

지난 시간에는 Spring Boot Project에 index.jsp 띄우는 과정을 기록했는데 오늘은 DB설정 MyBatis 연동에 관해 기록해본다. 이어서 시작 전에 *사용할 스펙과 프로그램에 대해 미리 체크* (이전 게시글에서

younimini.tistory.com

 

 

 


Filter 를 이용한 Uri 체크

작성할 파일 리스트


(1) 필터 Interface : CustomFilter.java

(2) 필터 구현부 : UriCheckFilter.java

(3) 필터 등록 : WebConfig.java

 

참고로 다음 포스팅은 AOP 로깅 로직이라서

로그 기록은 다음 게시글에서 만나욥


 

1. 필터 인터페이스

 

필터를 추가하기 위해서는 jakarta.servlet의 Filter 인터페이스를 구현(implements)해야하며,

이는 다음의 세가지 메소드를 가지고 있다.

 

☞ init() : 필터 초기화 메서드 (서블릿 컨테이너 생성 시 호출)

- 요청 시 호출되는것이 아니라 웹 서버 기동시 스프링 컨테이너가 생성될때 호출된다.

☞doFilter() : 요청이 올때마다 호출되는 메서드 (필터의 로직 -조건체크- )

- 요청 시 호출

☞ destroy() : 필터 종료 메서드 (서블릿 컨테이너 종료 시 호출)

 

 

CustomFilter.java

public interface CustomFilter {
	
	public default void init(FilterConfig filterConfig) throws ServletException{}
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException;
	public default void destroy() {}
}

 

 

 

2. 필터 구현 및 생성

 

필터를 사용하기 위해서 필터 인터페이스의 구현 클래스 작성

 

UriCheckFilter.java

@Slf4j
public class UriCheckFilter implements Filter {
	
	private static final String[] whiteList = {"/","/index", "/test"}; //임의로 테스트할 url 작성
	
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
		throws IOException, ServletException {
		
		HttpServletRequest httpRequest = (HttpServletRequest) request;
		String requestURI = httpRequest.getRequestURI();
		
		HttpServletResponse httpResponse = (HttpServletResponse)response;
		
		try {
			log.info("URI체크 필터시작 {} ", requestURI);
			
			if(isURICheckPath(requestURI)) {
				
				log.info("URI체크 로직 실행 {} ", requestURI);
				HttpSession session = httpRequest.getSession(false);
				
				if(session == null || session.getAttribute(requestURI) == null) {
					log.info("X {} ", requestURI);
					httpResponse.sendRedirect("/"); //꼭 있는 URI를 넣어줍니다.
					return;
				}
			}
			chain.doFilter(request, response);
			
		} catch (Exception e) {
			throw e;
		} finally {
			log.info("URI체크 필터종료 {} ", requestURI);
		}
	}

	private boolean isURICheckPath(String requestURI) {
		return !PatternMatchUtils.simpleMatch(whiteList, requestURI);
	}

}

 

 

 

3. 필터 등록 및 설정

 

  FilterRegistrationBean : 스프링 부트 사용 시 필터 등록을 위한 클래스

  setFilter(new UriCheckFilter()) : 등록할 필터 지정

setOrder(1) : 필터의 순서를 지정(높을수록 우선순위)

 addUrlPatterns("/*") : 필터에 적용할 URL 패턴을 지정

- 한번에 여러 패턴 지정 가능( addUrlPatterns("/url1", "/url2") )

 

WebConfig.java

@Configuration
public class WebConfig {

	@Bean
	public FilterRegistrationBean uriCheckFilter() {
		FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<Filter>();
		filterRegistrationBean.setFilter(new UriCheckFilter());
		filterRegistrationBean.setOrder(1);
		filterRegistrationBean.addUrlPatterns("/*", "/resources/**");
		
		return filterRegistrationBean;
	}
	
}

 

 

 

필터 적용하자고 온갖 블로그를 다 뒤적이며

어떻게 작성해야 깔끔할까 고민하다

 

최소로 작성할 수 있는 필터로 간단하게 정리해보았다.

최종적으로

 

 

 

 

"/", "/index" 로 접근 잘 되고

 

 

 

허락되지 않은 "/access"  접근 시

설정한 페이지인 index.jsp로 돌아가버린다!

 

다음번에 재참고해야지..

300x250