Content-Length: 응답 바디의 크기를 바이트 단위로 나타냅니다. 예시에서는 1024로, 응답 바디의 크기가 1024바이트임을 나타냅니다.
Date: 응답이 생성된 날짜와 시간을 나타냅니다.
빈 줄(Empty Line)
헤더와 바디를 구분하는 빈 줄입니다.
바디(Body)
실제 응답 내용이 포함됩니다. 예시에서는 HTML 문서가 응답 바디에 포함되어 있습니다.
MIME(Multipurpose Internet Mail Extensions) 타입은 인터넷에서 전송되는 파일의 형식을 식별하는 데 사용되는 표준입니다. 웹 서버는 Content-Type 헤더를 통해 응답 바디의 MIME 타입을 클라이언트에게 알려줍니다. 클라이언트는 이 정보를 바탕으로 응답을 적절하게 처리하고 표시할 수 있습니다.
앞에서 우리는 이 Content-Type을 통해 HTML임에도 HTML로 로드가 되지 않고 text로 반영이 되는 것을 확인했습니다.
모든 상태코드를 외우거나 알 필요는 없습니다. 주요한 상태코드만 알아두시고, 필요에 따라 검색하시면 됩니다.
이 상태코드가 항상 올바르게 응답되진 않습니다. 스캐닝 공격을 방어하기 위해 회사 규정에 따라 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, HTTPServerclassCustomHTTPRequestHandler(BaseHTTPRequestHandler):defdo_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>")defrun_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, HTTPServerclassCustomHTTPRequestHandler(BaseHTTPRequestHandler):defdo_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>")defrun_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()