⚡ HTTP의 구조 및 핵심 요소 - 2

codeamor·2020년 6월 28일
0

HTTP

목록 보기
2/3

✔ HTTP 응답 구조

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>
  ...
  • (1): Status Line
  • (2): Headers
  • (3): Body

Status Line

: HTTP 응답 메시지의 상태를 간략하게 요약하여 알려 주는 부분이다.

다음과 같은 형태로 구성 된다.

HTTP/1.1 404 Not Found
(1)	 (2)	 (3)
  • (1): HTTP Version
  • (2): Status Code
  • (3): Status Text

(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 헤더가 사용된다.


Body

HTTP 응답 메시지의 body도 HTTP 요청 메시지의 body와 동일하다.
그리고 요청 메시지와 마찬가지로 전송하는 데이터가 없다면 body 부분은 비어 있게 된다.



✔ 자주 사용되는 HTTP 메소드

API를 개발하는 것에 있어서 HTTP 메소드를 잘 이해하고 적절한 HTTP 메소드를 사용하는 것이 중요하다. 여기선 자주 사용하는 것들에 대해서 알아본다.


GET

: 어떠한 데이터를 서버로부터 요청(GET)할 때 주로 사용하는 메소드다.

  • POST 메소드와 함께 가장 자주 사용되는 HTTP 메소드.
  • 데이터의 생성이나 수정, 그리고 삭제 등의 변경 사항이 없이 단순히 데이터를 받아 오는 요청이 주로 수행된다.
  • 데이터를 받아올 때 주로 사용되므로 HTTP 요청의 body가 비어 있는 경우가 많다.

POST

: 데이터를 생성하거나 수정 및 삭제 요청을 할 때 주로 사용된다.


OPTIONS

: 주로 특정 엔드포인트에서 허용하는 메소드들이 무엇이 있는지 알고자 하는 요청에서 사용되는 메소드다.

  • 허용하지 않는 HTTP 메소드의 요청이 들어오면 405 Method Not Allowed 응답을 보낸다.
  • GET 메소드 요청만 받도록 구현되어 있는데 POST 요청을 보내면 405
    Method Not Allowed 응답을 Flask가 자동으로 보낸다.
    (출처가 되는 책을 기준으로 작성하고 있고, Flask 기반 API 개발 도서이다.)

"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 요청에 대한 응답을 구현해 주기 때문이다.

PUT

: 데이터를 새로 생성할 때 사용되는 메소드다.

  • POST 메소드와 비슷한 의미를 가진다.
  • POST 와 중복되는 의미이므로 데이터를 새로 생성하는 HTTP 요청을 보낼 때 굳이 PUT을 사용하지 않아도 되고, POST로 데이터 생성 및 수정에 관련한 요청을 모두 처리하는 시스템이 많아지고 있다.

DELETE

: 데이터 삭제 요청을 보낼 때 사용되는 메소드다.



✔ 자주 사용되는 HTTP Status Code와 TEXT

HTTP 요청에서 HTTP 메소드를 잘 이해하는 것과 마찬가지로
HTTP 응답에서는 HTTP status code와 text를 잘 이해하여 HTTP 응답을 보낼 때
적절한 status code의 응답을 보내는 것 또한 굉장히 중요하다.
자주 사용되는 몇 가지를 알아본다.

200 OK

: HTTP 요청이 문제없이 성공적으로 잘 처리 되었을 때 보내는 status code다.

301 Moved Permanently

: HTTP 요청을 보낸 엔드포인트의 URL 주소가 바뀌었다는 것을 나타내는 status code다.

  • 301 status code의 HTTP 응답은 Location 헤더가 포함되는 것이 일반적이다.
    • Location 헤더에 해당 엔드포인트의 새로운 주소가 포함되어 나온다.
  • 301 요청을 받은 클라이언트는 Location 헤더의 엔드포인트의 새로운 주소에 해당 요청을 다시 보내게 된다.
    이러한 과정을 redirection 이라고 한다.
HTTP/1.1 301 Moved Permanently
Location: http://www.example.org/index.asp

400 Bad Request

: HTTP 요청이 잘못된 요청일 때 보내는 응답 코드다.

  • 주로 요청에 포함된 인풋(input) 값들이 잘못된 값들이 보내졌을 때 사용된다.

401 Unauthorized

: HTTP 요청을 보내는 주체(사용자 혹은 클라이언트)의 신분(credential) 확인이 요구되나 확인할 수 없었을 때 보내는 응답 코드다.

  • 주로 해당 HTTP 요청을 보내는 사용자가 로그인이 필요한 경우 401 응답을 보낸다.

403 Forbidden

HTTP 요청을 보내는 주체(사용자 혹은 클라이언트)가 해당 요청에 대한 권한이 없음을 나타내는 응답 코드다.

404 Not Found

: HTTP 요청을 보내고자 하는 URI가 존재하지 않을 때 보내는 응답 코드다.

500 Internal Server Error

: 내부 서버 오류가 발생했음을 알려주는 응답 코드다.

  • HTTP 요청을 받은 서버에서 해당 요청을 처리하는 과정에서 서버 오류(error)가 나서 해당 요청을 처리할 수 없을 때 사용하는 응답 코드다.


Reference

깔끔한 파이썬 탄탄한 백엔드 / 저자: 송은우

0개의 댓글