Spring Security #2

이용만·2023년 5월 12일
0
post-thumbnail


그림은 DispatcherServlet에 클라이언트의 요청이 전달되기 전에 필터 체인을 구성한 예다.

  • ServletFilter : WAS에서 실행되는 필터, 클라이언트의 요청이 도달하기전에 가로채서 필터를 진행하는 JAVA의 컴포넌트

  • FilterChain : Filter들의 묶음

🔥Filter와 FilterChain의 특성
1) Servlet Filter Chain은 URI path를 기반으로 요청을 처리한다.
요청이 들어오면 서블릿 컨테이너는 요청 URI의 경로를 가지고 Filter와 Servlet 매핑 결정을 함
2) Filter Chain에서 Filter는 순서대로 동작
3) 순서를 지정하기 위해서 Bean으로 등록되는 Filter에 @Order 어노테션 적용
또는 FilterRegistrationBean을 Filter 순서 지정

@Bean
    public FilterRegistrationBean<FirstFilter> firstFilterFilterRegistrationBean(){
        FilterRegistrationBean<FirstFilter> registrationBean =
                new FilterRegistrationBean<>(new FirstFilter());
        registrationBean.setOrder(2);
        return registrationBean;
    }


그림에서도 볼 수 있듯 Servlet Container와 Spring Container는 엄연히 다른 공간에 위치되어 있다.
Spring Security 필터는 Spring Container를 이용하고 있다.

  • DelegatingFilterProxy : Servlet Container 영역의 필터와 Spring COntainer에 Bean으로 등록된 필터들을 연결해주는 브릿지 역할

🔥우선 여기까지 순서를 정리해보자면
1) Servlet Filter가 요청을 DelegatingFilterProxt로 전달
2) DelegatingilterProxy는 해당 요청을 스프링 컨테이너에 생성된 Filter를 구현한 스프링 빈에 위임
3) SpringSecurityFilterChain 이름으로 생성된 빈을 ApplcationContext에서 찾아 위임을 요청


  • Sprng Security의 Filter Chain : 보안을 위한 작업을 처리하는 필터의 모음

  • FilterChainProxy :

    • Spring Security의 Filter Chain의 이름으로 생성된 필터 빈를 사용하기 위한 진입점
    • DelegatingFilterChain으로부터 요청을 위임 받고 보안 처리 시작점


서블릿 필터의 기본 구조

public class FirstFilter implements Filter {
    // (1) 초기화 작업
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    // (2) 해당 Filter가 처리하는 실질적인 로직 구현
    public void doFilter(ServletRequest request,
                         ServletResponse response,
                         FilterChain chain)
            throws IOException, ServletException {
        // (2-1) 이곳에서 request(ServletRequest)를 이용해 다음 Filter로 넘어가기 전처리 작업을 수행한다.

        // (2-2)
        chain.doFilter(request, response);

        // (2-3) 이곳에서 response(ServletResponse)를 이용해 response에 대한 후처리 작업을 할 수 있다.
    }

    // (3)Filter 컨테이너에서 종료될 때 호출
    public void destroy() {
        // (5) Filter가 사용한 자원을 반납하는 처리
    }
}

이 후 빈으로 등록


DelegatingPasswordEncoder

  • DelegatingPasswordEncoder : Spring Security에서 지원하는 PasswordEncoder 구현 객체를 생성해주는 컴포넌트
// PasswordEncoderFactories로 만들 수 있습니다.

PasswordEncoder passwordEncoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
profile
성장하는 개발자가 되고자 합니다.

0개의 댓글