HTTP란 무엇인가?

p-q·2022년 11월 17일
0

web

목록 보기
2/3
post-thumbnail

HyperText Transfer Protocol(하이퍼텍스트 전송 프로토콜)은 HTML 과 같은 하이퍼미디어 문서를 전송하기 위한 애플리케이션 계층 프로토콜입니다. 웹 브라우저와 웹 서버 간의 커뮤니케이션을 위해 디자인되었지만, 다른 목적으로도 사용될 수 있습니다.

HTTP 개요

HTTP는 HTML 문서와 같은 리소스들을 가져올 수 있도록 해주는 프로토콜 입니다.
HTTP는 웹에서 이루어지는 모든 데이터 교환의 기초이며, 클라이언트-서버 프로토콜이기도 합니다. 클라이언트-서버 프로토콜이란 수신자(웹브라우저) 측에 의해 요청이 초기화되는 프로토콜을 의미합니다. 하나의 완전한 문서는 텍스트, 레이아웃, 이미지, 비디오, 스크립트 등 불러온 하위 문서들로 재구성됩니다.

기반 시스템 구성요소

HTTP는 클라이언트-서버 프로토콜입니다. 요청은 하나의 개체, 클라이언트(또는 그것을 대신하는 프록시)에 의해 전송됩니다. 대부분의 경우, 클라이언트는 브라우저지만, 무엇이든 될 수 있습니다. 예를 들어, 검색 엔진 인덱스를 채워넣고 유지하기 위해 웹을 돌아다니는 로봇이 그러한 경우입니다.

  • 프록시

    웹 브러우저와 서버 사이에서는 수많은 컴퓨터와 머신이 HTTP 메세지를 이어 받고 전달합니다. 여러 계층으로 이루어진 웹 스택 구조에서 이러한 컴퓨터/머신들은 대부분 전송, 네트워크 혹은 물리 계층에서 동작하며, 성능에 상당히 큰 영향을 주지만 HTTP 계층에서는 이들이 어떻게 동작하는지 눈에 보이지 않습니다. 이러한 컴퓨터/머신 중에서도 애플리케이션 계층에서 동작하는 것들을 일반적으로 프록시 라고 부릅니다.
    프록시는 눈에 보이거나 그렇지 않을 수도 있으며(프록시를 통해 요청이 변경되거나 변경되지 않는경우)다양한 기능들을 수행할 수 있습니다.

    • 캐싱
      캐시는 공개 또는 비공개 가능 EX > 브라우저의 캐시

    • 필터링
      EX > 바이러스 백신 스캔, 유해 컨텐츠 차단(자녀 보호) 기능 등

    • 로드 밸런싱
      여러 서버들이 서로 다른 요청을 처리하도록 허용

    • 인증
      다양한 리소스에 대한 접근 제어

    • 로깅
      이력 정보를 저장


기초적인 측면

  • 사용이 간단합니다.
  • 확장이 용이합니다.
  • 상태가 없지만, 세션은 있습니다.
    HTTP는 상태를 저장하지 않습니다. 동일한 연결 상에서 연속하여 전달된 두 개의 요청 사이에는 연결고리가 없습니다. 일관된 방식으로 사용자가 페이지와 상호작용하길 원할 때 문제가 됩니다. 하지만, HTTP의 핵심은 상태가 없는 것이지만 HTTP 쿠키는 상태가 있는 세션을 만들도록 해줍니다. 헤더 확장성을 사용하여, 동일한 컨텍스트 또는 동일한 상태를 공유하기 위해 각각의 요청들에 세션을 만들도록 HTTP 쿠키가 추가됩니다.
    • 컨텍스트: HTTP 말하는 컨텍스트는 서버를 통해 들어오고 나가는 클라이언트 측 요청과 응답에 대한 정보를 구성하고 있는 것들 이라고 생각합니다.

제어

  • 캐시: HTTP로 문서가 캐시되는 방식을 제어할 수 있습니다.
  • origin 제약사항 완화하기: 스누핑과 다른 프라이버시 침해를 막기 위해, 브라우저는 웹 사이트 간의 엄격한 분리를 강제합니다. 동일한 oring으로부터 온 페이지만이 웹 페이지의 전체 정보에 접근할 수 있습니다. 그런 제약 사항은 서버에 부담이 되지만, HTTP 헤더를 통해 그것을 완화시킬 수 있습니다.
  • 인증: 어떤 페이지들은 보호되어 오로지 특정 사용자만이 그것에 접근할 수도 있습니다. 기본 인증은 HTTP를 통해 또는 유사한 헤더를 사용해 제공되거나, HTTP 쿠키를 사용해 특정 세션을 선정하여 이루어질 수도 있습니다 HTTP 쿠키란?->링크달아~
  • 프록시와 터널링
  • 세션: 쿠키 사용은 서버 상태를 요청과 연결하도록 해줍니다. 이것은 HTTP가 기본적으로 상태없는 프로토콜임에도 세션을 만들어주는 계기가 됩니다. HTTP 세션이란?->링크달아~

