HTTP/1.1 404 Not Found ... (1)
Connection: close ... (2)
Content-Length: 1573
Content-Type: text/html; charset=UTF-8
Date: Mon, 20 Aug 2018 07:59:05 GMT
<!DOCTYPE html> ... (3)
<html lang=en>
...
: HTTP 응답 메시지의 상태를 간략하게 요약하여 알려 주는 부분이다.
다음과 같은 형태로 구성 된다.
HTTP/1.1 404 Not Found
(1) (2) (3)
(1) HTTP version은 HTTP 요청 메시지의 start line과 마찬가지로 사용되고 있는 HTTP 버전을 나타낸다.
(2) status code는 HTTP 응답 상태를 미리 지정되어 있는 숫자로 된 코드로 나타내준다.
예를 들어, HTTP 요청이 정상적으로 처리가 되었으면 응답의 status code는 200을 표출한다.
(3) status text는 HTTP 응답 상태를 간략하게 보여준다.
예를 들어, HTTP 요청이 정상적으로 처리한 HTTP 응답의 status code는 200이 되고 status text는 "OK"가 된다.
HTTP 응답의 헤더 부분은 HTTP 요청의 헤더와 동일하다.
하지만 HTTP 응답에서만 사용되는 헤더 값들이 있다.
예를 들어, HTTP 응답에는 User-Agent 헤더 대신에 Server 헤더가 사용된다.
HTTP 응답 메시지의 body도 HTTP 요청 메시지의 body와 동일하다.
그리고 요청 메시지와 마찬가지로 전송하는 데이터가 없다면 body 부분은 비어 있게 된다.
API를 개발하는 것에 있어서 HTTP 메소드를 잘 이해하고 적절한 HTTP 메소드를 사용하는 것이 중요하다. 여기선 자주 사용하는 것들에 대해서 알아본다.
: 어떠한 데이터를 서버로부터 요청(GET)할 때 주로 사용하는 메소드다.
: 데이터를 생성하거나 수정 및 삭제 요청을 할 때 주로 사용된다.
: 주로 특정 엔드포인트에서 허용하는 메소드들이 무엇이 있는지 알고자 하는 요청에서 사용되는 메소드다.
"ping" 엔드포인트에 OPTIONS 요청을 보내면 다음과 같은 응답을 받게 된다.
HTTP/1.0 200 OK
Allow: GET, HEAD, OPTIONS ... (1)
Content-Length: 0
Content-Type: text/html; charset=utf-8
Date: Fri, 28 Sep 2018 06:35:18 GMT
Server: Werkzeug/0.14.1 Python/3.7.0
(1): OPTIONS 요청을 보내면 응답에는 Allow 헤더를 통해 해당 엔드포인트가 허용하는 HTTP 메소드를 보내 준다.
위의 HTTP 응답을 보면 Allow 헤더에 GET, HEAD, OPTIONS 가 나열되어 있다.
이 뜻은 "ping" 엔드포인트가 GET, HEAD, 그리고 OPTIONS 메소드 요청들을 허용한다는 뜻이다.
📌 "ping" 엔드포인트를 구현할 때 분명히 GET 메소드만 허용하도록 구현했는데 왜 HEAD와 OPTIONS 메소드까지 허용되는가?
Flask 가 자동으로 HEAD와 OPTIONS 요청에 대한 응답을 구현해 주기 때문이다.
: 데이터를 새로 생성할 때 사용되는 메소드다.
: 데이터 삭제 요청을 보낼 때 사용되는 메소드다.
HTTP 요청에서 HTTP 메소드를 잘 이해하는 것과 마찬가지로
HTTP 응답에서는 HTTP status code와 text를 잘 이해하여 HTTP 응답을 보낼 때
적절한 status code의 응답을 보내는 것 또한 굉장히 중요하다.
자주 사용되는 몇 가지를 알아본다.
: HTTP 요청이 문제없이 성공적으로 잘 처리 되었을 때 보내는 status code다.
: HTTP 요청을 보낸 엔드포인트의 URL 주소가 바뀌었다는 것을 나타내는 status code다.
redirection
이라고 한다.HTTP/1.1 301 Moved Permanently
Location: http://www.example.org/index.asp
: HTTP 요청이 잘못된 요청일 때 보내는 응답 코드다.
: HTTP 요청을 보내는 주체(사용자 혹은 클라이언트)의 신분(credential) 확인이 요구되나 확인할 수 없었을 때 보내는 응답 코드다.
HTTP 요청을 보내는 주체(사용자 혹은 클라이언트)가 해당 요청에 대한 권한이 없음을 나타내는 응답 코드다.
: HTTP 요청을 보내고자 하는 URI가 존재하지 않을 때 보내는 응답 코드다.
: 내부 서버 오류가 발생했음을 알려주는 응답 코드다.
깔끔한 파이썬 탄탄한 백엔드 / 저자: 송은우