ํด๋น ๊ธ์ Spring Cloud Gateway ์ Built-in Route๋ก Predicates์ Filter ์กฐ์ํ๊ธฐ) ์ ์์กดํ๋ ๊ธ์ ๋๋ค. ์ค์ต ํ๊ฒฝ์ ๋ฐ๋ผํ์๋ ค๋ฉด ์ด์ ๊ธ์ ํ์ธํ์๊ธธ ๋ฐ๋๋๋ค.
ํ์ฌ ๊ธ์์๋ ๋ชจ๋ ์ธ์ฆ ๊ณผ์ (jwt ํ ํฐ์ ๋ฐ๊ธํ๊ณ payload ์ ๊ฐ์ ๋ฃ๋ ์ค์ ๊ตฌํ)์ ํ์ง ์์ต๋๋ค. ์ด๋ฒ ๊ธ์ ๋ชฉ์ ์ Gateway ์์ Custom Filter ๋ง๋ค์ด์ ํ ํฐ ๊ฒ์ฆ์ ์ํํ๋ ์ ์ฒด์ ์ธ ํฐ ๊ทธ๋ฆผ๋ง ๋ณด์ฌ์ฃผ๋ ค ํ๊ธฐ ๋๋ฌธ์ ์ค์ ์ธ์ฆ์ ๊ตฌํํ๋ ค ํ๋ค๋ฉด ์ฐธ๊ณ ๋ง ํ์๊ธธ ๋ฐ๋๋๋ค.
๋ชฉ์ฐจ
- Custom Filter
- AbstractGatewayFilterFactory ์์๊ณผ apply ์ฌ์ ์
- ๊ฒ์ฆํ๊ธฐ
Custom Filter
์ง๋ ์๊ฐ๊น์ง ์ฐ๋ฆฌ๋ Spring Cloud Gateway๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ Built-in Predicates์ Filters๋ฅผ ์์๋ณด์๋ค.
์ด๋ฒ ์๊ฐ์๋ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ธฐ๋ฅ์ ์ํํ๋ Custom Filter๋ฅผ ๋ง๋ค๊ณ Gateway Filters์ ๋ฑ๋กํด๋ณด์.
๋ฌด์์ ๋ง๋ค ๊ฒ์ธ๊ฐ?
๊ฐ๋จํ๊ฒ ๋ง ํ๋ฉด JWT ํ ํฐ ํ์ฑ์ ํ๋ Filter๋ฅผ ๋ง๋ค ๊ฒ์ด๋ค.
Microservice ์์ ์ธ์ฆ์ Stateless ํ ๋ฐฉ์์ ์ ์ฉํ๋ ๊ฒ์ด ๋ถ๊ฐํผํ๋ค.
๋ง์ฝ ๊ทธ๋ ์ง ์์ Session-Cookie ๊ธฐ๋ฐ ์ธ์ฆ์ ์ฌ์ฉํ๊ฒ ๋๋ค๋ฉด ๋ชจ๋ ์๋ฒ๊ฐ ํ๋์ DB๋ฅผ ๋ฐ๋ผ๋ณด๊ณ ์ฌ์ฉ์์ Session๊ณผ Cookie๋ฅผ ๊ด๋ฆฌํ๊ฑฐ๋ ๋ชจ๋ ์๋ฒ์์ Session์ ๋ฐ๋ก ๊ด๋ฆฌํด์ผ ํ๋ค.
ํ์ง๋ง Request Header์ Token String์ ๋ด์ statelessํ ์ธ์ฆ์ ์ฌ์ฉํ๋ฉด ์์ ๋ฌธ์ ๋ฅผ ์ฝ๊ฒ ํด๊ฒฐํ ์ ์๋ค.
๊ทธ๋ ๊ธฐ์ ์ฐ๋ฆฌ๋ ํ ํฐ์ ์ด์ฉํ ์ธ์ฆ ๋ฐฉ์์ ์ํด Gateway๋ฅผ ์ฌ์ฉํ๋ค.
์ ์ธ์ฆ์ Gateway์์ ํ ๊น?
๊ทธ ์ด์ ๋ ๋ฐ๋ก Gateway์ ํ๋ฆ์ ๋ณด๋ฉด ์ ์ ์๋ค.
์์์ ๋ณธ๋ค๋ฉด ๋น์ฐํ๊ฒ ๋ชจ๋ ์์ฒญ์ด Gateway๋ก ๋ชฐ๋ฆฌ๊ฒ ๋๋ค.
๊ทธ๋ผ ๊ฐ๊ฐ์ ์๋ฒ์์ ์ธ์ฆ์ ํ ํ์ ์์ด Gateway ์์ ํ ๋ฒ๋ง ์ธ์ฆ์ ์ํํ๊ณ , ๋ค๋ฅธ ์๋ฒ๋ค์ ์์ฒญ์ด ์ค๋ฉด ์ธ์ฆ๋ ์์ ์์ฒญ์ด๋ผ๊ณ ํ๋ฉด ์ด๋จ๊น?
๋ฌผ๋ก ์ด๋ ํ ์ํฉ์์๋ ๋ชจ๋ ๊ณต๊ฒฉ์ ๋ง์ ์๋ ์๊ฒ ์ง๋ง ๋น์ฅ์ผ๋ก์๋ ํด๋น ๋ฐฉ๋ฒ์ด ์ข์๊ฒ ๊ฐ๊ณ ์ถฉ๋ถํ ์ด๋ฅผ ๊ตฌํํ ๋ง ํ๋ค.
๊ทธ๋ผ ์ง๊ธ๋ถํฐ ์ปค์คํ ํํฐ๋ฅผ ๋ง๋ค๊ณ ์ธ์ฆ์ ์ํํ๋ ๊ณผ์ ์ ์ถ๊ฐํด๋ณด์.
์์ ๋งํ์ง๋ง ํ์ฌ ๊ธ์์๋ ๋ชจ๋ ์ธ์ฆ ๊ณผ์ , jwt ํ ํฐ์ ๋ฐ๊ธํ๊ณ payload ์ ๊ฐ์ ๋ฃ๋ ์ค์ ๊ตฌํ์ ํ์ง ์์ผ๋ ค ํ๋ค. ์ด๋ฒ ๊ธ์ ๋ชฉ์ ์ ์ปค์คํ ํํฐ๋ฅผ ๋ง๋ค์ด์ ํ ํฐ ๊ฒ์ฆ์ ์ํํ๋ ์ ์ฒด์ ์ธ ํฐ ๊ทธ๋ฆผ๋ง ๋ณด์ฌ์ฃผ๋ ค ํ๊ธฐ ๋๋ฌธ์ ์ค์ ์ธ์ฆ์ ๊ตฌํํ๋ ค ํ๋ค๋ฉด ์ฐธ๊ณ ๋ง ํ๊ธธ ๋ฐ๋๋ค.
CustomAuthFilter๋ก ์ธ์ฆ ๊ตฌํํ๊ธฐ
Spring Cloud Gateway๋ Zuul ์ ๋น๋๊ธฐ ํต์ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋ ๋ฒ์ ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ์ฝ๋ค.
๊ทธ๋์ Blocking ๊ตฌ์กฐ๊ฐ ์๋ Non-Blocking ๊ตฌ์กฐ์ธ Spring WebFlux ๋ก ๊ตฌํ๋์ด ์๊ธฐ ๋๋ฌธ์ Filter๋ค์ ๋ชจ๋ Flux๋ก ๊ตฌํํด์ผ ํ๋ค.
ํ ํฐ์ ๊ฒ์ฆํ๋ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ด ํ๋ฌ๊ฐ ๊ฒ์ด๋ค.
- ์ฌ์ฉ์ ์์ฒญ
- Handler Mapping ์ด Predicates ๊ฒ์ฌ
- Pre Filter ์์ Request Header ์ ์๋ token ํ์ฑ
- ๋ง์ฝ ์กด์ฌํ์ง ์๋๋ค๋ฉด 401 Error Reject
- ์กด์ฌํ๋ค๋ฉด ์ฌ์ฉ์๊ฐ ์์ฒญํ ์๋ฒ๋ก ์์ฒญ ์ ๋ฌ
CustomFilter.class ์์ฑํ๊ธฐ
์ฐ์ ์ฌ์ฉ์ ์ ์ ํํฐ๋ฅผ ๋ง๋ค๊ธฐ ์ํด์๋ Spring Cloud Gateway ๊ฐ ์ถ์ํํด ๋์ AbstractGatewayFilterFactory
๋ฅผ ์์๋ฐ๋๋ค.
๊ทธ๋ฆฌ๊ณ GatewayFilterFactory ๋ฅผ ๊ตฌํํ ๋ ์ฐ๋ฆฌ์ ๋ก์ง์ ๋ฃ์ผ๋ฉด ๋๋๋ฐ, ํด๋น ์ถ์ํ ๋ฉ์๋๋ฅผ GatewayFilter apply(Config config)
override ํ๋ค.
@Component
public class CustomAuthFilter extends AbstractGatewayFilterFactory<CustomAuthFilter.Config> {
public CustomAuthFilter() {
super(Config.class);
}
@Override
public GatewayFilter apply(Config config) {
return null;
}
public static class Config {
}
}
Config class ์์๋ Configuration ์์ฑ๋ค์ ๋ฃ์ด์ฃผ๋ฉด ๋๋๋ฐ, ๋ค์์ ์์ Global Filter์์ ์์ธํ๊ฒ ์ด์ผ๊ธฐํด๋ณด๋ ค ํ๋ค.
ํ์ฌ๋ ๊ทธ๋ฅ ๋น์ด์๋ ํด๋์ค๋ก ๋ฃ์ด์ฃผ์.
ํ ํฐ ๊ฒ์ฆ ๋ก์ง ์ถ๊ฐํ๊ธฐ
์ด์ ํ ํฐ ๊ฒ์ฆ์ ํ ๋ก์ง์ apply ๋ฉ์๋์ ์ถ๊ฐํ๋ฉด ๋๋ค.
@Component
public class CustomAuthFilter extends AbstractGatewayFilterFactory<CustomAuthFilter.Config> {
public CustomAuthFilter() {
super(Config.class);
}
@Override
public GatewayFilter apply(Config config) {
return ((exchange, chain) -> {
});
}
public static class Config {
}
}
apply ๋ฉ์๋ ์์์ ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ ServerWebExchange ํํ๊ณ ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๊ฐ GatewayFilterChain ๋๋ค ํจ์์ด๋ค.
ServerHttpRequest request = exchange.getRequest(); // Pre Filter
ServerHttpResponse response = exchange.getResponse(); // Post Filter
exchange ์ Request๋ฅผ ๋ฐ์์ค๋ฉด Pre Filter๋ก ์ ์ฉ๋๊ณ Post Filter๋ Response๋ก ๋ฐ์์ค๋ฉฐ ๋๋ค.
์ฃผ์ํด์ผํ ์ ์ด ServletReqeust, Response๊ฐ ์๋ Spring Reactive ์ Response, Requset์ฌ์ผ ํ๋ค.
ํ ํฐ ๊ฒ์ฆ ๋ก์ง ์์ฑํ๊ธฐ
@Component
public class CustomAuthFilter extends AbstractGatewayFilterFactory<CustomAuthFilter.Config> {
public CustomAuthFilter() {
super(Config.class);
}
@Override
public GatewayFilter apply(Config config) {
return ((exchange, chain) -> {
ServerHttpRequest request = exchange.getRequest();
// Request Header ์ token ์ด ์กด์ฌํ์ง ์์ ๋
if(!request.getHeaders().containsKey("token")){
return handleUnAuthorized(exchange); // 401 Error
}
// Request Header ์์ token ๋ฌธ์์ด ๋ฐ์์ค๊ธฐ
List<String> token = request.getHeaders().get("token");
String tokenString = Objects.requireNonNull(token).get(0);
// ํ ํฐ ๊ฒ์ฆ
if(!tokenString.equals("A.B.C")) {
return handleUnAuthorized(exchange); // ํ ํฐ์ด ์ผ์นํ์ง ์์ ๋
}
return chain.filter(exchange); // ํ ํฐ์ด ์ผ์นํ ๋
});
}
private Mono<Void> handleUnAuthorized(ServerWebExchange exchange) {
ServerHttpResponse response = exchange.getResponse();
response.setStatusCode(HttpStatus.UNAUTHORIZED);
return response.setComplete();
}
public static class Config {
}
}
application.yml์ ์ฐ๋ฆฌ๊ฐ ์ ์ํ CustomFilter ๋ฑ๋กํ๊ธฐ
server:
port: 8000
spring:
application:
name: gateway-service
cloud:
gateway:
routes:
- id: user-service
uri: lb://USER-SERVICE
predicates:
- Path=/user/**
filters:
- RewritePath=/user/?(?<segment>.*), /$\{segment}
- CustomAuthFilter
- id: order-service
uri: lb://ORDER-SERVICE
predicates:
- Path=/order/**
filters:
- RewritePath=/user/?(?<segment>.*), /$\{segment}
user-serivce ์ CustomAuthFilter ๋ฅผ ์ถ๊ฐ์์ผ์ฃผ๋ฉด ์ฐ๋ฆฌ์ ํํฐ๊ฐ ๋๋์ด Gateway ์ ๋ค์ด๊ฐ๊ฒ ๋๋ ๊ฒ์ด๋ค.
๊ฒ์ฆํ๊ธฐ
์ฐ๋ฆฌ์ ํํฐ๊ฐ ์ ๋์ํ๋์ง ๊ฒ์ฆํ๊ธฐ ์ํด์ ๊ธฐ์กด์ ๊ตฌ์ฑํ๋ Service Mesh์ Microservices ๋ฅผ ์คํ์์ผ๋ณด์.
- Eureka Server
- Gateway Service
- User Service
- Order Service
๊ทธ๋ฆฌ๊ณ Gateway๋ก user service์ GET /info ์์ฒญ์ ๋ณด๋ด๋ณด์.
ํ ํฐ ์์ด ์์ฒญ ๋ณด๋ด๊ธฐ
ํ์ฌ ์์ฒญ์๋ Request Header ์ token ํ๋๊ฐ ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ 401 ์๋ฌ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
invalid ํ ํ ํฐ์ ํฌํจํ ์์ฒญ ๋ณด๋ด๊ธฐ
ํ ํฐ ๊ฒ์ฆ ๋ก์ง์์ A.B.C ๋ผ๋ ํ ํฐ์ด ์์ผ์ง๋ง ์ ์ ์์ฒญ์ ๋ณด๋ด๊ฒ ํ๋๋ฐ, ์๋ชป๋ ํ ํฐ์ ๋ณด๋ด๋ณด์.
์ญ์ 401 ์๋ฌ๋ก ์ ๊ทผํ์ง ๋ชปํ๊ฒ ๋๋ค.
valid ํ ํ ํฐ์ ํฌํจํ ์์ฒญ ๋ณด๋ด๊ธฐ
์ด๋ฒ์๋ Valid ํ ํ ํฐ, A.B.C ๊ฐ์ ํค๋์ ํฌํจ์์ผ ์์ฒญ์ ๋ณด๋ด๋ณด์.
๊ทธ๋ผ ์์๊ฐ์ด 200 OK๋ก ์ ์์ ์ผ๋ก ์ฐ๋ฆฌ์ ์์ฒญ์ด ๋ก๋๋ฐธ๋ฐ์ฑ ๋ User-Service๋ก ๋์ฐฉํ๊ฒ ๋๋ค.
์ค๋์ ์ด๋ ๊ฒ Spring Cloug Gateway๋ฅผ ์ด์ฉํด์ ๊ฐ๋จํ ์ธ์ฆ ํํฐ๋ฅผ ๊ตฌํํด๋ณด์๋ค.
์ด๋ฐ ์ธ์ฆ์ ๊ทธ ์ด๋ค ์๋น์ค์์๋ ์ฌ์ฉํ์ง ์๊ฒ ์ง๋ง ์ธ์ฆ์ ์ํ ํ ํฐ ๊ฒ์ฆ ํ๋ฆ์ ํฌ๊ฒ ๋ค๋ฅด์ง ์์ ๊ฒ์ด๋ค.
ํด๋น ๊ธ์ ๋ณด๊ณ ํ๋ฆ์ ํ์ ํ ๋ค ๊ฐ์์ ํ๋ก์ ํธ์ ์ฑ๊ณต์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ํ๋ค.
๋๊ธ