1. 概要

Spring Boot Webアプリケーションには、デフォルトで事前構成された組み込みWebサーバーが含まれています。 ただし、状況によっては、デフォルト構成を変更してカスタム要件を満たす必要があります。

このチュートリアルでは、SpringBoot2.xのapplication.propertiesファイルのリクエストヘッダーにmax-http-header-sizeプロパティを設定して使用する方法を説明します。応用。

2. Max-HTTP-Header-Size

Spring Bootは、組み込みサーバーとして Tomcat Undertow 、およびJettyをサポートします。 一般に、サーバー構成は、SpringBootアプリケーションのapplication.propertiesファイルまたはapplication.yamlファイル内に記述します。

ほとんどのWebサーバーには、HTTP要求ヘッダー用の独自のサイズ制限のセットがあります。 HTTPヘッダー値は、サーバーの実装によって制限されます。 Spring Bootアプリケーションでは、最大HTTPヘッダーサイズはserver.max-http-header-sizeを使用して構成されます。

TomcatとJettyの実際のデフォルト値は8kBで、Undertowのデフォルト値は1MBです。

最大HTTPヘッダーサイズを変更するには、プロパティをapplication.propertiesファイルに追加します。

server.max-http-header-size=20000

同様に、 application.yaml 形式の場合:

server:
    max-http-header-size: 20000

Spring Boot 2.1から、DataSizeの解析可能な値を使用するようになりました。

server.max-http-header-size=10KB

3. リクエストヘッダーが大きすぎます

HTTPヘッダーの合計サイズがmax-http-header-sizeの値より大きいリクエストが送信されたとします。 サーバーは「400Badrequest」エラーでリクエストを拒否します。 このエラーは、次の例のログファイルに表示されます。

tokenというヘッダープロパティを持つコントローラーを作成しましょう。

@RestController
@RequestMapping(value = "/request-header-test")
public class MaxHttpHeaderSizeController {
    @GetMapping
    public boolean testMaxHTTPHeaderSize(@RequestHeader(value = "token") String token) {
	return true;
    }
}

次に、application.propertiesファイルにいくつかのプロパティを追加しましょう。

## Server connections configuration
server.tomcat.threads.max=200
server.connection-timeout=5s
server.max-http-header-size=8KB
server.tomcat.max-swallow-size=2MB
server.tomcat.max-http-post-size=2MB

トークンに8kbを超えるサイズのString値を渡すと、次のように400エラーが発生します。

また、ログには次のエラーが表示されます。

19:41:50.757 [http-nio-8080-exec-7] INFO  o.a.coyote.http11.Http11Processor - Error parsing HTTP request header
 Note: further occurrences of HTTP request parsing errors will be logged at DEBUG level.
java.lang.IllegalArgumentException: Request header is too large
...

4. 解決

要件に応じて、application.propertiesファイルのmax-http-header-sizeプロパティの値を増やすことができます。

上記のプログラムでは、その値をデフォルトの8kbから40KBにアップグレードできます。これにより、問題が解決します。

server.max-http-header-size=40KB

これで、サーバーはリクエストを処理し、次のように200レスポンスを送り返します。

したがって、ヘッダーサイズがサーバーによってリストされたデフォルト値を超えると、サーバーが「リクエストヘッダーが大きすぎます」というエラーで400-Badリクエストを返すことがわかります。 上記の例に示すように、アプリケーション構成ファイルの max-http-header-size 値をオーバーライドして、リクエストヘッダーの長さに一致させる必要があります。

一般に、たとえば、使用されるトークンが暗号化のために非常に長い場合、要求ヘッダーが大きくなりすぎる可能性があります。

5. 結論

このチュートリアルでは、Spring Bootアプリケーションのアプリケーション構成ファイルでmax-http-header-sizeプロパティを使用する方法を学習しました。

次に、このサイズを超えるリクエストヘッダーを渡すとどうなるか、application.propertiesmax-http-header-sizeのサイズを大きくする方法を確認しました。

いつものように、これらの例のソースコードは、GitHubから入手できます。