ルート述語ファクトリ
Spring Cloud Gateway は、Spring WebFlux HandlerMapping インフラストラクチャーの一部としてルートと一致します。Spring Cloud Gateway には、多くの組み込みルート述語ファクトリが含まれています。これらの述語はすべて、HTTP リクエストのさまざまな属性で一致します。複数のルート述語ファクトリを論理 and ステートメントと組み合わせることができます。
アフタールート述語ファクトリ
After ルート述語ファクトリは、1 つのパラメーター datetime (java ZonedDateTime)を取ります。この述語は、指定された日時以降に発生するリクエストと一致します。次の例では、アフタールート述語を設定します。
spring:
cloud:
gateway:
routes:
- id: after_route
uri: https://example.org
predicates:
- After=2017-01-20T17:42:47.789-07:00[America/Denver]このルートは、2017 年 1 月 20 日 17:42 山岳部標準時(デンバー)以降に行われたすべてのリクエストに一致します。
ビフォアルート述語ファクトリ
Before ルート述語ファクトリは、1 つのパラメーター datetime (java ZonedDateTime)を取ります。この述語は、指定された datetime の前に発生するリクエストと一致します。次の例では、beforeroute 述語を設定します。
spring:
cloud:
gateway:
routes:
- id: before_route
uri: https://example.org
predicates:
- Before=2017-01-20T17:42:47.789-07:00[America/Denver]このルートは、2017 年 1 月 20 日 17:42 山岳部標準時(デンバー)より前に行われたすべてのリクエストに一致します。
ルート間述語ファクトリ
Between ルート述語ファクトリは、java ZonedDateTime オブジェクトである datetime1 と datetime2 の 2 つのパラメーターを取ります。この述語は、datetime1 の後および datetime2 の前に発生するリクエストと一致します。datetime2 パラメーターは datetime1 の後になければなりません。次の例では、ルート間述語を設定します。
spring:
cloud:
gateway:
routes:
- id: between_route
uri: https://example.org
predicates:
- Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]このルートは、2017 年 1 月 20 日 17:42 山岳部標準時(デンバー)以降および 2017 年 1 月 21 日 17:42 山岳部標準時(デンバー)より前に行われたすべてのリクエストに一致します。これは、メンテナンスウィンドウに役立つ可能性があります。
クッキールート述語ファクトリ
Cookie ルート述語ファクトリは、Cookie name と regexp (Java 正規表現)の 2 つのパラメーターを取ります。この述語は、指定された名前を持ち、値が正規表現と一致する Cookie と一致します。次の例では、Cookie ルート述語ファクトリを設定します。
spring:
cloud:
gateway:
routes:
- id: cookie_route
uri: https://example.org
predicates:
- Cookie=chocolate, ch.p このルートは、値が ch.p 正規表現と一致する chocolate という名前の Cookie を持つリクエストに一致します。
ヘッダールート述語ファクトリ
Header ルート述語ファクトリは、header と regexp (Java 正規表現)の 2 つのパラメーターを取ります。この述語は、値が正規表現と一致する名前を持つヘッダーと一致します。次の例では、ヘッダールート述語を構成します。
spring:
cloud:
gateway:
routes:
- id: header_route
uri: https://example.org
predicates:
- Header=X-Request-Id, \d+ このルートは、リクエストに X-Request-Id という名前のヘッダーがあり、その値が \d+ 正規表現と一致する場合(つまり、1 桁以上の値を持つ場合)に一致します。
ホストルート述語ファクトリ
Host ルート述語ファクトリは 1 つのパラメーターを取ります: ホスト名 patterns のリスト。パターンは、. をセパレーターとする Ant スタイルのパターンです。この述語は、パターンに一致する Host ヘッダーに一致します。次の例では、ホストルート述語を設定します。
spring:
cloud:
gateway:
routes:
- id: host_route
uri: https://example.org
predicates:
- Host=**.somehost.org,**.anotherhost.orgURI テンプレート変数({sub}.myhost.org など)もサポートされています。
このルートは、リクエストに www.somehost.org、beta.somehost.org、www.anotherhost.org の値を持つ Host ヘッダーがある場合に一致します。
この述語は、URI テンプレート変数(前の例で定義された sub など)を名前と値のマップとして抽出し、ServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE で定義されたキーを使用して ServerWebExchange.getAttributes() に配置します。これらの値は、GatewayFilter ファクトリで使用できるようになります。
メソッドルート述語ファクトリ
Method ルート述語ファクトリは 1 つ以上のパラメーターである methods 引数を取ります: 一致する HTTP メソッド。次の例では、メソッドルート述語を設定します。
spring:
cloud:
gateway:
routes:
- id: method_route
uri: https://example.org
predicates:
- Method=GET,POST このルートは、リクエストメソッドが GET または POST の場合に一致します。
パスルート述語ファクトリ
Path ルート述語ファクトリは、Spring PathMatcher patterns のリストと matchTrailingSlash と呼ばれるオプションのフラグ(デフォルトは true)の 2 つのパラメーターを取ります。次の例では、パスルート述語を設定します。
spring:
cloud:
gateway:
routes:
- id: path_route
uri: https://example.org
predicates:
- Path=/red/{segment},/blue/{segment} このルートは、リクエストパスが /red/1 または /red/1/ または /red/blue または /blue/green の場合に一致します。
matchTrailingSlash が false に設定されている場合、リクエストパス /red/1/ は一致しません。
spring.webflux.base-path プロパティを設定した場合、パスマッチングに影響します。このプロパティ値はパスパターンの先頭に自動的に追加されます。例: spring.webflux.base-path=/app でパスパターンが /red/{segment} の場合、マッチングに使用される完全なパターンは /app/red/{segment} になります。
この述語は、URI テンプレート変数(前の例で定義された segment など)を名前と値のマップとして抽出し、ServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE で定義されたキーを使用して ServerWebExchange.getAttributes() に配置します。これらの値は、GatewayFilter ファクトリで使用できるようになります。
これらの変数へのアクセスを容易にするために、ユーティリティメソッド(get と呼ばれる)を使用できます。次の例は、get メソッドの使用方法を示しています。
Map<String, String> uriVariables = ServerWebExchangeUtils.getUriTemplateVariables(exchange);
String segment = uriVariables.get("segment");クエリルート述語ファクトリ
Query ルート述語ファクトリは、必須の param とオプションの regexp (Java 正規表現)の 2 つのパラメーターを取ります。次の例では、クエリルート述語を設定します。
spring:
cloud:
gateway:
routes:
- id: query_route
uri: https://example.org
predicates:
- Query=green リクエストに green クエリパラメーターが含まれている場合、上記のルートは一致します。
spring:
cloud:
gateway:
routes:
- id: query_route
uri: https://example.org
predicates:
- Query=red, gree. 上記のルートは、リクエストに gree. 正規表現と値が一致する red クエリパラメーターが含まれている場合に一致するため、green と greet が一致します。
RemoteAddr ルート述語ファクトリ
RemoteAddr ルート述語ファクトリは sources のリスト(最小サイズ 1)を取得します。これは、192.168.0.1/16 (192.168.0.1 は IP アドレス、16 はサブネットマスク)などの CIDR 表記(IPv4 または IPv6)文字列です。次の例では、RemoteAddr ルート述語を構成します。
spring:
cloud:
gateway:
routes:
- id: remoteaddr_route
uri: https://example.org
predicates:
- RemoteAddr=192.168.1.1/24 このルートは、リクエストのリモートアドレスがたとえば 192.168.1.10 であった場合に一致します。
リモートアドレスの解決方法の変更
デフォルトでは、RemoteAddr ルート述語ファクトリは受信リクエストからのリモートアドレスを使用します。Spring Cloud Gateway がプロキシ層の背後にある場合、これは実際のクライアント IP アドレスと一致しない可能性があります。
カスタム RemoteAddressResolver を設定することにより、リモートアドレスを解決する方法をカスタマイズできます。Spring Cloud Gateway には、X-Forwarded-For ヘッダー [Mozilla] 、XForwardedRemoteAddressResolver に基づくデフォルト以外のリモートアドレスリゾルバーが 1 つ付属しています。
XForwardedRemoteAddressResolver には 2 つの静的コンストラクターメソッドがあり、セキュリティに対して異なるアプローチを取ります。
XForwardedRemoteAddressResolver::trustAllは、X-Forwarded-Forヘッダーで見つかった最初の IP アドレスを常に取得するRemoteAddressResolverを返します。このアプローチは、悪意のあるクライアントがX-Forwarded-Forの初期値を設定する可能性があるため、スプーフィングに対して脆弱です。これは、リゾルバーによって受け入れられます。XForwardedRemoteAddressResolver::maxTrustedIndexは、Spring Cloud Gateway の前で実行されている信頼できるインフラストラクチャの数に相関するインデックスを取ります。たとえば、Spring Cloud Gateway が HAProxy を介してのみアクセス可能である場合は、値 1 を使用する必要があります。Spring Cloud Gateway にアクセスする前に信頼できるインフラストラクチャの 2 ホップが必要な場合は、値 2 を使用する必要があります。
次のヘッダー値を検討してください。
X-Forwarded-For: 0.0.0.1, 0.0.0.2, 0.0.0.3 次の maxTrustedIndex 値は、次のリモートアドレスを生成します。
maxTrustedIndex | 結果 |
|---|---|
[ | (無効、初期化中の |
1 | 0.0.0.3 |
2 | 0.0.0.2 |
3 | 0.0.0.1 |
[4, | 0.0.0.1 |
次の例は、Java で同じ構成を実現する方法を示しています。
RemoteAddressResolver resolver = XForwardedRemoteAddressResolver
.maxTrustedIndex(1);
...
.route("direct-route",
r -> r.remoteAddr("10.1.1.1", "10.10.1.1/24")
.uri("https://downstream1")
.route("proxied-route",
r -> r.remoteAddr(resolver, "10.10.1.1", "10.10.1.1/24")
.uri("https://downstream2")
)ウェイトルート述語ファクトリ
Weight ルート述語ファクトリは、group と weight (int)の 2 つの引数を取ります。重みはグループごとに計算されます。次の例では、重みルート述語を構成します。
spring:
cloud:
gateway:
routes:
- id: weight_high
uri: https://weighthigh.org
predicates:
- Weight=group1, 8
- id: weight_low
uri: https://weightlow.org
predicates:
- Weight=group1, 2このルートは、トラフィックの最大 80% を weighthigh.org (英語) に転送し、トラフィックの最大 20% を weightlow.org (英語) に転送します。
XForwarded リモート Addr ルート述語ファクトリ
XForwarded Remote Addr ルート述語ファクトリは sources のリスト(最小サイズ 1)を取得します。これは、192.168.0.1/16 (192.168.0.1 は IP アドレス、16 はサブネットマスク)などの CIDR 表記(IPv4 または IPv6)文字列です。
このルート述語を使用すると、X-Forwarded-For HTTP ヘッダーに基づいてリクエストをフィルターに掛けることができます。
これは、ロードバランサーや Web アプリケーションファイアウォールなどのリバースプロキシで使用できます。この場合、リクエストは、これらのリバースプロキシで使用される IP アドレスの信頼できるリストからのものである場合にのみ許可されます。
次の例では、XForwardedRemoteAddr ルート述語を構成します。
spring:
cloud:
gateway:
routes:
- id: xforwarded_remoteaddr_route
uri: https://example.org
predicates:
- XForwardedRemoteAddr=192.168.1.1/24 このルートは、X-Forwarded-For ヘッダーに 192.168.1.10 などが含まれている場合に一致します。