Spring and Spring Boot/Class, Annotation, Library

Spring Security Library : DispatcherServlet Class

마이트너 2025. 3. 16. 22:04

DispatcherServlet은 Spring MVC의 핵심 서블릿으로, HTTP 요청을 처리하기 위해 사용됩니다. Spring Security와 Spring Boot에서 DispatcherServlet은 요청을 처리하는 중요한 역할을 하며, Spring Security의 보안 관련 필터를 통합하여 인증 및 권한 부여를 처리합니다.


DispatcherServlet의 유의미한 동작 (스프링 시큐리티 및 스프링 부트 관점)

  1. DispatcherServlet의 역할:
    • 클라이언트로부터 들어오는 HTTP 요청을 **핸들러(컨트롤러)**에게 전달하는 역할을 합니다.
    • DispatcherServlet은 Spring MVC 프레임워크에서 핸들러 매핑, 컨트롤러 호출, 뷰 리졸버와의 통합을 담당하며, 핸들러 인터셉터 및 필터를 통해 요청 흐름을 제어합니다.
  2. Spring Security와의 통합:
    • Spring Security는 요청을 DispatcherServlet에 전달되기 전에 필터 체인을 통해 요청을 검증하고 인증 및 권한을 처리합니다.
    • Spring Security의 **SecurityFilterChain**은 DispatcherServlet 앞에서 실행되어, HTTP 요청에 대한 보안 검사를 진행합니다.
    • 이를 통해 DispatcherServlet은 인증된 요청만 컨트롤러로 전달하고, 인증되지 않은 요청에 대해서는 리디렉션이나 401 Unauthorized 응답을 보낼 수 있습니다.
  3. 요청의 흐름 (스프링 부트 + 스프링 시큐리티):
    1. 클라이언트 요청: 클라이언트가 요청을 보냅니다.
    2. 필터 체인 실행: 요청은 Spring Security 필터 체인을 거칩니다. 여기서 인증 필터(AuthenticationFilter)가 실행되어 인증을 확인합니다.
    3. SecurityContext 설정: 인증이 성공하면 SecurityContextHolder에 사용자 정보를 저장합니다. 이후, 요청은 DispatcherServlet으로 전달됩니다.
    4. DispatcherServlet의 요청 처리: DispatcherServlet은 요청을 적합한 **핸들러(컨트롤러)**로 전달하고, 해당 핸들러가 요청을 처리한 후 응답을 반환합니다.
  4. Spring Security의 SecurityContext와 DispatcherServlet:
    • 인증 정보는 **SecurityContextHolder**에 저장되어 있으며, 이 정보는 애플리케이션에서 계속 참조될 수 있습니다. DispatcherServlet이 요청을 컨트롤러로 전달할 때, **SecurityContext**에서 인증 정보를 확인하여 보안 컨텍스트가 설정됩니다.
    • SecurityContext에 저장된 인증 정보는 애플리케이션이 요청을 처리하는 동안 유효하며, 컨트롤러가 보안 검사를 필요로 하는 경우 이를 참조합니다.
  5. DispatcherServlet의 흐름 제어:
    • DispatcherServlet은 HTTP 요청을 처리하기 전에 핸들러 인터셉터스프링 시큐리티 필터를 거쳐 인증 및 권한 검사를 수행합니다.
    • 인증된 요청에 대해서는 컨트롤러로 전달되며, 인증되지 않은 요청에 대해서는 Spring Security에 의해 리디렉션 또는 에러 응답이 반환됩니다.

DispatcherServlet의 코드 내 유의미한 부분 (Spring Security 및 Spring Boot 관련)

DispatcherServlet의 코드 내에서 중요한 부분은 요청을 처리하기 위한 필터 체인 및 핸들러 매핑, 보안 설정과 관련된 부분입니다. 아래에 해당 부분을 추출해 설명하겠습니다:

public class DispatcherServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1. Spring Security 필터 체인과 요청 처리 전에 필요한 보안 체크
        if (request.getAttribute("SPRING_SECURITY_CONTEXT") != null) {
            SecurityContext context = (SecurityContext) request.getAttribute("SPRING_SECURITY_CONTEXT");
            SecurityContextHolder.setContext(context);
        }
        
        // 2. Request를 처리할 HandlerMapping 조회
        HandlerMapping handlerMapping = getHandlerMapping(request);

        // 3. Handler 인터셉터를 통해 처리 전후의 동작을 수행
        for (HandlerInterceptor interceptor : getInterceptors()) {
            interceptor.preHandle(request, response, handler);
        }

        // 4. HandlerAdapter가 실제로 컨트롤러 호출을 처리
        handler.handle(request, response);

        // 5. 후속 후 처리가 필요하면, 응답 후 작업을 수행
        for (HandlerInterceptor interceptor : getInterceptors()) {
            interceptor.postHandle(request, response, handler, modelAndView);
        }
    }
}

주요 동작 설명

  1. Spring Security 필터와 보안 정보 설정:
    • 요청이 DispatcherServlet으로 들어오기 전에 Spring Security 필터 체인에서 SecurityContext 정보를 저장합니다. 그 후, 이 정보는 DispatcherServlet이 처리하는 동안 계속 참조됩니다.
    • 보안 컨텍스트(SecurityContext)는 현재 인증된 사용자의 정보를 담고 있으며, 이를 통해 요청에 대한 보안 검사를 수행할 수 있습니다.
  2. 핸들러 매핑 및 핸들러 인터셉터:
    • DispatcherServlet은 **핸들러 매핑(HandlerMapping)**을 사용하여 요청에 해당하는 **컨트롤러(핸들러)**를 찾아 실행합니다. 이때, 핸들러 인터셉터가 요청 처리 전후에 추가적인 작업을 수행할 수 있습니다.
  3. 핸들러 호출 및 후처리:
    • 핸들러 어댑터가 요청에 맞는 컨트롤러를 호출하고, 그 결과를 처리합니다. 이때, 요청 처리 중 인증된 사용자 정보는 SecurityContextHolder를 통해 참조되며, 이를 통해 컨트롤러에서 보안 관련 작업을 수행할 수 있습니다.
  4. 컨트롤러 호출 후 처리:
    • 요청 처리 후, 후속 후 처리가 실행되며, 응답에 대한 후처리 및 결과가 클라이언트에 반환됩니다.

결론

DispatcherServlet은 Spring Security와 밀접하게 연관되어 있으며, 요청이 처리되기 전에 Spring Security 필터 체인을 거쳐 인증 및 권한 부여가 수행됩니다. 그 후, 인증된 요청만 컨트롤러로 전달되고, SecurityContextHolder에 저장된 인증 정보를 통해 요청을 처리합니다.


 

728x90