ルート述語ファクトリ
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.org
URI テンプレート変数({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/
は一致しません。
この述語は、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
などが含まれている場合に一致します。