WeniVooks

검색

웹/네트워크/HTTP 베이스캠프

Response

6.2 Response

HTTP/1.1 200 OK 
Server: Apache/2.4.41 (Ubuntu) 
Content-Type: text/html;
charset=UTF-8 Content-Length: 1024 
Date: Mon, 01 Apr 2024 10:30:00 GMT
 
<!DOCTYPE html>
<html>
  <head>
    <title>Example Page</title>
  </head>
  <body>
    <h1>Welcome to Example Page</h1>
    <p>This is an example HTTP response.</p>
  </body>
</html>
HTTP/1.1 200 OK 
Server: Apache/2.4.41 (Ubuntu) 
Content-Type: text/html;
charset=UTF-8 Content-Length: 1024 
Date: Mon, 01 Apr 2024 10:30:00 GMT
 
<!DOCTYPE html>
<html>
  <head>
    <title>Example Page</title>
  </head>
  <body>
    <h1>Welcome to Example Page</h1>
    <p>This is an example HTTP response.</p>
  </body>
</html>

HTTP 응답의 주요 구성 요소는 다음과 같습니다.

  1. 상태 라인(Status Line)
    • HTTP 버전: 예시에서는 HTTP/1.1을 사용하고 있습니다.
    • 상태 코드(Status Code): 요청의 처리 결과를 나타내는 3자리 숫자입니다. 예시에서는 200으로, 요청이 성공적으로 처리되었음을 나타냅니다.
    • 상태 메시지(Status Message): 상태 코드에 대한 간략한 설명입니다. 예시에서는 OK로, 요청이 성공적으로 처리되었음을 나타냅니다.
  2. 헤더(Headers)
    • Server: 웹 서버의 종류와 버전 정보를 포함합니다. 예시에서는 Apache/2.4.41 (Ubuntu)를 사용하고 있습니다.
    • Content-Type: 응답 바디의 MIME 타입을 나타냅니다. 예시에서는 text/html; charset=UTF-8로, HTML 문서이며 UTF-8 인코딩을 사용함을 나타냅니다.
    • Content-Length: 응답 바디의 크기를 바이트 단위로 나타냅니다. 예시에서는 1024로, 응답 바디의 크기가 1024바이트임을 나타냅니다.
    • Date: 응답이 생성된 날짜와 시간을 나타냅니다.
  3. 빈 줄(Empty Line)
    • 헤더와 바디를 구분하는 빈 줄입니다.
  4. 바디(Body)
    • 실제 응답 내용이 포함됩니다. 예시에서는 HTML 문서가 응답 바디에 포함되어 있습니다.

MIME(Multipurpose Internet Mail Extensions) 타입은 인터넷에서 전송되는 파일의 형식을 식별하는 데 사용되는 표준입니다. 웹 서버는 Content-Type 헤더를 통해 응답 바디의 MIME 타입을 클라이언트에게 알려줍니다. 클라이언트는 이 정보를 바탕으로 응답을 적절하게 처리하고 표시할 수 있습니다.

앞에서 우리는 이 Content-Type을 통해 HTML임에도 HTML로 로드가 되지 않고 text로 반영이 되는 것을 확인했습니다.

  • 클라이언트에게 전송된 문서의 다양성을 알려주기 위한 메커니즘
MIME 타입 - HTTP | MDN
6.2.1 응답의 결과를 알려주는 상태코드
  • 서버에 요청을 보냈을 때, 서버가 요청이 어떻게 처리되었는지 알려주는 역할을 합니다.
  • 프론트엔드 개발자는 이 상태코드를 확인하고 에러를 처리할 수 있습니다.
  • 모든 상태코드를 외우거나 알 필요는 없습니다. 주요한 상태코드만 알아두시고, 필요에 따라 검색하시면 됩니다.
  • 이 상태코드가 항상 올바르게 응답되진 않습니다. 스캐닝 공격을 방어하기 위해 회사 규정에 따라 404임에도 200을 주는 경우도 많습니다. 이 숫자는 서버에서 주는 숫자일 뿐입니다. 회사 컨벤션에 따라 코딩을 하셔야 합니다.
2xx
코드 설명
200 서버가 요청을 제대로 처리.
201 성공적으로 요청되었으며 서버가 새 리소스를 작성.
202 서버가 요청을 접수했지만 아직 처리하지 않음.
3xx
코드 설명
301 요청한 페이지를 새 위치로 영구적으로 이동.
4xx
코드 설명
400 Bad Request. 잘못된 요청
401 Unauthorized. 권한 없이 요청. Authorization 헤더가 잘못된 경우.
403 Forbidden. 서버가 요청을 거부.
404 서버가 요청한 페이지를 찾을 수 없음.
5xx

서버 쪽에서 오류가 난 경우입니다. 이때는 백엔드 개발자에게 물어봐야겠죠.

코드 설명
500 서버에 오류가 발생하여 요청을 수행할 수 없음.
503 서버가 오버로드되었거나 유지관리를 위해 다운되었기 때문에 현재 서버 사용 불가.

응답 코드에 따른 응답 메시지입니다. RFC 표준에는 각 상태 코드에 대해 권장하는 상태 메시지를 정의하고 있습니다. 다만 백엔드 개발자가 임의로 이 메시지를 변경할 수 있습니다. 해커의 풋프린팅을 방해하기 위해 메시지의 혼란을 주기도 합니다.

2xx (성공) 응답 코드
상태 코드 상태 메시지
200 OK
201 Created
202 Accepted
3xx (리다이렉션) 응답 코드
상태 코드 상태 메시지
300 Multiple Choices
301 Moved Permanently
302 Found
303 See Other
304 Not Modified
4xx (클라이언트 오류) 응답 코드
상태 코드 상태 메시지
400 Bad Request
401 Unauthorized
403 Forbidden
404 Not Found
405 Method Not Allowed
5xx (서버 오류) 응답 코드
상태 코드 상태 메시지
500 Internal Server Error
501 Not Implemented
502 Bad Gateway
503 Service Unavailable
504 Gateway Timeout
6.2.2 상태 코드 실습
from http.server import BaseHTTPRequestHandler, HTTPServer
 
 
class CustomHTTPRequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(404, "404 but 200?")
        self.send_header("Access-Control-Allow-Origin", "*")
        self.send_header("Content-type", "text/html")
        self.end_headers()
        self.wfile.write(b"<h1>404?</h1>")
 
 
def run_server(port=8000):
    server_address = ("", port)
    httpd = HTTPServer(server_address, CustomHTTPRequestHandler)
    print(f"Starting server on port {port}")
    httpd.serve_forever()
 
 
if __name__ == "__main__":
    run_server()
from http.server import BaseHTTPRequestHandler, HTTPServer
 
 
class CustomHTTPRequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(404, "404 but 200?")
        self.send_header("Access-Control-Allow-Origin", "*")
        self.send_header("Content-type", "text/html")
        self.end_headers()
        self.wfile.write(b"<h1>404?</h1>")
 
 
def run_server(port=8000):
    server_address = ("", port)
    httpd = HTTPServer(server_address, CustomHTTPRequestHandler)
    print(f"Starting server on port {port}")
    httpd.serve_forever()
 
 
if __name__ == "__main__":
    run_server()
  • 일반 URL 로 접속시(127.0.0.1:8000)
  • JavaScript 코드
    fetch('http://127.0.0.1:8000', {
      method: 'GET',
    })
      .then((response) => response.text())
      .then((data) => console.log(data));
    fetch('http://127.0.0.1:8000', {
      method: 'GET',
    })
      .then((response) => response.text())
      .then((data) => console.log(data));
6.1 Request6.3 과제 - Create 실습