ルート述語ファクトリ

Spring Cloud Gateway は、Spring WebFlux HandlerMapping インフラストラクチャーの一部としてルートと一致します。Spring Cloud Gateway には、多くの組み込みルート述語ファクトリが含まれています。これらの述語はすべて、HTTP リクエストのさまざまな属性で一致します。複数のルート述語ファクトリを論理 and ステートメントと組み合わせることができます。

アフタールート述語ファクトリ

After ルート述語ファクトリは、1 つのパラメーター datetime (java ZonedDateTime)を取ります。この述語は、指定された日時以降に発生するリクエストと一致します。次の例では、アフタールート述語を設定します。

application.yml
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 述語を設定します。

application.yml
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 の後になければなりません。次の例では、ルート間述語を設定します。

application.yml
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 ルート述語ファクトリを設定します。

application.yml
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 つのパラメーターを取ります。この述語は、値が正規表現と一致する名前を持つヘッダーと一致します。次の例では、ヘッダールート述語を構成します。

application.yml
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 ヘッダーに一致します。次の例では、ホストルート述語を設定します。

application.yml
spring:
  cloud:
    gateway:
      routes:
      - id: host_route
        uri: https://example.org
        predicates:
        - Host=**.somehost.org,**.anotherhost.org

URI テンプレート変数({sub}.myhost.org など)もサポートされています。

このルートは、リクエストに www.somehost.orgbeta.somehost.orgwww.anotherhost.org の値を持つ Host ヘッダーがある場合に一致します。

この述語は、URI テンプレート変数(前の例で定義された sub など)を名前と値のマップとして抽出し、ServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE で定義されたキーを使用して ServerWebExchange.getAttributes() に配置します。これらの値は、GatewayFilter ファクトリで使用できるようになります。

メソッドルート述語ファクトリ

Method ルート述語ファクトリは 1 つ以上のパラメーターである methods 引数を取ります: 一致する HTTP メソッド。次の例では、メソッドルート述語を設定します。

application.yml
spring:
  cloud:
    gateway:
      routes:
      - id: method_route
        uri: https://example.org
        predicates:
        - Method=GET,POST

このルートは、リクエストメソッドが GET または POST の場合に一致します。

パスルート述語ファクトリ

Path ルート述語ファクトリは、Spring PathMatcher patterns のリストと matchTrailingSlash と呼ばれるオプションのフラグ(デフォルトは true)の 2 つのパラメーターを取ります。次の例では、パスルート述語を設定します。

application.yml
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/ は一致しません。

この述語は、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 つのパラメーターを取ります。次の例では、クエリルート述語を設定します。

application.yml
spring:
  cloud:
    gateway:
      routes:
      - id: query_route
        uri: https://example.org
        predicates:
        - Query=green

リクエストに green クエリパラメーターが含まれている場合、上記のルートは一致します。

application.yml
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 ルート述語を構成します。

application.yml
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 結果

[Integer.MIN_VALUE,0]

(無効、初期化中の IllegalArgumentException

1

0.0.0.3

2

0.0.0.2

3

0.0.0.1

[4, Integer.MAX_VALUE]

0.0.0.1

次の例は、Java で同じ構成を実現する方法を示しています。

GatewayConfig.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 つの引数を取ります。重みはグループごとに計算されます。次の例では、重みルート述語を構成します。

application.yml
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 ルート述語を構成します。

application.yml
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 などが含まれている場合に一致します。