MSA에서의 필터와 인터셉터
마이크로서비스 아키텍처(MSA)에서는 각 서비스가 독립적으로 운영되기 때문에 요청과 응답을 처리하는 과정에서 필터(Filter)와 인터셉터(Interceptor)의 역할이 중요합니다. 각각의 기능은 개별 서비스와 게이트웨이(API Gateway) 수준에서 활용될 수 있습니다.
1. MSA에서 필터(Filter)
필터의 역할
API Gateway 필터:
- API Gateway(예: Spring Cloud Gateway, Zuul 등)에서 요청을 전처리/후처리하는 데 사용됩니다.
- MSA에서는 API Gateway가 클라이언트와 백엔드 서비스 간의 중재 역할을 하므로, 필터는 공통적으로 적용해야 하는 로직을 처리하는 데 유용합니다.
개별 서비스 필터:
- 개별 마이크로서비스에서도 요청이 서블릿(Servlet)에 도달하기 전후에 동작합니다.
- 주로 보안, 로깅, 요청 데이터 검증 등의 작업에 사용됩니다.
필터 동작 흐름
- API Gateway 수준:
클라이언트 요청 → API Gateway 필터 → 라우팅 → 서비스 필터 → 서비스 컨트롤러. - 개별 서비스 수준:
클라이언트 요청 → 서비스 필터 → 서블릿 → 컨트롤러.
필터의 주요 사용 사례
- 보안 처리:
- JWT 토큰 검증.
- OAuth 인증 토큰 확인.
- CORS 처리:
- 클라이언트 도메인에 대한 접근 제어.
- 로깅 및 모니터링:
- 요청의 IP, 메서드, 경로 등을 로깅.
- 공통 헤더 추가:
- 요청/응답에 공통 헤더 추가(예: 추적 ID, 사용자 정보).
API Gateway에서의 필터 구현 (Spring Cloud Gateway 예시)
Spring Cloud Gateway는 GlobalFilter와 RouteFilter 두 가지 유형의 필터를 제공합니다.
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)
인터셉터의 역할
개별 마이크로서비스의 요청 처리:
- 각 마이크로서비스 내부에서 컨트롤러에 도달하기 전후로 요청을 가로채어 필요한 작업을 수행합니다.
- 컨트롤러에서만 처리해야 할 비즈니스 로직의 사전 검증이나 사용자 인증/인가에 활용됩니다.
공통 로직 처리:
- 여러 컨트롤러에서 공통적으로 처리해야 할 작업(예: 인증, 로깅)을 분리하여 관리.
인터셉터 동작 흐름
- 요청 흐름:
클라이언트 → 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에서의 활용 시나리오
API Gateway에서 필터 사용:
- 모든 서비스에 공통적으로 적용해야 하는 보안 작업(CORS, 인증).
- 서비스 간 요청 추적을 위한 추적 ID 추가.
개별 서비스에서 필터 사용:
- 서블릿 수준에서의 로깅, 요청 데이터 전처리.
인터셉터 사용:
- 컨트롤러로 전달되는 요청에 대해 세부적인 인증/인가 처리.
- 컨트롤러 결과를 기반으로 후속 작업 처리(예: 응답 데이터 가공).
결론
- 필터는 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 |