SCG) Global Filter 와 Custom Filter

알파로그·2023년 10월 13일
0

✏️ 필요성

  • 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) -> {
		
				// Req , Res 변수 생성
				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(() -> {

		            // 이곳에 응답 로그 작성

            }));
        }));
    }
}
profile
잘못된 내용 PR 환영

0개의 댓글