MSA에서의 필터와 인터셉터

마이크로서비스 아키텍처(MSA)에서는 각 서비스가 독립적으로 운영되기 때문에 요청과 응답을 처리하는 과정에서 필터(Filter)인터셉터(Interceptor)의 역할이 중요합니다. 각각의 기능은 개별 서비스와 게이트웨이(API Gateway) 수준에서 활용될 수 있습니다.


1. MSA에서 필터(Filter)

필터의 역할

  1. API Gateway 필터:

    • API Gateway(예: Spring Cloud Gateway, Zuul 등)에서 요청을 전처리/후처리하는 데 사용됩니다.
    • MSA에서는 API Gateway가 클라이언트와 백엔드 서비스 간의 중재 역할을 하므로, 필터는 공통적으로 적용해야 하는 로직을 처리하는 데 유용합니다.
  2. 개별 서비스 필터:

    • 개별 마이크로서비스에서도 요청이 서블릿(Servlet)에 도달하기 전후에 동작합니다.
    • 주로 보안, 로깅, 요청 데이터 검증 등의 작업에 사용됩니다.

필터 동작 흐름

  1. API Gateway 수준:
    클라이언트 요청 → API Gateway 필터 → 라우팅 → 서비스 필터 → 서비스 컨트롤러.
  2. 개별 서비스 수준:
    클라이언트 요청 → 서비스 필터 → 서블릿 → 컨트롤러.

필터의 주요 사용 사례

  • 보안 처리:
    • JWT 토큰 검증.
    • OAuth 인증 토큰 확인.
  • CORS 처리:
    • 클라이언트 도메인에 대한 접근 제어.
  • 로깅 및 모니터링:
    • 요청의 IP, 메서드, 경로 등을 로깅.
  • 공통 헤더 추가:
    • 요청/응답에 공통 헤더 추가(예: 추적 ID, 사용자 정보).

API Gateway에서의 필터 구현 (Spring Cloud Gateway 예시)

Spring Cloud Gateway는 GlobalFilterRouteFilter 두 가지 유형의 필터를 제공합니다.

GlobalFilter: 모든 요청에 적용.

@Component
public class GlobalLoggingFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        System.out.println("Global Filter: " + exchange.getRequest().getPath());
        return chain.filter(exchange);
    }
}

RouteFilter: 특정 라우트에만 적용.

spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: http://localhost:8081
          predicates:
            - Path=/users/**
          filters:
            - AddRequestHeader=X-Request-ID, ${random.value}

Spring Boot 개별 서비스에서의 필터 구현

@Component
public class JwtAuthenticationFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        String authHeader = req.getHeader("Authorization");

        if (authHeader == null || !authHeader.startsWith("Bearer ")) {
            throw new ServletException("Missing or invalid Authorization header");
        }

        // JWT 검증 로직 (생략)
        chain.doFilter(request, response); // 다음 필터 또는 컨트롤러로 전달
    }
}

2. MSA에서 인터셉터(Interceptor)

인터셉터의 역할

  1. 개별 마이크로서비스의 요청 처리:

    • 각 마이크로서비스 내부에서 컨트롤러에 도달하기 전후로 요청을 가로채어 필요한 작업을 수행합니다.
    • 컨트롤러에서만 처리해야 할 비즈니스 로직의 사전 검증이나 사용자 인증/인가에 활용됩니다.
  2. 공통 로직 처리:

    • 여러 컨트롤러에서 공통적으로 처리해야 할 작업(예: 인증, 로깅)을 분리하여 관리.

인터셉터 동작 흐름

  • 요청 흐름:
    클라이언트 → preHandle → 컨트롤러 → postHandle → View 렌더링 → afterCompletion.

인터셉터의 주요 사용 사례

  • 사용자 인증/인가:
    • JWT 또는 세션 기반 인증.
  • 비즈니스 검증:
    • 요청 데이터의 유효성 검증.
  • 로깅 및 모니터링:
    • API 처리 시간 측정.
  • 추적 ID 관리:
    • 분산 추적(Distributed Tracing)을 위한 컨텍스트 전파.

Spring Boot에서 인터셉터 구현

@Component
public class AuthenticationInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        String token = request.getHeader("Authorization");
        if (token == null || !validateToken(token)) {
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            return false; // 요청 처리 중단
        }
        return true; // 요청 처리 계속
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception {
        System.out.println("Post Handle logic can go here");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        System.out.println("After Completion logic can go here");
    }

    private boolean validateToken(String token) {
        // JWT 검증 로직 (생략)
        return true;
    }
}

인터셉터 등록

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private AuthenticationInterceptor authenticationInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(authenticationInterceptor).addPathPatterns("/**");
    }
}

3. 필터와 인터셉터의 차이점 (MSA 관점)

구분 필터(Filter) 인터셉터(Interceptor)
적용 위치 서블릿(Servlet) 수준 (API Gateway 또는 서비스 내부) Spring MVC 컨트롤러 수준
주요 사용 목적 보안, 인코딩, 로깅, API Gateway 라우팅 등 인증/인가, 컨트롤러 전/후의 비즈니스 검증, 로깅
적용 범위 모든 요청 (서블릿 전체에 적용) 컨트롤러로 전달되는 요청
설정 복잡성 비교적 간단 (서블릿 API 기반) Spring MVC 의존 (보다 세부적 제어 가능)
MSA 활용 공통 작업 처리 (예: CORS, 로깅) 컨트롤러 전/후 요청 처리 (예: 인증, 비즈니스 검증)

4. MSA에서의 활용 시나리오

  1. API Gateway에서 필터 사용:

    • 모든 서비스에 공통적으로 적용해야 하는 보안 작업(CORS, 인증).
    • 서비스 간 요청 추적을 위한 추적 ID 추가.
  2. 개별 서비스에서 필터 사용:

    • 서블릿 수준에서의 로깅, 요청 데이터 전처리.
  3. 인터셉터 사용:

    • 컨트롤러로 전달되는 요청에 대해 세부적인 인증/인가 처리.
    • 컨트롤러 결과를 기반으로 후속 작업 처리(예: 응답 데이터 가공).

결론

  • 필터는 MSA 환경에서 공통적으로 처리해야 하는 요청/응답 전처리(보안, 로깅 등)에 적합.
  • 인터셉터는 컨트롤러 중심의 요청/응답 처리(인증, 비즈니스 검증 등)에 적합.
  • MSA에서는 필터와 인터셉터를 조합하여 API Gateway개별 서비스 모두에서 요청 흐름을 효율적으로 관리할 수 있습니다.

'MSA' 카테고리의 다른 글

스프링 클라우드(SPRING CLOUD)의 글로벌 필터(Global Filter)  (0) 2024.12.16
UserContextHolder  (0) 2024.12.16
refresh  (0) 2024.12.16
Netflix Zuul ( API 게이트웨이 )  (1) 2024.12.16
폴백(Fallback)  (0) 2024.12.13

+ Recent posts