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

codeamor·2020년 6월 27일
0

HTTP

목록 보기
1/3

🔸 HTTP

  • HTTP
    : HyperText Transfer Protocol

    • 웹상에서 HTML을 서로 주고받을 수 있도록 만들어진 프로토콜, 통신 규약
    • 서로 이해할 수 있는 공통의 통신 형식: Protocol, 그 중에 하나가 HTTP


🔸 HTTP 통신 방식

✔ HTTP 요청과 응답

  • 클라이언트가 먼저 HTTP에 요청을 서버에 보내면 서버는 요청을 처리한 후 결과에 따른 HTTP 응답을 클라이언트에게 보냄으로써 하나의 HTTP 통신이 된다.

  • 백엔드 API 시스템의 엔드포인트 구현도 기본적으로 HTTP 요청을 인풋으로 받아서 HTTP 응답을 아웃풋으로 리턴하는 구조로 구현을 하게 된다.

@app.route("/ping", methods=['GET'])
def ping():
    return "pong"
  • "ping" 엔드포인트의 경우에도 마찬가지로 HTTP 요청과 응답이 오고 가는 구조이다.
    HTTP 요청은 "/ping" 주소에 GET 요청을 보내는 것이고, HTTP 응답은 200 OK 상태 코드와 함께 "pong"이라는 텍스트를 보내는 것이다.

  • 위에서는 Flask가 자동으로 HTTP 응답으로 변환시켜 준다.


stateless

  • 상태가 없다는 뜻으로, HTTP 통신에서는 상태라는 개념이 존재하지 않는다.

  • 각각의 HTTP 통신은 독립적이며 그 전에 처리된 HTTP 통신에 대해서 전혀 알지 못한다.

  • 이 특성의 장점은 HTTP 통신 간의 진행이나 연결 상태의 처리나 저장을 구현하지 않아도 되는 것이고,
    단점은 HTTP 요청을 보낼 때마다 해당 요청을 처리하기 위해 필요한 모든 데이터를 매번 포함시켜서 요청을 보내야 한다.

  • 위의 단점을 해결하기 위해 쿠키(cookei)나 세션(session) 등을 사용하여 HTTP 요청을 처리할 때 필요한 진행 과정이나 데이터를 저장한다.

: 웹 브라우저가 웹사이트에서 보내온 정보를 저장할 수 있도록 하는 조그마한 파일

* session

: 쿠키와 마찬가지로 HTTP 통신상에서 필요한 데이터를 저장할 수 있게 하는 메커니즘.
쿠키와의 차이점은 쿠키는 웹 브라우저, 즉 클라이언트 측에서 데이터를 저장하는 반면에 세션은 웹 서버에서 데이터를 저장한다.



✔ HTTP 요청 구조

POST /payment-sync HTTP/1.1

Accept: application/json
Accept-Encoding: gzip, deflate
Connection: keep-alive
content-Length: 83
Content-Type: application/json
Host: intropython.com
User-Agent: HTTPie/0.9.3

{
"imp_uid": "imp_1234567890",
"merchant_uid": "order_id_8237352",
"status": "paid"
}

📌 우리가 HTTP 요청과 응답 메시지의 모든 부분을 직접 구현할 필요는 없다. Flask(or Django 등의 다른 웹 프레임워크)가 거의 대부분을 알아서 처리해 준다. 일반적으로 개발자가 직접 지정해야 하는 부분은 HTTP 메소드와 status code, 몇 개의 헤더 정보, 그리고 body 부분이다. 하지만 기본 구조와 내용은 이해하고 있어야 한다.


Start Line

: HTTP 요청의 시작줄.

  • "search" 엔드포인트에 GET HTTP 요청을 보낸다면 start line은 아래와 같다.

GET / search HTTP/1.1

  • start line은 세 부분으로 구성되어 있다.

    • HTTP 메소드
    • Request target
    • HTTP version

1. HTTP 메소드

