ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] 스프링 필터와 필터 체인
    Programming🧑‍💻/Spring 2023. 3. 27. 14:42

    스프링 어플리케이션 요청과 응답 흐름

    • 웹 어플리케이션의 구성 
      • 웹 어플리케이션을 개발한다는 것은 클라이언트의 요청을 받아 서버에서 여러 동작을 통해 동적으로 만들어낸 응답을 내준다. 
      • 여기서 응답을 처리하고 정해진 동작을 하는 요소들을 웹 컴포넌트라고 한다.
      • 웹 컴포넌트들은 독립적으로 있지 않고 컨테이너 안에서 관리된다. 
      • 컨테이너는 클라이언트의 요청을 받으면 해당 요청을 처리할 웹 컴포넌트를 지정해 주는 역할을 하며, 웹컴포넌트들의 전반적인 생명주기(초기화 - 동작 - 제거)를 관리한다. 
    • 자바에서의 웹 어플리케이션 
      • 자바에서는 웹 컴포넌트를 서블릿이라고 하며, 서블릿을 관리하는 컨테이너를 서블릿 컨테이너라고 한다. 
      • Tomact은 서블릿 컨테이너의 일종이다. 
    • 스프링 더하기 
      • 서블릿 컨테이너로는 구현가능한 동작의 한계가 있어 이를 해결하기 위해서 스프링 프레임워크를 더했다. 
      • 서블릿 컨테이너서블릿과 같이 스프링은 스프링 컨테이너으로 구성되어 있다. 
      • 기본적으로 서블릿 컨테이너가 앞단에서 클라이언트의 HTTP 요청을 받고, 서버의 동작 결과를 HTTP응답으로 내보는 역할을 해준다. 
      • 서블릿이 요청을 받아 이를 객체로 만들어서 스프링에게 넘겨주면 스프링에 등록된 빈(객체)들이 이 요청을 가지고 짜인 로직대로 동작을 한 후 응답을 반환한다. 
      • DispatcherServlet은 스프링 컨테이너안에서 서블릿으로부터 넘겨받은 요청을 처리할 빈을 매핑해 주고 동작의 결과를 다시 반환해 주는 프론트 컨트롤러 역할을 한다. 

     
     

    필터와 필터 체인 

    • 필터의 필요
      • 잘 생각해보면 클라이언트의 요청이 올바른 요청인지 또는 지금 접근하려고 하는 페이지에 들어갈 수 있는 권한을 가지고 있는지와 같이 인증이나 권한을 확인하는 절차는 각 컴포넌트마다 하는 것이 아니라 요청에 대한 동작을 하기 전에 한꺼번에 하는 것이 효율적이다. 
      • 따라서 Servlet에서는 필터라는 것을 두어 요청이 들어가기 전에 또는 응답이 나가기 전에 공통되는 로직을 몰아서 처리한다. 
      • 처리해야 할 공통 로직이 여러 가지 있는 경우에는 각 필터를 연속해서 묶어 필터체인을 구성하여 각 공통로직을 순차적으로 처리하도록 한다. 
      • Filter 와 FilterChain은 인터페이스로 javax.servlet 패키지에 포함되며 위와 같은 특징 때문에 스프링 서큐리티에 주요 기능을 구현하는 데 사용된다. 

     

    필터 인터페이스 확인하기

    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() {}
    }
    • 필터의 인터페이스는 위와 같이 구성되어 있으며  doFilter()가 주요 메서드로 서블릿 요청객체와 서블릿 응답 객체에 일정한 로직을 수행한다. 
    • init() 와 destory()는 서블릿 컨테이너상에서 생명주기 관리를 위한 메서드로 default 로 선언되어 구현하지 않아도 된다. 

    필터 체인 인터페이스 확인하기

    public interface FilterChain {
        public void doFilter(ServletRequest request, ServletResponse response) 
      throws IOException, ServletException;
    }
    • 필터 체인은 필터에서 다른 필터로 요청이나 응답을 넘겨주는 역할을 한다. 

     
     

    스프링 서큐리티에서의 필터

    • 위에서 본 필터는 기본적으로 서블릿 컨테이너의 인스턴스로 서블릿 컨테이너에 의해 생명주기가 관리된다. 
    • 이 필터를 이용해 스프링 컨테이너 상에서 스프링 서큐리티와 같은 기능을 구현하기 위해서는 이 간극을 메워줄 무엇인가가 필요하다. 
    • 프록시 기술을 이용하여 위의 문제를 다음과 같이 해결했다. 
    • 서블릿 컨테이너 상의 필터 체인 내에 DelegatingFilterProxy라는 프록시를 두고 실제 구현은 스프링 상에서 한다. 
    • 이후 해당 필터가 호출되는 경우 이 필터는 스프링 컨테이너상의 실제 구현체를 찾아 호출해주는 역할을 한다. 
    • 이와 같은 방식으로 필터를 사용하면서도 관련된 구현은 스프링에서 관리할 수 있게 하였다. 
    • SecurityFilterChain 인터페이스는 두가지 메서드를 갖는다. 
      • matches()는 현재 체인으로 들어온 요청을 처리할 수 있는가를 확인한다. 
      • getFilter()는 요청을 처리하기 위한 Filter를 호출해 준다. 

    'Programming🧑‍💻 > Spring' 카테고리의 다른 글

    DTO(Data Transfer Objects)를 왜 쓸까?  (0) 2023.08.21

    댓글

Designed by Tistory.