프로그래밍/Python

[Python] Flask - Server 헤더 변경하기

채윤아빠 2024. 7. 3. 09:47

개요

Python Flask로 웹 애플리케이션을 구현하고, 서버의 응답 헤더를 보면 다음과 같은 형태로 표시됩니다.

HTTP/1.1 200 OK
Server: Werkzeug/2.2.2 Python/3.11.2
Date: Tue, 07 Jan 2025 03:00:59 GMT
Content-type: application/json; charset=utf-8
Content-Length: 1043
Connection: close


"Server" 헤더에 Flask 및 Python 버전 정보가 표시됩니다.


본 글에서는 보안상의 이유 등으로 "Server" 헤더 정보를 변경하는 방법에 대하여 자세히 살펴 보겠습니다.


WSGIRequestHandler.server_version

응답의 "Server" 헤더 정보를 변경하는 가장 확실한 방법은 "WSGIRequestHandler.server_version" 및 "WSGIRequestHandler.sys_version"를 설정하는 것입니다.

    # Server 헤더 변경
    WSGIRequestHandler.server_version = 'hbesthee test server'
    WSGIRequestHandler.sys_version = ''


Flask 객체를 생성한 뒤에 위와 같이 변경하면, 서버의 응답은 다음과 같이 변경됩니다.

HTTP/1.1 200 OK
Server: hbesthee test server
Date: Tue, 07 Jan 2025 03:00:59 GMT
Content-type: application/json; charset=utf-8
Content-Length: 1043
Connection: close

그 밖에 실패한 방법들

Response.headers

각 응답하는 부분에서 다음과 같이 Response.headers 에 직접 "Server" 헤더를 추가하는 방법입니다.

@app.route('/')
def hello():
    response = make_response('Hello World!')
    response.headers['Server'] = 'hbesthee test server'  # 여기에 원하는 문자열 입력
    return response
HTTP/1.1 200 OK
Server: Werkzeug/2.2.2 Python/3.11.2
Date: Tue, 07 Jan 2025 03:00:59 GMT
Content-type: application/json; charset=utf-8
Content-Length: 1043
Server: hbesthee test server
Connection: close


문제는 이 방법을 적용하기 위해서는 모든 응답 부분에 개별적으로 구현해야하기 때문에 권장하지 않습니다.

특정 요청에 대하여 특정 헤더를 수정 및 추가해야할 경우에만 유용한 방법입니다.


Flask.process_response()

또 다른 방법은 Flask 클래스르 상속받은 후, process_response() 함수를 작성하는 방법입니다.

class MyFlask(Flask):
    """ 응답에 대한 'Server' 헤더를 변경하기 위한 클래스 """

    def process_response(self, response):
        # 모든 응답에 대한 'Server' 헤더 변경
        response.headers['Server'] = f'{const.TITLE} - v{const.VERSION}'
        return (response)


그러나 위와 같이 작성한 MyFlask 로 생성하여도 위와 같이 응답에 'Server' 헤더가 두 번 나타납니다.

모든 응답에 대한 헤더를 수정 및 추가할 경우라면 적용해볼만 합니다. 하지만 별도의 클래스를 만들어서 해야한다는 점이 조금 번거롭긴 합니다. 이런 경우 더 유용한 방법은 다음에 설명할 "@app.after_request"를 구현하는 방법입니다.


@app.after_request

"@app.after_request"를 구현하면, 위의 방법들 보다는 조금 간단하게 헤더를 변경할 수 있습니다.

@app.after_request
def change_server_header(response):
    response.headers['Server'] = 'hbesthee test server'  # 여기에 원하는 문자열 입력
    return response


하지만, 이 방법으로도 "Server" 헤더 만큼은 변경되지 않았습니다.

위 방법들과 동일하게 "Server" 헤더가 2개가 표시됩니다.

"Server" 헤더 등과 같이 자동으로 적용되는 헤더를 제외하고는 다른 헤더의 변경은 모든 응답에 대하여 잘 동작하였습니다.


참고자료

728x90
반응형