현재 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)

 

끝.