Python

http.server — HTTP 서버

소스 코드: Lib/http/server.py


이 모듈은 HTTP 서버를 구현하기 위한 클래스를 정의합니다.

경고

http.server 는 프로덕션 환경에서 권장되지 않습니다. 이 모듈은 기초적인 보안 검사 만 구현합니다.

가용성: not WASI.

이 모듈은 웹어셈블리에서 작동하지 않거나 제공되지 않습니다. 자세한 내용은 웹어셈블리 플랫폼을 참조하세요.

HTTPServer 클래스는 socketserver.TCPServer 서브 클래스입니다. HTTP 소켓을 만들고 리스닝하면서 요청을 처리기로 디스패치 합니다. 서버를 만들고 실행하는 코드는 다음과 같습니다:

def run(server_class=HTTPServer, handler_class=BaseHTTPRequestHandler):
    server_address = ('', 8000)
    httpd = server_class(server_address, handler_class)
    httpd.serve_forever()
class http.server.HTTPServer(server_address, RequestHandlerClass)

이 클래스는 TCPServer 클래스를 기반으로 하고, 서버 주소를 server_nameserver_port라는 인스턴스 변수로 저장합니다. 처리기는 일반적으로 처리기의 server 인스턴스 변수를 통해 서버에 액세스 할 수 있습니다.

class http.server.ThreadingHTTPServer(server_address, RequestHandlerClass)

이 클래스는 HTTPServer와 동일하지만 ThreadingMixIn을 사용하여 요청을 처리하는 데 스레드를 사용합니다. HTTPServer가 무기한 대기하도록 만드는 소켓을 미리 여는 웹 브라우저를 처리하는 데 유용합니다.

Added in version 3.7.

class http.server.HTTPSServer(server_address, RequestHandlerClass, bind_and_activate=True, *, certfile, keyfile=None, password=None, alpn_protocols=None)

ssl 모듈을 사용하여 소켓을 래핑한 HTTPServer 의 서브 클래스입니다. ssl 모듈을 사용할 수 없는 경우, HTTPSServer 객체를 인스턴스화하면 RuntimeError 가 발생합니다.

certfile 인자는 SSL 인증서 체인 파일의 경로이며, keyfile 은 개인 키가 포함된 파일의 경로입니다.

PKCS#8으로 보호 및 래핑된 파일의 경우 password 를 지정할 수 있으나, 이로 인해 하드코딩된 비밀번호가 평문으로 노출될 수 있으니 주의하십시오.

더 보기

certfile, keyfile, password 에 대해 허용되는 값에 대한 자세한 내용은 ssl.SSLContext.load_cert_chain() 을 참조하십시오.

alpn_protocols 가 지정될 때, 이 인자는 서버가 지원하는 “Application-Layer Protocol Negotiation”(ALPN) 프로토콜을 명시하는 문자열 시퀀스여야 합니다. ALPN은 TLS 핸드셰이크 중에 서버와 클라이언트가 애플리케이션 프로토콜을 협상할 수 있게 해줍니다.

기본값은 ["http/1.1"] 로 설정되어 있으며, 이는 서버가 HTTP/1.1을 지원함을 의미합니다.

Added in version 3.14.

class http.server.ThreadingHTTPSServer(server_address, RequestHandlerClass, bind_and_activate=True, *, certfile, keyfile=None, password=None, alpn_protocols=None)

이 클래스는 HTTPSServer 와 동일하지만, ThreadingMixIn 을 상속하여 요청 처리에 스레드를 사용합니다. 이는 단지 HTTPSServer 만 사용하는 ThreadingHTTPServer 와 유사합니다.

Added in version 3.14.

HTTPServer, ThreadingHTTPServer, HTTPSServer, 그리고 ThreadingHTTPSServer 는 인스턴스화할 때 RequestHandlerClass 를 제공받아야 하며, 이 모듈은 세 가지 변형을 제공합니다.

class http.server.BaseHTTPRequestHandler(request, client_address, server)

