개요
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" 헤더 등과 같이 자동으로 적용되는 헤더를 제외하고는 다른 헤더의 변경은 모든 응답에 대하여 잘 동작하였습니다.
참고자료
- "Flask change the server header":https://stackoverflow.com/questions/27365298/
- "NGINX and uWSGI for Flask-Philo app deployment":https://flask-philo.readthedocs.io/en/latest/etc/flask_app_deploy.html
'프로그래밍 > Python' 카테고리의 다른 글
[python] 코드가 실행중일 때, 디버깅 중인지 확인하는 방법 (0) | 2024.07.05 |
---|---|
[Python] 품질 설정과 함께 이미지를 JPEG로 저장 방법들 (0) | 2024.07.04 |
[python] "v1.v2.v3.v4" 버전 문자열을 숫자들로 변환하기 (0) | 2024.07.02 |
[Python] 현재 시간대에 대한 OFFSET 시간 (UTC) 구하기 (0) | 2024.06.30 |
[python] dict 객체 복사의 세 가지 방법 : 참조 복사, 얕은 복사, 깊은 복사 (0) | 2024.06.26 |