흐름

클라이언트가 서버와(최종 서버 또는 중간 프록시) 통신하고자 할 때 다음과 같은 과정을 수행합니다.

  1. TCP 연결 열기: TCP 연결은 요청을 보내거나 응답을 받는데 사용됩니다. 클라이언트는 새 연결을 열거나, 기존 연결을 재사용하거나, 서버에 대한 여러 TCP 연결을 열 수 있습니다.
  2. HTTP 메세지를 전송합니다: HTTP 메세지(HTTP/2 이전의)는 인간이 읽을 수 있습니다. HTTP/2에서는 이런 간단한 메세지가 프레임 속으로 캡슐화되어, 직접 읽는게 불가능 하지만 원칙은 동일합니다.
GET / HTTP/1.1
Host: exaple.com
Accept-Language: Kr

3.다음과 같이 서버에서 보낸 응답을 읽어들입니다.

HTTP/1.1 200 OK
Date: Sat, 09 Oct 2021 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 come the 29769 bytes of the requested web page)

4.연결을 닫거나 다른 요청을 위해 재사용합니다.

HTTP 파이프라이닝이 활성화되면, 첫번째 응답을 완전히 수신할 때까지 기다리지 않고 여러 요청을 보낼 수 있습니다. HTTP 파이프 라이닝은 오래된 소프트웨어와 최신 버전이 공존하고 있는, 기존의 네트워크 상에서 구현하기 어렵다는게 입증되었으며, 프레임안에서 보다 활발한 다중 요청을 보내는 HTTP/2로 교체되고 있습니다.


메세지

HTTP 메시지의 두 가지 타입인 요청(requests)과 응답(responses)은 각자의 특성있는 형식을 가지고 있습니다.

요청(Requests)

  • HTTP 메서드, 보통 클라이언트가 수행하고자 하는 동작을 정의한 GET,POST 같은 동사나 OPTIONS 나 HEAD 와 같은 명사입니다.
  • 가져오려는 리소스의 경로 예를 들면 프로토콜 (http://), 도메인 (en-US) (여기서는 developer.mozilla.org), 또는 TCP 포트 (en-US) (여기서는 80)인 요소들을 제거한 리소스의 URL입니다.
  • HTTP 프로토콜의 버전
  • 서버에 대한 추가 정보를 전달하는 선택적 헤더들.
  • POST와 같은 몇 가지 메서드를 위한, 전송된 리소스를 포함하는 응답 본문과 유사한 본문.

    응답(Response)

  • HTTP 프로토콜의 버전.
  • 요청이 성공했는지 여부과 그 이유를 나타내는 상태코드.
  • 아무련 영향력이 없는, 상태 코드의 짧은 설명을 나타내는 상태 메시지.
  • 요청 헤더와 비슷한, HTTP 헤더들
  • 선택 사항으로, 가져온 리소스가 포함되는 본문.

기반 API

HTTP 기반으로 가장 일반적으로 사용된 API는 user_agent(웹 맥락에선 브라우저를 의미)와 서버간에 데이터를 교환하는데 사용될 수 있는 XMLHttpRequest API 입니다. 최신 Fetch API는 보다 강력하고 유연한 기능을 제공합니다.

  • XMLHttpRequest API
    (XHR) 객체는 서버와 상호작용할 때 사용합니다. XHR을 사용하면 페이지의 새로고침 없이도 URL에서 데이터를 가져올 수 있습니다. 이를 활용하면 사용자의 작업을 방해하지 않고 페이지의 일부를 업데이트할 수 있습니다.
    XMLHttpRequest는 AJAX 프로그래밍에 많이 사용됩니다.
  • Fetch API
    네트워크 통신을 포함한 리소스 취득을 위한 인터페이스가 정의되어 있습니다. XMLHttpRequest와 같은 비슷한 API가 존재합니다만, 새로운 Fetch API는 좀더 강력하고 유연한 조작이 가능합니다.

    참고자료

    MDN, "웹과 HTTP", https://developer.mozilla.org, (2022-11-17)
profile
ppppqqqq

0개의 댓글