: 해당 HTTP 요청이 의도하는 액션(action)을 정의하는 부분이다.

  • 서버로부터 데이터를 받고자 하면 GET 요청, 저장하고자 하면 POST 요청을 한다.
  • GET, POST, PUT, DELETE, OPTIONS 등 여러 메소드들이 있고 그중에서 GET과 POST가 가장 널리 쓰인다.

2. Request target

: 해당 HTTP 요청이 전송되는 목표 주소를 말한다.

  • "ping" 엔드포인트에 보내는 HTTP 요청의 경우 request target은 "/ping"이 된다.

3. HTTP version

: 해당 요청의 HTTP 버전을 나타낸다.

  • 현재 "1.0", "1.1", 그리고 "2.0" 버전이 있다.

  • HTTP 버전에 따라 HTTP 요청 메시지의 구조나 데이터가 약간씩 다를 수 있으므로 서버가 받은 요청의 HTTP version에 맞추어서 응답을 보낼 수 있도록 하기 위함이다.


헤더

: start line 다음에 나오며 HTTP 요청 그 자체에 대한 정보를 담고 있다.

  • 헤더는 파이썬의 dictionary 처럼 key 와 value 로 되어 있다.
  • key와 value는 ":" 로 연결된다.
  • google.com 에 보내는 HTTP 요청의 Host 헤더의 경우 다음과 같다.

HOST : google.com

* 자주 사용되는 헤더 정보

  • Host
    : 요청이 전송되는 target의 호스트의 URL 주소를 알려 주는 헤더다.

  • User-Agent
    : 요청을 보내는 클라이언트에 대한 정보 (ex. 웹 브라우저에 대한 정보)

  • Accept
    : 해당 요청이 받을 수 있는 응답(response) body 데이터 타입을 알려 주는 헤더.

    • MIME (Multipurpose Internet Mail Extension) type이 value로 지정된다.
      예를 들어, JSON 데이터 타입을 요청하는 경우에는
      application/json MIME type을 value로 정해 주면 된다.
      모든 데이터 타입을 다 허용하는 경우에는 */*로 지정해주면 된다.

    • MIME type은 굉장히 다양하다. API에서 자주 사용되는 MIME type은
      application/json, application/octet-stream, text/csv, text/html, image/jpeg, image/png, text/plain, 그리고 application/xml 이 있다.
  • Connection
    : 해당 요청이 끝난 후에 클라이언트와 서버가 계속해서 네트워크 연결을 유지할 것인지 아닌지에 대해 알려주는 헤더

    • HTTP 통신에서 서버간에 네트워크를 연결하는 과정이 다른 작업에 비해 시간이 걸리므로 HTTP 요청 때마다 네트워크 연결을 새로 만들지 않고 HTTP 요청이 계속되는 한 처음 만든 연결을 재사용하는 것이 선호되는데, 그에 대한 정보를 전달하는 헤더이다.

    • connection 헤더의 값이 keep-alive 이면 계속해서 HTTP 요청을 보낼 것이므로 네트워크 연결을 유지하라는 뜻이다.

    • connection 헤더의 값이 close 라고 지정되면 더 이상 HTTP 요청을 보내지 않을 것이므로 네트워크 연결을 닫아도 된다는 뜻이다.
  • Content-Type
    : HTTP 요청이 보내는 메시지 body의 타입을 알려주는 헤더이다.

    • Accept 헤더와 마찬가지로 MIME type이 사용된다.
      예를 들어, HTTP 요청이 JSON 데이터를 전송하면 Content-Type 헤더의 값은 applictaion/json 이 된다.
  • Content-Length
    : HTTP 요청이 보내는 메시지 body의 총 사이즈를 알려주는 헤더이다.


Body

: HTTP 요청 메시지에서 body 부분은 HTTP 요청이 전송하는 데이터를 담고 있는 부분이다. 전송하는 데이터가 없다면 body 부분은 비어 있게 된다.



Reference

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

0개의 댓글