SpringBoot2のMax-HTTP-Header-Size
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.propertiesでmax-http-header-sizeのサイズを大きくする方法を確認しました。
いつものように、これらの例のソースコードは、GitHubでから入手できます。