HTTP

Joon·2021년 10월 22일
0

HTTP란?

먼저 위키피디아에서 제공하는 HTTP의 정의를 살펴보자.
https://ko.wikipedia.org/wiki/HTTP

HTTP(HyperText Transfer Protocol, 문화어: 초본문전송규약, 하이퍼본문전송규약)는 W3 상에서 정보를 주고받을 수 있는 프로토콜이다. 주로 HTML 문서를 주고받는 데에 쓰인다. 주로 TCP를 사용하고 HTTP/3 부터는 UDP를 사용하며, 80번 포트를 사용한다.

이 정의를 나름대로 요약해보면, HyperText Transfer Protocol의 준말로 인터넷 상에서 데이터를 주고 받기 위한 프로토콜(규약, 약속)이다.

본래 네트워크상에서 교환하는 데이터는 주로 한 문서와 다른 문서를 연결하는 하이퍼링크를 포함하는 텍스트 문서의 형식이었는데, 이것의 이름이 HyperText이다. 다만 '주로' 교환하는 데이터 형식이 HTML같은 HyperText였을 뿐, 이론상으로는 JSON, mp4, mp3, 등등 모든 종류의 데이터를 교환할 수 있기 때문에,
기술이 발달하고 예전처럼 데이터 형식으로 문서만을 사용하지는 않는 요즘, 오늘날의 HTTP의 HyperText는 HyperMedia로 해석하는 것이 나을 듯 싶다.

특징

  1. OSI 7 계층 중, Application Layer 계층의 프로토콜로 주로 TCP/IP 위에서 작동한다.
  2. 서버/클라이언트 모델이다

    - HTTP는 클라이언트가 서버에 요청을 하고, 서버는 그에 응답하는 단방향 모델이다.
    - 클라이언트의 요청에 대한 서버의 응답은 요청 처리 결과에 따라 각기 다른 응답코드로 나뉜다. 따라서 응답코드 별로 처리 로직을 짜서 각 상황에 대응할 수 있다.
  3. 전송되는 데이터들을 암/복호화 하지 않기 때문에 보안이 취약하다
    -> 제 3자가 데이터를 엿볼 가능성이 있다. 이를 보안하기 위한 것이 바로 HTTPS이다.
  4. 간단하다.
  • 초반 HTTP/1의 경우, 사람이 읽어도 이해가 가능할 정도로 간단하게 고안되었다. HTTP/2에서 binary 코드가 더해짐에 따라 더 복잡해지기는 했지만, 캡슐화를 통해 간결함을 유지하였다.
  1. 확장가능하다.
  • 클라이언트와 서버가 새로운 헤더의 시멘틱(semantic)에 대하여 합의만 한다면, 얼마든지 새로운 기능을 추가하여 확장하는 것이 어렵지 않다.
  1. 비연결성(Connectionless)
  • 클라이언트와 서버가 한 번 연결을 맺은 후, 클라이언트 요청에 대해 서버가 응답을 마치면 맺었던 연결을 끊어 버리는 성질을 말한다.
  • 장점
    • HTTP는 인터넷 상에서 불특정 다수의 통신 환경을 기반으로 설계되었는데, 만약 서버에서 다수의 클라이언트와 연결을 계속 유지해야 한다면, 이에 따른 많은 리소스가 발생하게 된다. 따라서 연결을 유지하기 위한 리소스를 줄이면 더 많은 연결을 할 수 있다.
    • 접속 유지를 최소한으로 하되, 더 많은 유저의 요청을 처리할 수 있다.
  • 단점
    • 서버는 클라이언트를 기억하지 못하므로 동일한 클라이언트의 모든 요청에 대해 매번 새로운 연결 시도/해제의 과정을 거쳐야한다.
    • 연결/해제에 대한 오버헤드(어떤 처리를 하기 위해 들어가는 간접적인 처리시간/메모리)가 발생한다.
    • KeepAlive
      • Connectionless의 단점(연결/해제 오버헤드)을 해결하기 위해 일시적으로 연결을 유지할 수 있는 옵션
  1. 무상태성(Stateless)
  • Connectionless로 인해 파생된 특징. 연결이 끊어짐에 따라 서버는 클라이언트를 식별하지 못한다.
  • 서버는 클라이언트의 상태를 저장하지 않는다. → 클라이언트가 이전에 했던 요청과 그 다음 요청은 아무런 연관이 없다. 즉, 서버의 응답은 연속된 요청에 대해 각각 독립적으로 반응한다.
  • 장점
    • 서버 확장에 대한 부담이 적다 → 서버가 많아질수록 서버 간에 정보를 공유하기 위한 비용이 비싸지기에 Stateless하게 사용하면 정보 공유를 위한 비용(시간, 메모리)등을 절약할 수 있다.
    • 어느 서버가 요청을 받아도 응답이 빠르게 가능하다.
  • 단점

  • Stateful
    • 서버가 클라이언트의 상태를 저장하는 것을 Stateful이라고 한다.

흐름(Flow)

