✏️ 필요성
- Spring Cloud Gateway 를 통과하는 모든 요청에 대한 정보를 추적하고,
유효한 요청인지 검증하기 위해서 Filter 기능이 필요하다.
- Global Filter 에서는 요청자의 ip, url 을 확인한다.
- Custom Filter 에서는 요청자의 JWT 의 유효성을 검증한다.
- 비회원 전용 api 는 Cutom Filter 를 거치지 않음
✏️ Global Filter
🔗 spring docs
📍 환경설정
- application.yml 에 글로벌 필터 설정을 해준다.
spring:
cloud:
gateway:
default-filters:
- GlobalFilter
📍 글로벌 필터 객체 생성
AbstractGatewayFilterFactory
를 상속해
@Slf4j
@Component
public class GlobalFilter extends AbstractGatewayFilterFactory<GlobalFilter.Config> {
public GlobalFilter() {
super(GlobalFilter.Config.class);
}
public static class Config {}
@Override
public GatewayFilter apply(Config config) {
return (((exchange, chain) -> {
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
}));
}));
}
}
@Override
public GatewayFilter apply(Config config) {
return (((exchange, chain) -> {
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
log.info("[글로벌 필터] REQUEST >>> IP : {}, URI : {}", request.getRemoteAddress().getAddress(), request.getURI());
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
log.info("[글로벌 필터] RESPONSE >>> IP : {}, URI : {}, Status : {}",
request.getRemoteAddress().getAddress(),
request.getURI(),
response.getStatusCode()
);
}));
}));
}
✏️ Custom Filter
📍 환경설정
- Custom Filter 는 라우팅쪽에 해주면 된다.
routes:
- id: member-service
uri: http://bk-m.1ll.ca:8081
predicates:
- Path=/api/member/**
filters: JwtValidFilter
- Custom Filter 객체
- 부모 객체의 제네릭은 해당 객체의 이름을 적어야 한다.
- 생성자와 Override 메서드 파라미터도 수정해준다.
@Slf4j
@Component
public class JwtValidFilter extends AbstractGatewayFilterFactory<JwtValidFilter.Config> {
public JwtValidFilter() {
super(Config.class);
}
public static class Config {
}
@Override
public GatewayFilter apply(Config config) {
return (((exchange, chain) -> {
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
}));
}));
}
}