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)

이 클래스는 서버 주소를 server_nameserver_port 라는 인스턴스 변수로 저장하여 TCPServer 클래스를 기반으로 구축됩니다. 핸들러는 보통 자신의 server 인스턴스 변수를 통해 서버에 접근할 수 있습니다.

server_name

HTTP 서버의 전체 자격 증명 도메인 이름(FQDN)입니다.

server_port

server_address 에서 얻은 HTTP 서버의 포트 번호입니다.

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.

index_pages

디렉터리 인덱스 페이지로 처리되는 파일명을 지정합니다.

기본값은 ("index.html", "index.htm") 입니다.

Added in version 3.12.

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_pages 에 지정된 대로 인덱스 페이지가 있는지 해당 디렉터리를 확인합니다. 발견되면 파일의 내용이 반환되고, 그렇지 않으면 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' 헤더 지원.

list_directory(path)

인덱스 페이지가 없을 때 path 의 내용을 목록으로 표시하는 도우미 함수입니다.

This returns either a file-like object (which must be closed by the caller) or None to indicate an error, in which case the caller has nothing further to do. In either case, the headers are sent.

guess_type(path)

주어진 path 에 있는 파일의 유형을 추측합니다.

이 함수는 MIME Content-type 헤더에 사용할 수 있는 type/subtype 형식의 문자열을 반환합니다.

기본 구현은 파일의 확장자를 extensions_map 에서 찾고, 없으면 mimetypes.guess_file_type() 을 거쳐 마지막으로 default_content_type 을 확인합니다.

버전 3.13에서 변경: mimetypes.guess_file_type() 를 폴백(fallback)으로 추가합니다.

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 는 요청을 처리할 때 심볼릭 링크를 따르므로, 지정된 디렉터리 외부에 있는 파일도 제공할 수 있습니다.

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

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

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

분실물 보관소