| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 컨텍스트 맵
- Context map
- spring boot
- event
- Thymeleaf
- nopasswd
- 헥사고날 아키텍처
- rabbitmq
- Spring
- BOJ
- Domain Driven
- subdomain
- Spring Cloud
- 이벤트 기반
- DTO Projection
- android studio
- Hexagonal Architecture
- hexagonal
- clean architecture
- JPA
- Domain-Driven
- 백준
- 안드로이드 스튜디오
- CSRF
- 클린 아키텍처
- 공통 언어
- EC2
- Rabbit MQ
- 헥사고날
- Ubiquitous Language
Archives
- Today
- Total
취미겸생업
[Spring boot] Spring Cloud Gateway (API 게이트웨이) 본문
SMALL
Spring Cloud Gateway (API 게이트웨이)

API 게이트웨이란
- 클라이언트의 요청에 대한 단일 진입점으로 내부 서비스로 라우팅
- 보안, 로깅, 모니터링, 요청 필터링 등을 처리
Spring Cloud Gateway(SCG)란
- Spring 프로젝트의 일환으로 개발된 API 게이트웨이 라이브러리
- Spring Cloud Netflix 패키지의 일부로, 마이크로서비스 아키텍처에서 사용
Spring Cloud Gateway 주요 특징
- 동적 라우팅: 요청의 URL 패턴에 따라 동적으로 라우팅
- 필터링: 요청 전후에 다양한 작업을 수행할 수 있는 필터 체인 제공
- 모니터링: 요청 로그 및 메트릭을 통해 서비스 상태 모니터링
- 보안: 요청의 인증 및 권한 검증
- 로드밸런싱: 설정 시, 인스턴스 이름과 “lb” 키워드를 통해 Eureka와 통합되어 자동으로 로드밸런싱 (SCL, Spring Cloud Loadbalancer)
Spring Cloud 설정
build.gradle
dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-actuator' implementation 'org.springframework.cloud:spring-cloud-starter-gateway' // Spring Cloud Loadbalancer 또한 내장되어 있음 implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' }application.yml
spring: main: web-application-type: reactive # Spring 애플리케이션이 리액티브 웹 애플리케이션으로 설정됨 application: name: gateway-service # 애플리케이션 이름을 'gateway-service'로 설정 cloud: gateway: discovery: locator: enabled: true # 서비스 디스커버리를 통해 동적으로 라우트를 생성하도록 설정 routes: - id: users-service # 라우트 식별자 uri: lb://users-service # 'users-service'라는 이름으로 로드 밸런싱된 서비스로 라우팅 predicates: - Path=/users/** # /users/** 경로로 들어오는 요청을 이 라우트로 처리 - id: orders-service # 라우트 식별자 uri: lb://orders-service # 'orders-service'라는 이름으로 로드 밸런싱된 서비스로 라우팅 predicates: - Path=/orders/** #/orders/** 경로로 들어오는 요청을 이 라우트로 처리 eureka: client: service-url: defaultZone: http://localhost:8761/eureka/
Filtering
필터 종류
- Global Filter: 모든 요청에 대해 작동하는 필터
- Gateway Filter: 특정 라우트에만 적용되는 필터
필터 주요 객체
- Mono
- WebFlux의 리액티브 스트림 객체로, 필터 내에서 0개 또는 1개의 결과(주로 HTTP 비동기 처리 완료 신호)를 비동기로 반환하기 위해 사용됨
- ServerWebExchange
- HTTP 요청(Request)과 응답(Response)을 하나로 감싼 Spring의 컨텍스트 객체로, 필터 내부에서 헤더·쿠키·바디 데이터를 조회하거나 조작할 때 사용됨
- exchange.getRequest() : HTTP Request (ServerHttpRequest)
- exchange.getResponse() : HTTP Response 가져옴 (ServerHttpResponse)
- GatewayFilterChain
- 현재 필터 이후에 실행될 필터들이 엮여 있는 체인 객체
- chain.filter(exchange) 형태로 다음 필터에게 제어권을 넘겨 요청을 계속 진행
- Mono
시점별 필터 종류
구분 기준
- 백엔드 마이크로서비스로 요청을 넘기는 chain.filter(exchange) 호출 시점을 기준으로 로직의 실행 위치가 어디냐에 따라 구분합니다.
- chain.filter() 호출 전에 실행되면 Pre 필터, chain.filter()가 반환한 Mono
뒤에 .then()으로 예약되어 실행되면 Post 필터
Pre 필터 : 클라이언트의 요청이 백엔드 서비스로 전달되기 전(전처리 단계)에 실행되는 필터. 주로 인증, 인가, 요청 로그 기록, 헤더 변조 등에 사용됨
@Component public class PreFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { // 요청 로깅 System.out.println("Request: " + exchange.getRequest().getPath()); return chain.filter(exchange); } @Override public int getOrder() { // 필터의 순서를 지정합니다. return -1; // 필터 순서를 가장 높은 우선 순위로 설정합니다. } }Post 필터
@Component public class PostFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { return chain.filter(exchange).then(Mono.fromRunnable(() -> { // 응답 로깅 System.out.println("Response Status: " + exchange.getResponse().getStatusCode()); })); } @Override public int getOrder() { return -1; } }
Zuul
SCG(Spring Cloud Gatway)가 나오기 전, Netflix에서 오픈소스로 개발된 1세대 API 게이트웨이 프레임워크이다. 전통적인 Tomcat(Servlet)기반 블로킹 방식으로 구현되었으나, 현재는 WebFlux(Netty) 기반 논블로킹 비동기 방식의 SCG로 대체되었다.
한마디로, Zuul은 SCG로 대체되었으며, Spring boot 3.x 이후로는 라이브러리 자체가 Deprecated 되었기 때문에 사용되지 않는다.
Spring Cloud Gateway 보안
OAuth2란
- 토큰 기반의 인증 및 권한 부여 프로토콜
- 클라이언트 애플리케이션이 리소스 소유자의 권한을 얻어 보호된 리소스에 접근할 수 있도록 함
- 구성 요소
- 리소스 소유자, 클라이언트, 리소스 서버, 인증 서버
인증 방식
로그인 방식은 아래와 같으며, Authorization Code Grant를 제외한 나머지 방식은 보안에 문제점이 있기 때문에 사용하지 않는다. 단, Client Credentials Grant 방식은 특수한 상황에서 사용할 수 있다
- Authorization Code Grant: 인증 코드를 사용하여 액세스 토큰을 얻는 방식
- Implicit Grant: 클라이언트 애플리케이션에서 직접 액세스 토큰을 얻는 방식
- Resource Owner Password Credentials Grant: 사용자 이름과 비밀번호를 사용하여 액세스 토큰을 얻는 방식
- Client Credentials Grant: 클라이언트 애플리케이션이 자신의 자격 증명을 사용하여 액세스 토큰을 얻는 방식
JWT

- JWT(JSON Web Token)는 JSON 형식의 자가 포함된 토큰으로, 클레임(claim)을 포함하여 사용자에 대한 정보를 전달
- 구성 요소
- 헤더 : 토큰의 타입(JWT)과 서명에 사용된 암호화 알고리즘(예: HS256, RS256) 정보를 담고 있음 (Base64 인코딩)
- 페이로드 : 토큰에 담을 실질적인 정보(클레임, Claim)를 Key-Value 형태로 저장 (Base64 인코딩)
- 서명 : 인코딩된 헤더와 페이로드를 합친 뒤, 백엔드 서버가 가진 비밀키(Secret Key)를 이용해 헤더에서 지정한 알고리즘으로 해싱한 값, 토큰이 중간에 위변조되지 않았음을 검증하는 핵심 보안 장치
- 특성
- 자가 포함: 토큰 자체에 모든 정보를 포함하고 있어 별도의 상태 저장이 필요 없음
- 간결성: 짧고 간결한 문자열로, URL, 헤더 등에 포함
- 서명 및 암호화: 데이터의 무결성과 인증을 보장
LIST
'IT > Spring Boot' 카테고리의 다른 글
| [Spring boot] RabbitMQ (0) | 2026.07.27 |
|---|---|
| [Spring boot] Spring Cloud 분산 추적 (Micrometer, Zipkin) (0) | 2026.07.03 |
| [Spring boot] Spring Cloud Config (0) | 2026.07.03 |
| [Spring boot] Resilience4j 서킷 브레이커 (0) | 2026.07.01 |
| [Spring boot] Spring Cloud 로드밸런싱 (0) | 2026.06.30 |