다음은 MDN사이트에 나와있는 HTTP의 흐름이다.

  1. TCP연결을 연다.
  2. HTTP 메시지를 전송한다.
    ```
    GET / HTTP/1.1
    Host: developer.mozilla.org
    Accept-Language: fr
    ```
  3. 서버에 의해 전송된 응답을 읽는다.
    ```
    HTTP/1.1 200 OK
    Date: Sat, 09 Oct 2010 14:28:02 GMT
    Server: Apache
    Last-Modified: Tue, 01 Dec 2009 20:18:22 GMT
    ETag: "51142bc1-7449-479b075b2891b"
    Accept-Ranges: bytes
    Content-Length: 29769
    Content-Type: text/html
    
    <!DOCTYPE html... (here comes the 29769 bytes of the requested web page)
    ```
  4. 연결을 닫거나 다른 요청들을 위해 재사용한다.

HTTP 메세지

  1. 시작 줄(start-line)에는 실행되어야 할 요청, 또은 요청 수행에 대한 성공 또는 실패가 기록되어 있다. 이 줄은 항상 한 줄로 끝난다.
  2. 옵션으로 HTTP 헤더 세트가 들어간다. 여기에는 요청에 대한 설명, 혹은 메시지 본문에 대한 설명이 들어간다.
  3. 요청에 대한 모든 메타 정보가 전송되었음을 알리는 빈 줄(blank line)이 삽입된다.
  4. 요청과 관련된 내용(HTML 폼 콘텐츠 등)이 옵션으로 들어가거나, 응답과 관련된 문서(document)가 들어간다. 본문의 존재 유무 및 크기는 첫 줄과 HTTP 헤더에 명시된다.

요청(Request)

시작줄(Start line)

  1. HTTP Method
    HTTP 요청 메서드 - HTTP | MDN
  • GET : 정보를 요청하기 위해서 사용한다. (SELECT)
  • POST : 정보를 밀어넣기 위해서 사용한다. (INSERT)
  • PUT : 정보를 업데이트하기 위해서 사용한다. (UPDATE)
  • DELETE : 정보를 삭제하기 위해서 사용한다. (DELETE)
  • HEAD : (HTTP)헤더 정보만 요청한다. 해당 자원이 존재하는지 혹은 서버에 문제가 없는지를 확인하기 위해서 사용한다.
  • OPTIONS : 웹서버가 지원하는 메서드의 종류를 요청한다.
  • TRACE : 클라이언트의 요청을 그대로 반환한다. 예컨데 echo 서비스로 서버 상태를 확인하기 위한 목적으로 주로 사용한다.
  1. 요청 타겟. 이는 URL, 또는 프로토콜, 포트, 도메인의 절대 경로로 나타낼 수도 있으며 요청 타겟 포맷은 HTTP 메소드에 따라 달라진다.
  • origin 형식: 끝에 '?'와 쿼리 문자열이 붙는 절대 경로이다. 이는 가장 일반적인 형식이며, GETPOSTHEADOPTIONS 메서드와 함께 사용한다.
    POST / HTTP 1.1
    GET /background.png HTTP/1.0
    HEAD /test.html?query=alibaba HTTP/1.1
    OPTIONS /anypage.html HTTP/1.0
  • absolute 형식: 완전한 URL 형식이다. 프록시에 연결하는 경우 대부분 GET과 함께 사용된다.
    GET http://developer.mozilla.org/en-US/docs/Web/HTTP/Messages HTTP/1.1
  • authority 형식: 도메인 이름 및 옵션 포트(':')로 이루어진 URL의 authority component 이다. HTTP 터널을 구축하는 경우에만 CONNECT와 함께 사용할 수 있다.
    CONNECT developer.mozilla.org:80 HTTP/1.1
  • asterisk 형식: OPTIONS와 함께 별표('*') 하나로 간단하게 서버 전체를 나타낸다. 
    OPTIONS * HTTP/1.1
  1. HTTP version
    HTTP/1.0

헤더

HTTP 헤더 - HTTP | MDN

  • General Header(공통 헤더)
    요청 및 응답의 메시지 모두에서 사용되지만 컨텐츠에는 적용되지 않는 헤더
  • Request Header(요청 헤더)
    HTTP 요청에서 사용되지만 메시지의 컨텐츠와 관련이 없는 HTTP 헤더
    보통 Fetch될 리소스나 클라이언트 자체에 대한 정보를 포함하여 서버로 보내진다.
  • Entity Header(엔티티 헤더)
    컨텐츠 길이나 MIME 타입과 같이 엔티티 바디에 대한 자세한 정보를 포함하는 헤더.

본문

요청의 마지막 부분에 들어가며, 모든 요청에 본문이 들어가지는 않는다.

응답(Response)

상태줄(Status line)

  1. 프로토콜 버전: 보통 HTTP/1.1 이다
  2. 상태 코드: 요청의 성공 여부를 나타낸다. 200404 혹은 302 이다.
  3. 상태 텍스트: 짧고 간결하게 상태 코드에 대한 설명을 글로 나타내어 사람들이 HTTP 메시지를 이해할 때 도움이 된다.

예) HTTP/1.1 404 Not Found.

헤더(Header)


요청부분의 헤더와 매우 유사하다.

본문(body)

본문은 응답의 마지막 부분에 들어가며, 모든 응답에 본문이 들어가지는 않는다. 201, 204과 같은 상태 코드를 가진 응답에는 보통 본문이 없다.

profile
한줄씩 완성해가는 개발 공부

0개의 댓글