현재 Tomcat은 Connector의 Server 속성을 통해 헤더 내 Server 정보를 오버라이드할 수 있습니다.
그러나 더욱 강한 보안을 위해서는 아예 Server 정보를 없애야 할 필요가 있었죠. 그래서 일부 사용자는 소스 코드를 수정하여 Server 정보를 없애기도 했습니다.
그런데 Tomcat 8.5.3, 그리고 9.0.0.M7 부터는...
9.0.0.M4와 9.0.0.M8 간 테스트를 통해 확인해 보겠습니다.
1. Tomcat 9.0.0.M4
$ curl -I http://127.0.0.1:8080 HTTP/1.1 200 Server: Apache-Coyote/1.1 Content-Type: text/html;charset=UTF-8 Transfer-Encoding: chunked Date: Wed, 15 Jun 2016 01:05:04 GMT
2. Tomcat 9.0.0.M8
$ curl -I http://127.0.0.1:8080 HTTP/1.1 200 Content-Type: text/html;charset=UTF-8 Transfer-Encoding: chunked Date: Wed, 15 Jun 2016 01:05:57 GMT
이번에는 관련 소스 코드를 비교해 보려고 합니다.
9.0.0.M4, org/apache/coyote/http11/Constants.java
/** * Server string. */ public static final byte[] SERVER_BYTES = ByteChunk.convertToBytes("Server: Apache-Coyote/1.1" + CRLF);
9.0.0.M4, org/apache/coyote/http11/Http11Processor.java
// Add server header if (server != null) { // Always overrides anything the app might set headers.setValue("Server").setString(server); } else if (headers.getValue("Server") == null) { // If app didn't set the header, use the default outputBuffer.write(Constants.SERVER_BYTES); }
그런데 9.0.0.M8에서는 Constants.java 내 SERVER_BYTES가 없어졌습니다. 당연히 Http11Processor.java도 바뀌었겠죠.
// Add server header if (server == null) { if (serverRemoveAppProvidedValues) { headers.removeHeader("server"); } } else { // server always overrides anything the app might set headers.setValue("Server").setString(server); }
그런데 보이지 않던 변수가 생겼습니다. serverRemoveAppProvidedValues인데요.
/* * Should application provider values for the HTTP Server header be removed. * Note that if {@link #server} is set, any application provided vale will * be over-ridden. */ private boolean serverRemoveAppProvidedValues = false;
마지막으로 Tomcat Changelog를 살펴봅니다.
The HTTP Server header is no longer set by default. A Server header may be configured by setting the server attribute on the Connector. A new Connector attribute, serverRemoveAppProvidedValues may be used to remove any Server header set by a web application. (markt)
끝.