이 클래스는 서버에 도착하는 HTTP 요청을 처리하는 데 사용됩니다. 이 클래스 자체로는 실제 HTTP 요청에 응답할 수 없으며, 각 요청 메서드(예: 'GET''* 또는 `` 'POST')를 처리하려면 서브 클래스로 확장해야 합니다. BaseHTTPRequestHandler 는 서브 클래스에서 사용할 수 있는 여러 개의 클래스 및 인스턴스 변수와 메서드를 제공합니다.

처리기는 요청과 헤더를 구문 분석한 다음, 요청 유형에 특정한 메서드를 호출합니다. 메서드 이름은 요청으로부터 구성됩니다. 예를 들어, 요청 메서드 SPAM의 경우, do_SPAM() 메서드가 인자 없이 호출됩니다. 모든 관련 정보는 처리기의 인스턴스 변수에 저장됩니다. 서브 클래스는 __init__() 메서드를 대체하거나 확장할 필요가 없습니다.

BaseHTTPRequestHandler에는 다음과 같은 인스턴스 변수가 있습니다:

client_address

클라이언트 주소를 나타내는 (host, port) 형식의 튜플을 포함합니다.

server

서버 인스턴스를 포함합니다.

close_connection

handle_one_request()가 반환되기 전에 설정해야 하는 불리언으로, 다른 요청이 기대되는지, 또는 연결을 종료해야 하는지를 나타냅니다.

requestline

HTTP 요청 줄의 문자열 표현을 포함합니다. 종료 CRLF가 제거됩니다. 이 어트리뷰트는 handle_one_request()에서 설정해야 합니다. 유효한 요청 줄이 처리되지 않았으면, 빈 문자열로 설정해야 합니다.

command

명령(요청 유형)을 포함합니다. 예를 들어, 'GET'.

path

요청 경로를 포함합니다. URL에 쿼리 구성 요소가 있는 경우, path 에 쿼리가 포함됩니다. RFC 3986 의 용어를 사용하면 여기서 pathhier-partquery 를 모두 포함합니다.

request_version

요청의 버전 문자열을 포함합니다. 예를 들어, 'HTTP/1.0'.

headers

MessageClass 클래스 변수로 지정된 클래스의 인스턴스를 보유합니다. 이 인스턴스는 HTTP 요청의 헤더를 파싱하고 관리합니다. http.clientparse_headers() 함수가 헤더 파싱에 사용되며, 이때 HTTP 요청은 유효한 RFC 5322 스타일 헤더를 제공해야 합니다.

rfile

선택적 입력 데이터의 시작부터 읽을 준비가 된 io.BufferedIOBase 입력 스트림.

wfile

클라이언트로 돌려줄 응답을 쓰기 위한 출력 스트림을 포함합니다. HTTP 클라이언트와의 성공적인 상호 운용을 위해서 이 스트림에 쓸 때 HTTP 프로토콜을 올바르게 준수해야 합니다.

버전 3.6에서 변경: 이것은 io.BufferedIOBase 스트림입니다.

BaseHTTPRequestHandler에는 다음과 같은 어트리뷰트가 있습니다:

server_version

서버 소프트웨어 버전을 지정합니다. 이것을 재정의하고 싶을 수 있습니다. 형식은 여러 공백으로 구분된 문자열이며, 각 문자열은 name[/version] 형식입니다. 예를 들어, 'BaseHTTP/0.2'.

sys_version

version_string 메서드와 server_version 클래스 변수에서 사용할 수 있는 형식으로 파이썬 시스템 버전을 포함합니다. 예를 들어, 'Python/1.4'.

error_message_format

클라이언트에 대한 에러 응답을 빌드하기 위해 send_error() 메서드에서 사용해야 하는 포맷 문자열을 지정합니다. 문자열은 기본적으로 send_error()에 전달된 상태 코드에 따라 responses의 변수로 채워집니다.

error_content_type

클라이언트로 전송되는 에러 응답의 Content-Type HTTP 헤더를 지정합니다. 기본값은 'text/html'입니다.

protocol_version

서버가 준수하는 HTTP 버전을 지정합니다. 향후 요청에 대한 서버의 통신 기능을 클라이언트에게 알리기 위해 응답으로 전송됩니다. 'HTTP/1.1'로 설정되면, 서버는 HTTP 지속적 연결(persistent connections)을 허용합니다; 그러나, 이때 서버는 반드시 클라이언트에 대한 모든 응답에 (send_header()를 사용해서) 정확한 Content-Length 헤더를 포함해야 합니다. 이전 버전과의 호환성을 위해, 기본 설정은 'HTTP/1.0'입니다.

MessageClass

HTTP 헤더를 구문 분석할 email.message.Message와 유사한 클래스를 지정합니다. 일반적으로, 이는 재정의되지 않으며, 기본값은 http.client.HTTPMessage입니다.

responses

이 어트리뷰트에는 에러 코드 정수에서 짧고 긴 메시지를 포함하는 두 요소 튜플로의 매핑이 포함됩니다. 예를 들어, {code: (shortmessage, longmessage)}. shortmessage는 일반적으로 에러 응답에서 message 키로 사용되고, longmessageexplain 키로 사용됩니다. send_response_only()send_error() 메서드에서 사용됩니다.

BaseHTTPRequestHandler 인스턴스에는 다음과 같은 메서드가 있습니다:

handle()

들어오는 HTTP 요청을 처리하기 위해 handle_one_request()를 한 번 (또는, 지속적 연결이 활성화되었으면, 여러 번) 호출합니다. 재정의할 필요는 없습니다; 대신 적절한 do_*() 메서드를 구현하십시오.

handle_one_request()

이 메서드는 요청을 구문 분석하여 적절한 do_*() 메서드로 디스패치 합니다. 재정의할 필요는 없습니다.

handle_expect_100()

HTTP/1.1 호환 서버가 Expect: 100-continue 요청 헤더를 수신하면 100 Continue 로 응답한 후 200 OK 헤더를 보냅니다. 서버가 클라이언트의 계속 진행을 원하지 않을 경우 에러를 발생시키도록 이 메서드를 재정의할 수 있습니다. 예를 들어, 서버는 417 Expectation Failed 를 응답 헤더로 보내고 return False 를 수행할 수 있습니다.

Added in version 3.2.

send_error(code, message=None, explain=None)

클라이언트에게 완전한 에러 응답을 보내고 로깅 합니다. 숫자 code는 HTTP 에러 코드를 지정하며, message는 선택적인 사람이 읽을 수 있는 에러에 대한 간단한 설명입니다. explain 인자는 에러에 대한 자세한 정보를 제공하는 데 사용될 수 있습니다; error_message_format 어트리뷰트를 사용하여 포맷되고 전체 헤더 집합 뒤에 응답 바디로 보냅니다. responses 어트리뷰트는 값이 제공되지 않을 때 사용될 messageexplain의 기본값을 담고 있습니다; 알 수 없는 코드의 경우 둘 다 기본값은 문자열 ???입니다. 메서드가 HEAD이거나 응답 코드가 1xx, 204 No Content, 205 Reset Content, 304 Not Modified 중 하나면 바디는 비어 있게 됩니다.

버전 3.4에서 변경: 에러 응답에는 Content-Length 헤더가 포함됩니다. explain 인자를 추가했습니다.

send_response(code, message=None)

헤더 버퍼에 응답 헤더를 추가하고 받아들인 요청을 로깅 합니다. HTTP 응답 줄이 내부 버퍼에 기록되고, ServerDate 헤더가 뒤따릅니다. 이 두 헤더의 값은 각각 version_string()date_time_string() 메서드에서 취합니다. 서버가 send_header() 메서드를 사용하여 다른 헤더를 보내려고 하지 않는다면, send_response() 다음에 end_headers() 호출이 있어야 합니다.

버전 3.3에서 변경: 헤더는 내부 버퍼에 저장되며 end_headers()를 명시적으로 호출해야 합니다.

send_header(keyword, value)

end_headers()flush_headers()가 호출될 때 출력 스트림에 기록될 내부 버퍼에 HTTP 헤더를 추가합니다. keyword는 헤더 키워드를 지정하고, value는 값을 지정해야 합니다. send_header 호출이 완료된 후, 작업을 완료하려면 반드시 end_headers()를 호출해야 함에 유의하십시오.

이 메서드는 CRLF 시퀀스를 포함하는 입력을 거부하지 않습니다.

버전 3.2에서 변경: 헤더는 내부 버퍼에 저장됩니다.

send_response_only(code, message=None)

응답 헤더만 보내는데, 서버가 100 Continue 응답을 클라이언트로 전송할 목적으로 사용됩니다. 헤더는 버퍼링 되지 않고 출력 스트림으로 직접 전송합니다. message를 지정하지 않으면, 응답 code에 해당하는 HTTP 메시지가 전송됩니다.

이 메서드는 CRLF 시퀀스를 포함하는 message 를 거부하지 않습니다.

Added in version 3.2.

end_headers()

(응답에서 HTTP 헤더의 끝을 나타내는) 빈 줄을 헤더 버퍼에 추가하고 flush_headers()를 호출합니다.

버전 3.2에서 변경: 버퍼링 된 헤더는 출력 스트림에 기록됩니다.

flush_headers()

마지막으로 헤더를 출력 스트림으로 보내고 내부 헤더 버퍼를 플러시 합니다.

Added in version 3.3.

log_request(code='-', size='-')

받아들인 (성공적인) 요청을 로깅 합니다. code는 응답과 관련된 숫자 HTTP 코드를 지정해야 합니다. 응답의 크기가 있으면, size 매개 변수로 전달되어야 합니다.

log_error(...)

요청을 이행할 수 없을 때 에러를 로깅 합니다. 기본적으로, 메시지를 log_message()에 전달하므로, 같은 인자(format과 추가 값)를 취합니다.

log_message(format, ...)

sys.stderr에 임의의 메시지를 로깅 합니다. 이것은 일반적으로 사용자 지정 에러 로깅 메커니즘을 만들기 위해 재정의됩니다. format 인자는 표준 printf 스타일 포맷 문자열이며, log_message()에 대한 추가 인자는 포매팅의 입력으로 적용됩니다. 클라이언트 ip 주소와 현재 날짜 및 시간은 로깅 되는 모든 메시지 앞에 붙습니다.

version_string()

서버 소프트웨어의 버전 문자열을 반환합니다. 이것은 server_versionsys_version 어트리뷰트의 조합입니다.

date_time_string(timestamp=None)

timestamp(None이거나 time.time()이 반환한 형식이어야 합니다)로 지정된 날짜와 시간을 메시지 헤더용으로 포맷하여 반환합니다. timestamp를 생략하면, 현재 날짜와 시간이 사용됩니다.

결과는 'Sun, 06 Nov 1994 08:49:37 GMT'와 같은 모습입니다.

log_date_time_string()

로깅용으로 포맷한 현재 날짜와 시간을 반환합니다.

address_string()

클라이언트 주소를 반환합니다.

버전 3.3에서 변경: 이전에는, 이름 조회가 수행되었습니다. 이름 결정(name resolution) 지연을 피하고자, 이제 항상 IP 주소를 반환합니다.

class http.server.SimpleHTTPRequestHandler(request, client_address, server, *, directory=None, extra_response_headers=None)

이 클래스는 디렉터리 구조를 HTTP 요청에 직접 매핑하여 디렉터리 directory와 그 이하의, 또는 directory가 제공되지 않으면 현재 디렉터리의 파일을 제공합니다.

버전 3.7에서 변경: directory 매개 변수가 추가되었습니다.

버전 3.9에서 변경: directory 매개 변수는 경로류 객체를 받아들입니다.

버전 3.15에서 변경: extra_response_headers 매개 변수가 추가되었습니다.

요청 구문 분석과 같은 많은 작업이 베이스 클래스 BaseHTTPRequestHandler 에 의해 수행됩니다. 이 클래스는 do_GET()do_HEAD() 함수를 구현합니다.

다음은 SimpleHTTPRequestHandler 의 클래스 수준 어트리뷰트로 정의됩니다:

server_version

이것은 "SimpleHTTP/" + __version__이며, 여기서 __version__은 모듈 수준에서 정의됩니다.

default_content_type

요청된 URL의 파일 확장성으로 MIME 유형을 추측할 수 없을 때 전송되는 Content-Type 헤더 값을 지정합니다. 기본값은 'application/octet-stream' 입니다.

Added in version 3.15.

extensions_map

접미사를 MIME 형식으로 매핑하는 딕셔너리. 기본 시스템 매핑에 대한 사용자 정의 재정의를 포함합니다. 매핑은 대소 문자를 구분 없이 사용되므로, 소문자 키만 포함해야 합니다.

버전 3.9에서 변경: 이 딕셔너리는 더는 기본 시스템 매핑으로 채워지지 않고, 재정의 만 포함합니다.

extra_response_headers

성공적인 HTTP 상태 200 응답에 추가할 사용자 정의 추가 HTTP 응답 헤더를 포함하는 (name, value) 쌍의 시퀀스입니다. 이 헤더들은 다른 상태 코드 응답에는 포함되지 않습니다.

Content-Type 과 같이 서버가 자동으로 전송하는 헤더는 extra_response_headers 에 의해 덮어씌워지지 않습니다.

SimpleHTTPRequestHandler 클래스는 다음 메서드를 정의합니다:

do_HEAD()

이 메서드는 'HEAD' 요청 유형을 제공합니다: 동등한 GET 요청에 대해 전송할 헤더를 전송합니다. 가능한 헤더에 대한 더 완전한 설명은 do_GET() 메서드를 참조하십시오.

do_GET()

요청을 현재 작업 디렉터리에 상대적인 경로로 해석하여 요청은 로컬 파일에 매핑됩니다.

요청이 디렉터리에 매핑되었으면, 디렉터리는 index.html이나 index.htm (이 순서대로) 파일을 검사합니다. 발견되면, 파일 내용이 반환됩니다; 그렇지 않으면 list_directory() 메서드를 호출하여 디렉터리 목록이 생성됩니다. 이 메서드는 os.listdir()을 사용하여 디렉터리를 스캔하고, listdir()이 실패하면 404 에러 응답을 반환합니다.

요청이 파일에 매핑되었으면, 파일을 엽니다. 요청된 파일을 열 때 발생하는 OSError 예외는 404, 'File not found' 에러로 매핑됩니다. 요청에 'If-Modified-Since' 헤더가 있고, 이 시간 이후 파일이 수정되지 않았으면, 304, 'Not Modified' 응답이 전송됩니다. 그렇지 않으면, 콘텐츠 유형은 guess_type() 메서드를 호출하여 추측되며, 이 메서드는 extensions_map 변수를 사용합니다. 그런 다음 파일 내용이 반환됩니다.

추측된 콘텐츠 유형의 'Content-type:' 헤더가 출력되고, 파일 크기가 담긴 'Content-Length:' 헤더와 파일 수정 시간이 담긴 'Last-Modified:' 헤더가 뒤따릅니다.

인스턴스 속성 extra_response_headers`은 사용자 정의 추가 응답 헤더를 포함하는 ``(name, value)` 쌍의 시퀀스입니다.

그 뒤에 헤더의 끝을 나타내는 빈 줄이 오고, 그 다음 파일 내용이 출력됩니다.

사용 예로는, Lib/http/server.py 모듈에서 test 함수 구현을 참조하십시오.

버전 3.7에서 변경: 'If-Modified-Since' 헤더 지원.

SimpleHTTPRequestHandler 클래스는 현재 디렉터리를 기준으로 파일을 제공하는 매우 기본적인 웹 서버를 만들기 위해 다음과 같은 방식으로 사용될 수 있습니다:

import http.server
import socketserver

PORT = 8000

Handler = http.server.SimpleHTTPRequestHandler

with socketserver.TCPServer(("", PORT), Handler) as httpd:
    print("serving at port", PORT)
    httpd.serve_forever()

SimpleHTTPRequestHandler 는 클래스 속성인 index_pages 를 재정의하여 다른 인덱스 파일 이름을 사용하는 등 동작을 개선하기 위해 서브 클래스로 확장할 수 있습니다.

명령 줄 인터페이스

http.server 는 인터프리터의 -m 옵션을 사용하여 직접 호출할 수도 있습니다. 다음 예제는 현재 디렉터리를 기준으로 파일을 제공하는 방법을 보여줍니다.

python -m http.server [OPTIONS] [port]

다음 옵션들이 지원됩니다:

port

서버는 기본적으로 8000번 포트에서 대기합니다. 인자로 원하는 포트 번호를 전달하여 기본값을 변경할 수 있습니다.

python -m http.server 9000
-b, --bind <address>

바인딩할 특정 주소를 지정합니다. IPv4와 IPv6 주소가 모두 지원됩니다. 기본적으로 서버는 모든 인터페이스에 바인드됩니다. 예를 들어, 다음 명령은 서버를 로컬호스트(localhost)에만 바인드하도록 합니다.

python -m http.server --bind 127.0.0.1

Added in version 3.4.

버전 3.8에서 변경: --bind 옵션에서 IPv6을 지원합니다.

-d, --directory <dir>

파일을 제공할 디렉터리를 지정합니다. 기본적으로 서버는 현재 디렉터리를 사용합니다. 예를 들어, 다음 명령은 특정 디렉터리를 사용합니다.

python -m http.server --directory /tmp/

Added in version 3.7.

-p, --protocol <version>

서버가 준수하는 HTTP 버전을 지정합니다. 기본적으로 서버는 HTTP/1.0을 준수합니다. 예를 들어, 다음 명령은 HTTP/1.1을 준수하는 서버를 실행합니다:

python -m http.server --protocol HTTP/1.1

Added in version 3.11.

--content-type <content_type>

URL의 파일 확장비에서 MIME 유형을 추측할 수 없을 때 사용하는 기본 Content-Type HTTP 헤더를 지정합니다. 기본적으로 서버는 'application/octet-stream' 을 사용합니다.

python -m http.server --content-type text/html

Added in version 3.15.

--tls-cert

HTTPS 연결을 위한 TLS 인증서 체인을 지정합니다:

python -m http.server --tls-cert fullchain.pem

Added in version 3.14.

--tls-key

HTTPS 연결을 위한 개인 키 파일을 지정합니다.

이 옵션을 사용하려면 --tls-cert 가 반드시 지정되어야 합니다.

Added in version 3.14.

--tls-password-file

암호로 보호된 개인 키의 비밀번호 파일을 지정합니다:

python -m http.server \
       --tls-cert cert.pem \
       --tls-key key.pem \
       --tls-password-file password.txt

이 옵션을 사용하려면 --tls-cert 가 반드시 지정되어야 합니다.

Added in version 3.14.

-H, --header <header> <value>

성공적인 HTTP 200 응답 시 전송할 추가 HTTP 응답 헤더를 지정합니다. 여러 번 사용하여 추가적인 사용자 정의 응답 헤더를 보낼 수 있습니다. 서버에 의해 자동으로 전송되는 헤더(예: Content-Type)는 서버에 의해 덮어씌워지지 않습니다.

Added in version 3.15.

보안 고려 사항

SimpleHTTPRequestHandler 는 요청을 처리할 때 심볼릭 링크를 따라가므로, 지정된 디렉터리 외부에 있는 파일도 서비스될 수 있습니다.

BaseHTTPRequestHandler.send_header()BaseHTTPRequestHandler.send_response_only() 메서드는 입력이 정제된 것으로 간주하며, CRLF 시퀀스의 존재 여부를 확인하는 등의 입력 검증을 수행하지 않습니다. 신뢰할 수 없는 입력은 HTTP 헤더 인젝션 공격으로 이어질 수 있습니다.

이전 버전의 Python은 python -m http.server 또는 기본 BaseHTTPRequestHandler .log_message 구현에서 stderr로 출력되는 로그 메시지에서 제어 문자를 제거하지 않았습니다. 이로 인해 서버에 연결하는 원격 클라이언트가 사용자의 터미널에 악성 제어 코드를 보낼 수 있었습니다.

버전 3.12에서 변경: stderr 로그에서 제어 문자가 제거됩니다.

분실물 보관소