Max-HTTP-Header-Size trong Spring Boot 2

Spring Boot cung cấp các cấu hình mặc định và nhúng web server cho phép chúng ta có thể xây dựng ứng dụng một cách nhanh chóng. Tuy nhiên trong một số trường hợp chúng ta cần phải chỉnh sửa các cấu hình mặc định này sao cho phù hợp với yêu cầu.

Trong bài viết này chúng ta sẽ cùng nhau tìm hiểu cách tùy chỉnh thuộc tính max-http-header-size cho các request headers trong file cấu hình application.properties hay application.yml trong Spring 2.0.

Max-HTTP-Header-Size

Spring Boot hiện tại hỗ trợ nhúng Tomcat, Undertow, và Jetty server, chúng ta có thể cấu hình cho server của mình bằng cách chỉnh sửa trong application.properties hoặc application.yml tùy vào định dạng mà project các bạn đang sử dụng.

Hầu hết các web server đều cho phép điều chỉnh kích thước tối đa của HTTP Header, trong Spring Boot 2.0 chúng ta có thể cấu hình giá trị này bằng thuộc tính server.max-http-header-size.

Giá trị mặc định cho Tomcat và Jetty là 8kB và giá trị mặc định cho Undertow là 1MB. Chúng ta có thể chỉnh sửa giá trị này bằng cách chỉnh application.properties như sau:

server.max-http-header-size=20000

Tương tự với application.yml

server:
    max-http-header-size: 20000

Từ Spring Boot 2.1 chúng ta có thể chỉ định đơn vị đi kèm.

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

Request Header Is Too Large

Giả sử chúng ta gửi một HTTP request với kích thước của Header lớn hơn giá trị được đặt cho max-http-header-size. Server sẽ từ chối request và trả về lỗi  “400 Bad requestvà chúng ta sẽ thấy lỗi Request Header Is Too Large được log lại.

Ví dụ chúng ta có ứng dụng Spring Boot 2.0 với Controller sau:

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

Cấu hình server như sau

## 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

Khi chúng ta gửi HTTP request với giá trị của token lớn hơn 8KB thì chúng ta sẽ nhận được lỗi như bên dưới.

Và log sẽ tương tự như thế này

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
...

Để giải quyết lỗi này chúng ta tăng giá trị của thuộc tính max-http-header-size trong application.properties để phù hợp với yêu cầu. Gỉa sử trong ứng dụng trên, mình sẽ tăng từ 8Kb lên 40Kb.

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

Sau đó chạy lại ứng dụng và request sẽ không còn lỗi như trên nữa.

Do đó, bất cứ khi nào kích thước HTTP Header vượt quá giá trị mặc định của web server chúng ta sẽ thấy nó trả về 400-Bad Request kèm theo lỗi “request header is too large”. Lúc này chúng ta phải ghi đè giá trị max-http-header-size trong application.properties để phù hợp với kích thước của các HTTP Header.

Tóm lược

Qua bài viết này chúng ta đã tìm hiểu nguyên nhân gây ra lỗi 00-Bad Request kèm theo lỗi “request header is too large” và cách khắc phục bằng cách chỉnh giá trị max-http-header-size trong application.properties.

Nguồn tham khảo

https://www.baeldung.com/spring-boot-max-http-header-size

5 1 vote
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x