오봉이와 함께하는 개발 블로그

스프링 MVC 2 - 서블릿 필터 소개 본문

BE/Spring

스프링 MVC 2 - 서블릿 필터 소개

오봉봉이 2022. 8. 29. 16:19
728x90

서블릿 필터 - 소개

요구사항에는 로그인 한 사용자만 상품 관리 페이지에 들어갈 수 있어야 한다.
로그인을 하지 않은 사용자에게는 상품 관리 버튼이 보이지 않기 때문에 문제가 없어 보이지만, URL을 직접 호출하면 상품 관리 화면에 들어갈 수 있는 문제가 있다.

상품 관리 컨트롤러에서 로그인 여부를 체크하는 로직을 하나하나 작성하면 되겠지만, 등록, 수정, 삭제, 조회 등등 상품관리의 모든 컨트롤러 로직에 공통으로 로그인 여부를 확인해야 한다.
더 큰 문제는 로그인과 관련된 로직이 변경될 때마다 작성한 모든 로직을 수정해야 할 수 있다는 점이다.

애플리케이션 여러 로직에서 공통으로 관심이 있는 있는 것을 공통 관심사(cross-cutting concern)라고 한다.
여기서는 등록, 수정, 삭제, 조회 등등 여러 로직에서 공통으로 인증에 대해서 관심을 가지고 있다.

이런 공통 관심사는 스프링의 AOP를 사용해서 해결할 수 있지만, 웹과 관련된 공통 관심사는 서블릿 필터 또는 스프링 인터셉터를 사용하는 것이 좋다.
웹과 관련된 공통 관심사를 처리할 때는 HTTP의 헤더나 URL의 정보들이 필요한데, 서블릿 필터스프링 인터셉터HttpServletRequest를 제공한다.

서블릿 필터 소개

필터는 서블릿이 지원하는 수문장으로, 특성은 다음과 같다.

필터 흐름

HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 컨트롤러

필터를 적용하면 필터가 호출 된 다음 서블릿이 호출된다.
그래서 모든 고객의 요청 로그를 남기는 요구사항이 있다면 필터를 사용하면 된다.
참고 1 : 필터는 특정 URL 패턴에 적용할 수 있다. /*이라고 하면 모든 요청에 필터가 적용된다.
참고 2 : 스프링을 사용하는 경우 여기서 말하는 서블릿은 스프링의 디스패처 서블릿으로 생각하면 된다.

필터 제한

HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 컨트롤러 //로그인 사용자
HTTP 요청 -> WAS -> 필터(적절하지 않은 요청이라 판단, 서블릿 호출X) //비 로그인 사용자

필터에서 적절하지 않은 요청이라고 판단하면 거기에서 끝을 낼 수도 있기 때문에 로그인 여부를 체크하기에 딱 좋다.

필터 체인

HTTP 요청 -> WAS -> 필터1 -> 필터2 -> 필터3 -> 서블릿 -> 컨트롤러

필터는 체인으로 구성되는데, 중간에 필터를 자유롭게 추가할 수 있다.
예를 들어 로그를 남기는 필터를 먼저 적용하고, 그 다음 로그인 여부를 체크하는 필터를 만들 수 있다.

필터 인터페이스

public interface Filter {
      public default void init(FilterConfig filterConfig) throws ServletException{}

      public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException{}

      public default void destroy() {}
}

필터 인터페이스를 구현하고 등록하면 서블릿 컨테이너가 필터를 싱글톤 객체로 생성하고, 관리한다.

  • init() : 필터 초기화 메소드로 서블릿 컨테이너가 생성될 때 호출된다.
  • doFilter() : 고객의 요청이 올 때 마다 해당 메소드가 호출된다. 필터의 로직을 구현하면 된다.
  • destroy() : 필터 종료 메소드로 서블릿 컨테이너가 종료될 때 호출된다.
출처 : 인프런 김영한 지식공유자님 강의 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
728x90
Comments