Daily log

Spring Cloud Gateway를 사용해서 API Gateway를 구축하고, 트래픽 관리, 인증/인가, 보안 등의 기능을 설정하는 방법을 알아봅니다.

Spring Cloud Gateway, 왜 써야 할까요?

Spring Cloud Gateway는 Spring 기반의 API Gateway 역할을 하는 프로젝트인데요. MSA(Microservices Architecture) 환경에서 빛을 발하는 친구입니다. MSA 환경에서는 여러 개의 작은 서비스들이 모여 하나의 애플리케이션을 구성하게 되는데, 이때 각 서비스로 들어오는 트래픽을 관리하고, 인증/인가를 처리하고, 보안을 강화하는 등의 역할을 API Gateway가 담당하게 되거든요. Spring Cloud Gateway는 바로 이런 역할을 아주 효과적으로 수행할 수 있도록 도와줍니다. 삼성SDS 인사이트리포트에 따르면, Spring Cloud를 활용하면 클라우드 네이티브 애플리케이션 개발에 유용하다고 하네요.


핵심 개념 정리

Spring Cloud Gateway를 제대로 사용하려면 몇 가지 핵심 개념을 알아두는 게 좋아요.

항목 설명 예시
Route 특정 조건에 맞는 요청을 특정 서비스로 연결하는 규칙 /api/user/** 패턴의 요청을 user-service로 연결
Predicate Route가 적용될 조건을 정의 Path, Header, Query Parameter 등
Filter 요청/응답을 가로채서 수정하거나 추가 기능을 수행 인증/인가, 로깅, 트래픽 제한 등

Spring Cloud Gateway 설정 따라하기

① 의존성 추가

먼저 pom.xml (Maven) 또는 build.gradle (Gradle)에 Spring Cloud Gateway 의존성을 추가해야 합니다.

Maven (pom.xml):

xml org.springframework.cloudspring-cloud-starter-gateway

Gradle (build.gradle):

gradle dependencies { implementation 'org.springframework.cloud:spring-cloud-starter-gateway' }

② Route 설정

application.yml 또는 application.properties 파일에 Route를 설정합니다. 여기서는 간단하게 /api/user/** 패턴의 요청을 user-service로 연결하는 설정을 해볼게요.

application.yml:

yaml spring: cloud: gateway: routes: - id: user-service-route uri: lb://user-service # LoadBalancer를 통해 user-service로 연결 predicates: - Path=/api/user/**

uri: lb://user-service는 LoadBalancer Client를 이용해서 user-service라는 이름의 서비스로 요청을 전달한다는 의미입니다. user-service는 Eureka 같은 서비스 디스커버리에 등록된 서비스 이름이겠죠.

③ Filter 설정 (인증/인가)

API Gateway의 중요한 역할 중 하나는 인증/인가 처리입니다. Spring Cloud Gateway는 다양한 Filter를 제공해서 인증/인가를 쉽게 구현할 수 있도록 도와줍니다. 예를 들어, JWT (JSON Web Token)를 사용해서 인증을 처리하는 Filter를 추가할 수 있습니다.

java @Configuration public class GatewayConfig {

@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
    return builder.routes()
            .route("user-service-route", r -> r.path("/api/user/**")
                    .filters(f -> f.filter(new JwtAuthenticationFilter())) // JWT 인증 필터 추가
                    .uri("lb://user-service"))
            .build();
}

}

JwtAuthenticationFilter는 직접 구현해야 하는 Filter인데요, 요청 헤더에서 JWT를 추출해서 검증하고, 유효하지 않은 토큰인 경우 에러를 반환하는 로직을 담고 있어야 합니다.

④ Rate Limiter 설정 (트래픽 제한)

과도한 트래픽으로 인해 서비스가 다운되는 것을 방지하기 위해 Rate Limiter를 설정할 수 있습니다.

application.yml:

yaml spring: cloud: gateway: routes: - id: user-service-route uri: lb://user-service predicates: - Path=/api/user/** filters: - RequestRateLimiter=redis-rate-limiter # Redis 기반 Rate Limiter 사용

Rate Limiter를 사용하려면 Redis 설정이 필요하고, 관련 의존성도 추가해야 합니다.


Spring Cloud Gateway, 써보니 어때요?

Spring Cloud Gateway를 사용해보니, MSA 환경에서 API Gateway를 구축하는 게 정말 편리해지더라고요. Route 설정이나 Filter 추가도 간단하고, 트래픽 관리나 보안 기능도 쉽게 적용할 수 있어서 좋았습니다. 특히, Spring 생태계와의 연동이 잘 되어 있어서 Spring Boot 기반의 애플리케이션과 함께 사용하기에 아주 적합하다는 생각이 들었어요.

물론, 처음에는 설정이 조금 복잡하게 느껴질 수도 있지만, Spring Cloud Gateway의 개념과 동작 방식을 이해하고 나면 금방 익숙해질 수 있을 거예요. 앞으로 MSA 환경에서 API Gateway를 구축해야 한다면 Spring Cloud Gateway를 적극적으로 활용해볼 생각입니다.

출처: 스프링 클라우드(Spring Cloud)를 활용한 클라우드 네이티브 애플리케이션 개발 | 인사이트리포트 | 삼성SDS

공유하기

facebook twitter kakaoTalk kakaostory naver band