关于http header最大长度的那些事

引言

以前在项目中遇到一个关于http协议header部分最大长度限制的问题,我的以为颇有意思,因而写下这篇文章记录这个问题。html

http协议,超文本传输协议,HyperText Transfer Protocol,是互联网上应用最为普遍的一种网络协议,全部的WWW文件都遵照这个标准。关于http协议消息的格式,你们能够网上自行搜索,这里再也不赘述。本文关注的是其header部分,以下图所示(红框标注部分):java

关于http header最大长度的那些事

问题原型node

有一个web application提供web service,这个web application基于java开发,部署在tomcat容器上。问题是:当客户端发送一个GET请求,结果获得400的response,意思是说bad request。检查了这个request的代码实现逻辑,并无相关input validation的逻辑,而且检查server端日志发现,request请求彷佛并无到达咱们本身代码实现逻辑部分。这是为何呢?git

问题解释github

遇到这个问题时,第一步就是查看server端日志,可是以为很tricky的是,最开始并无发现相关的日志,只是发现request并无到达咱们本身代码实现逻辑部分。后来,mina同窗眼神很好,发现了以下日志:golang

关于http header最大长度的那些事

经过日志note信息发现,该条日志在info级别下只会打印一次,以后都会是debug级别才打印,难怪以前没有注意到这条日志。web

从日志信息可知,request的header部分太大,超过了tomcat容许的最大值。默认状况下,tomcat(8.0版本)容许的http请求header的最大值是8024个字节(8KB)。那为何以前没有出现这个问题呢?缘由是,项目迁移到SCP平台上以后,改为JWT token作权限校验,这个JWT token会被添加到request的header,然而JWT token通常来讲都很大(平均有6k个字节左右),因此说在增长了JWT token这个header以及其余一些相关的headers以后,整个request的header部分就超过8024个字节,因而就出现了这个问题。apache

那么如何解决这个问题呢?能够从两个方面考虑:tomcat

1.增长tomcat容许http header最大值。这个配置参数maxHttpHeaderSize能够设置tomcat容许的http header最大值。服务器

2.减小header的size,好比不要添加无关的header到request。

扩展

在研究这个问题的过程当中,其实还有一些其余疑问。首先,一个request的转发流程大体以下:

关于http header最大长度的那些事

那么,在这个流程中,为何request在前面的部分没有出现这个问题,而这个问题出如今最后一个技术栈是java/tomcat的component呢?

缘由是,每一个web服务器的http header最大长度的默认值不同,同时随语言、版本不一样也会不同。举个例子tomcat 5的http header size的默认值是4K。

我找到了其余component中对于http header size的默认值的定义:

  • CF Router是用Go语言实现,Go语言的http处理模块对于它的定义是默认值1MB。

关于http header最大长度的那些事

  • App Router是用Nodejs实现,Nodejs的http处理模块对它的定义是默认值80KB。

关于http header最大长度的那些事

以上两个默认值都要远远大于8KB,这也就解释了没什么问题出在最后一个component。

References

相关文章
相关标签/搜索