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