WEB/HTTP

[HTTP] 개요, 구성요소, 클라이언트, 서버, 특징, 제어 가능한 것들, 흐름, 헤더, 메시지, API

Tree_Park 2020. 12. 15. 11:23
728x90
서론

- 그동안 웹개발 공부를 하면서 HTTP에 대한 기초지식이 부족하다는 것을 깨달았다. MDN에서 HTTP

   기초 공부를 하면서 정리한 것을 블로그에 적고자 한다.

developer.mozilla.org/ko/docs/Web/HTTP/Overview

 

HTTP 개요 - HTTP | MDN

HTTP는 HTML 문서와 같은 리소스들을 가져올 수 있도록 해주는 프로토콜입니다. HTTP는 웹에서 이루어지는 모든 데이터 교환의 기초이며, 클라이언트-서버 프로토콜이기도 합니다. 클라이언트-서버

developer.mozilla.org

 

HTTP 개요

- HTTP는 HTML과 같은 하이퍼미디어 문서 전송을 위한 애플리케이션 레이어 프로토콜이다.

  - 웹 브라우저와 웹 서버간의 커뮤니케이션을 위해 사용되며

  - HTTP는 무상태 프로토콜을 지닌다. (서버가 두 요청간에 데이터(상태)도 유지 하지 않음을 의미)

 

  - 'HTTP'는 웹에서 이루어지는 모든 데이터 교환의 기초가 되며, 하나의 완전한 문서는

     텍스트, 레이아웃, 설명, 이미지, 스크립트 등 불러온(fetched) 하위 문서들로 재구성된다.

  - 클라이언트와 서버들은 데이터 스트림과 대조적으로 개별적인 메시지 교환에 의해 통신되고,

    브라우저는 메시지를 request하고, 서버는 요청받은 메시지에 대한 결과를 response한다.

 

  - HTTP는 애플리케이션 계층의 프로토콜로, 신뢰 가능한 전송 프로토콜이라면 이론상 무엇이든

    사용할 수 있으나 TCP 혹은 TCP 연결인 TLS(Transport Layer Security, 전송 계층 보안, 이전의 SSL)

    를 통해 전송된다.

 

 

HTTP 기반 시스템의 구성 요소

- 요청은 하나의 개체, 사용자 에이전트(또는 프록시)에 의해 전송된다.

  - 기본적으로 사용자 에이전트는 브라우저지만, 무엇이든 될 수 있다. (예를들어 검색 봇)

- 각각의 개별적인 요청들은 서버로 보내지고, 서버는 요청을 처리하고 응답을 제공한다.

  - 요청과 응답 사이에 여러 개체들이 있는데, 다양한 작업을 수행하는 게이트웨이 또는 캐시역할을

    하는 프록시 등이 있다.

- 실제 브라우저와 서버 사이에는 더 많은 구성 요소(하드웨어, 라우터, 모뎀 등)이 존재하지만 웹의

  계층적인 설계 덕분에 이들은 네트워크와 전송 계층 내로 숨겨진다.

- HTTP는 그 중 애플리케이션 계층의 최상층에 존재하여 동작한다.

 

 

클라이언트: 사용자 에이전트

- 사용자 에이전트 : 사용자를 대신하여 동작을 처리하는 도구(주로 브라우저)

- 웹 페이지 표시를 위해 브라우저는 페이지의 HTML 문서를 가져오기 위한 요청 전송 뒤

  파일을 구문 분석하여 실행해야 할 스크립트, 페이지 내 포함된 하위 요소들(이미지, 비디오 등)을

  잘 표시하기 위한 레이아웃 정보(CSS)에 대응하는 추가적인 요청들을 가져온다.

- 브라우저는 완전한 문서인 웹 페이지 표시를 위해 리소스들을 혼합하고, 브라우저에 의해 실행된

  스크립트는 이후 단계에서 좀 더 많은 리소스들을 가져올 수 있고, 브라우저는 그에 따라 웹 페이지

  를 갱신한다.

 

- 웹 페이지는 하이퍼텍스트 문서로, 표시된 텍스트의 일부는 사용자가 에이전트를 제어하고 웹을

  돌아다닐 수 있도록 새로운 웹 페이지를 가져오기 위해 실행될 수 있는 링크임을 뜻한다.

- 브라우저는 HTTP 요청 내에서 이런 지시 사항들을 변환하고, HTTP 응답을 해석하여 사용자에게

  명확한 응답을 표시한다.

 

웹 서버

- 클라이언트에 요청에 대한 문서 혹은 리소스를 제공하는 서버

- 서버는 사실상 논리적으로 단일 기계를 의미한다. 이는 로드(로드 밸런싱) 혹은 그때 그때 다른

  컴퓨터(캐시, DB서버, e-커머스 서버 등)들의 정보를 얻고 완전하게 혹은 부분적으로 문서를 생성

  하는 소프트웨어의 복잡한 파트를 공유하는 서버들의 집합일 수 있다.

 

- 서버는 반드시 단일 머신일 필요 없지만, 여러 개의 서버를 동일한 머신 위에서 호스팅 가능

- HTTP/1.1과 host 헤더를 이용하여 동일한 IP 주소를 공유할 수도 있다.

 

 

 프록시

- 웹 브라우저와 서버 사이에서 많은 컴퓨터들이 HTTP 메시지를 이어 받고 전달한다.

- 여러 계층으로 이루어진 웹 스택 구조에서 컴퓨터들은 대부분은 전송,네트워크 혹은 물리

  계층에서 동작하며 성능에 큰 영향을 주지만 HTTP 계층에서는 이들이 어떻게 동작하는지 눈에

  보이지 않는다.

- 이러한 컴퓨터 중에서 애플리케이션 계층에서 동작하는 것들은 주로 '프록시'라고 한다.

- 프록시는 다양한 기능을 수행 가능하다.

  - 캐싱 (캐시는 공개 또는 비공개 (예: 브라우저 캐시))

  - 필터링 (바이러스 백신 스캔, 유해 컨텐츠 차단)

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

  - 로깅 (이력 정보를 저장)

 

 

HTTP 특징

- 간단함

  - HTTP는 사람이 읽을 수 있도록 간단하게 고안되었다.

  - HTTP/2가 다소 복잡해졌지만 HTTP 메시지를 바이너리 기반 프레임별로 캡슐화하여 간결함

    을 유지하였다.

  - 간단하기에 테스트하기가 쉽고, 초심자의 진입장벽이 낮다.

 

- 확장 가능한 HTTP

  - HTTP/1.0에서 소개된 HTTP헤더는 HTTP를 확장하고 실험하기 쉽게 만들어 주었다.

  - 클라이언트와 서버가 새로운 헤더의 시맨틱(의미)에 대해 간단한 합의만 한다면 언제든지 새로운

    기능을 추가 가능하다.

 

- HTTP는 상태가 없지만, 세션은 있다.

  - HTTP는 상태를 저장하지 않는다. 동일한 연결 상에서 연속하여 전달된 두 개의 요청사이에

    연결고리가 없는 것.

  - e-커머스 쇼핑 바구니처럼, 일관된 방식으로 상호작용하길 원할 때 문제가 되지만, HTTP의 핵심은

    상태가 존재하지 않아도 HTTP 쿠키가 상태가 있는 세션을 만들도록 도와준다.

  - 헤더 확장성을 사용하여 동일한 컨텍스트 또는 동일한 상태를 공유하기 위해 요청들에 세션을

    만들도록 HTTP 쿠키가 추가된다.

 

 - HTTP와 연결

  - 연결은 전송 계층에서 제어되므로, 근본적으로 HTTP 영역 밖이지만, 연결가능하도록 하는 근본적인

    전송 프로토콜을 요구하지 않는다.

  - 그저 신뢰할 수 있거나 메시지 손실이 없는(최소한의 오류는 표시, TCP 표준에 의존) 연결을 요구할 뿐이다.

  - HTTP/1.0의 기본 동작은 각 요청/응답에 대해 별도의 TCP 연결을 하는 것이고, 이 동작은 여러 요청을

    계속해서 보내는 경우에는 단일 TCP 연결을 공유하는 것보다 비효율적이지만

  - 이러한 결함 개선을 위해 HTTP/1.0은 파이프라이닝 개념과 지속적인 연결의 개념을 도입했다.

  - 기본적으로 TCP 연결은 Connection 헤더를 사용해 부분적으로 제어가 가능하다.

  - HTTP/2는 연결을 좀 더 지속되고 효율적으로 유지하는데 도움이 되도록, 단일 연결 상에서 메시지를

    다중 전송(multiplex)하여 한 걸음 진보 하였다.

 

 

HTTP로 제어 가능한 것

- 캐시 혹은 인증 메소드는 HTTP 초기부터 제어 해왔던 기능이며, origin 제약사항을 완화시키는 조치는

  2010년에 들어서 추가되었다.

- HTTP를 사용하여 제어 가능한 일반적인 기능 목록

 

  - 캐시

    - HTTP로 문서가 캐시되는 방식을 제어 가능하다. 서버는 캐시 대상과 기간을 프록시와 클라이언트에

      지시 가능하고, 클라이언트는 저장된 문서를 무시하라고 중간 캐시 프록시에게 지시 가능하다.

 

  - origin 제약사항 완화

    - 스누핑과 다른 프라이버시 침해를 막기 위해 브라우저는 웹 사이트간의 분리를 강제한다.

    - 동일한 origin으로부터 온 페이지만이 웹 페이지의 전체 정보에 접근 가능하다.

    - 앞의 제약사항은 서버에 부담이 되지만, HTTP 헤더를 통해 그것을 완화 가능하고, 덕분에 문서는

      다른 도메인으로부터 전달된 정보를 패치워크 가능하다.

 

  - 인증

    - 어떤 페이지들은 보호되어 오로지 특정 사용자만이 그것에 접근 가능하다.

    - 기본 인증은 HTTP를 통해 WWW-Authenticate 또는 유사한 헤더를 사용해 제공되거나, HTTP 쿠키를

       사용해 특정 세션을 설정하여 이루어질 수 있다.

 

  - 프록시와 터널링

    - 서버 혹은 클라이언트 혹은 서버-클라이언트는 종종 인트라넷에 위치하며 다른 개체들에게 그들의

      실제 주소를 숨기기도 한다.

    - HTTP 요청은 네트워크의 장벽을 가로지르기 위해 프록시를 통해 나가게 된다.

    - 하지만 모든 프록시가 HTTP 프록시라는 것은 아니다.

      - 예로, SOCKS 프로토콜은 좀 더 저수준에서 동작하고, FTP와 같은 다른 프로토콜도 이 프록시를 통해 처리

 

  - 세션

    - 쿠키 사용은 서버 상태를 요청과 연결하도록 도와준다.

    - HTTP가 기본적으로 상태 없는 프로토콜임에도 세션을 만들어주는 계기가 된다.

 

 

HTTP 흐름

- 클라이언트가 서버와 통신하고자 할 때, 최종 서버든, 중간 프록시든 다음 단계와 같은 과정을 수행한다. 

 

  1. TCP 연결을 연다. TCP 연결은 요청을 보내거나 혹은 여러개의 요청을 보낼 때 응답을 받는데 사용된다.

     클라이언트는 새 연결을 열거나, 기존 연결을 재사용하거나, 서버에 대한 여러 TCP 연결을 열 수 있다.

  2. HTTP 메시지를 전송. HTTP 메시지(HTTP/2 이전의)는 인간이 읽을 수 있고 HTTP/2에서는 이런 간단한

     메시지가 프레임 속으로 캡슐화되어 직접 읽는게 불가능하지만 원칙은 동일하다.

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 파이프라이닝은 오래된 소프트웨어와 최신 버전이 공존하고 있는 기존의 네트워크 상에서 구현하기

  어려운게 입증되었으며, 프레임안에서 보다 활발한 다중 요청을 보내는 HTTP/2로 교체되고 있다.

 

 

HTTP 메시지

- HTTP/1.1와 초기 HTTP 메시지는 사람이 읽을 수 있다. HTTP/2에서는 메시지들을 새로운 이진 구조인

  프레임 안으로 임베드하여, 헤더의 압축과 다중화와 같은 최적화를 가능케 한다.

- 본래 HTTP 메시지의 일부분만이 이 버전의 HTTP 내에서 전송된다고 할지라도, 각 메시지의 의미들은

  변화하지 않고 본래의 HTTP/1.1 요청을(가상으로) 재구성한다.

- HTTP/1.1 포맷 내에서 HTTP/2를 이해하는 것은 여전히 유용하다.

 

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

- HTTP 요청의 예

GET / HTTP/1.1 ← 요청라인[Method(요청 방식) / URL(요청 URI) / Version(HTTP 버전)]
Accept: text/html, application/json, image/zip, */*
Accept-Language: ko
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 
	        (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 Edge/15.15063
Accept-Encoding: gzip, deflate
Host: 192.168.211.55
Connection: Keep-Alive
Cache-Control: no-cache

  - 요청은 다음의 요소들[요청라인][HTTP 헤더][공백][HTTP 바디]로 구성된다.

  - 헤더와 메시지 바디 사이에 공백이 존재하고, 이 공백으로 헤더와 바디를 구분한다.

  - 요청라인 이후, HTTP 헤더 정보들이 포함되고, 요청 라인과 헤더 정보 다음엔 메시지 바디가 위치

  - 바디부분에 웹서버로 전달하고자 하는 사용자 데이터가 흔히 포함되고, 로그인 창에 아이디와 패스워드

    를 입력하도록 전달할 때 이 바디 부분에 입력데이터를 포함하여 전송

 

  - 요청라인

    - HTTP 메서드 :

      - 보통 클라이언트가 수행하고자 하는 동작을 정의한 GET, POST 같은 동사나 OPTINOS나 HEAD와

        같은 명사

      - 일반적으로 클라이언트 리소스를 가져오거나 HTML 폼의 데이터를 전송하려고 하지만 다른 경우

        에는 다른 동작이 요구 될 수 있다.

 

      - 가져오려는 리소스의 경로 : 

        - 예를 들면 프로토콜(HTTP://), 도메인(developer.mozilla.org), 또는 TCP 포트(80) 요소들을 제거한

          리소스의 URL

 

      - HTTP 프로토콜의 버전

      - 서버에 대한 추가적인 정보를 전달하는 선택적 헤더들 

      - POST와 같은 몇 가지 메서드를 위한 전송된 리소스를 포함하는 응답의 본문과 유사한 본문

 

  - HTTP 헤더

    - HTTP는 클라이언트와 서버가 요청 또는 응답으로 부가적인 정보를 전송할 수 있도록 해준다. 

    - 헤더는 대소문자를 구분하지 않는 이름과 콜론':' 다음에 오는 값(줄 바꿈 없이)으로 이루어져 있다.

    - 다른 것들은 IANA 레지스트리에 나열되어 있으며, 원본 컨텐츠는 RFC 4228에서 정의되었다.

  

    - 헤더는 컨텍스트에 따라 그룹핑 될 수 있다.

      - General header : 요청과 응답 모두에 적용되지만 바디에서 최종적으로 전송되는 데이터와 관련이 

        없는 데이터

      - Request header : 패치될 리소스나 클라이언트 자체에 대한 자세한 정보를 포함하는 헤더

      - Response header : 위치 또는 서버 자체에 대한 정보(이름, 버전등)와 같이 응답에 대한 부가적인

                                 정보를 갖는 헤더

      - Entity header : 컨텐츠 길이나 MIME 타입과 같이 엔티티 바디에 대한 자세한 정보를 포함하는 헤더

 

     - 헤더는 또한 프록시의 처리 방법에 따라 그룹핑할 수도 있다.

       - 종단간 헤더

         - 반드시 메시지의 최종 수신자에게 전송되어야 한다. 요청에 대해서는 서버, 응답에 대해서는

           클라이언트

         - 중간 프록시는 반드시 종간 간 헤더가 수정되지 않은 상태로 재전송해야하며 캐시는 이를 반드시

           저장해야 한다.

 

        - 홉간 헤더

          - 단일 전송-레벨 연결에서만 의미가 있으며 프록시에의해 재전송되거나 캐시되어서는 안된다.

          - 이러한 헤더들은 다음과 같다. (Connection, Keep-Alive, Proxy-Authenticate, Proxy-Authorization,

             TE, Trailer, Transfer-Encoding, Upgrade)

          - 홉간 헤더는 Connecction 일반 헤더를 사용해 설정될 수도 있다.

 

        - HTTP 헤더 요약 리스트

 

- HTTP 응답의 예

HTTP/1.1 200 OK
Date: Fri, 14 Jul 2018 05:24:24 GMT
Server: Apache/2.4.25 (Ubuntu)
Set-Cookie: PHPSESSID=6oufjf43migs432fsfmipodm1; path=/
Expires: Thu, 19 Nov 1981 09:42:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 3132
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitonal//EN” http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<!--
Modified from the Debian original for Ubuntu
→
…

  - HTTP 응답 [상태라인][헤더][공백][바디]

    상태 라인은 다음 항목으로 구성된다 : HTTP 버전, 상태 코드, 응답 이유

      - HTTP 프로토콜의 버전

       - 요청의 성공 여부와, 그 이유를 나타내는 상태 코드

       - 아무런 영향력이 없는 상태 코드와 짧은 설명을 나타내는 상태 메시지

  - 요청 헤더와 비슷한 HTTP 헤더들

  - 선택 사항으로 가져온 리소스가 포함되는 본문

 

HTTP 기반 API

- USER-AGENT와 서버간에 데이터를 교환하는데 사용 가능한 XMLHttpRequest API

  최신 Fetch API는 보다 강력하고 유연한 기능을 제공

- 또 다른 API인 서버-전송 이벤트는 서버가 전송 메커니즘으로 HTTP를 사용하여 클라이언트로 이벤트를

  보낼 수 있도록하는 단방향 서비스

- 클라이언트 EventSource 인터페이스를 사용하여 연결을 맺고 이벤트 핸들러를 설정

- 클라이언트 브라우저는 HTTP 스트림으로 도착한 메시지를 적절한 Event 객체로 자동 변환하여, 알려진

  경우 해당 이벤트타입에 대해 등록된 이벤트 핸들러로 전달하거나 또는 특정 유형의 이벤트가 설정되지

  않은 경우에는 onmessage이벤트 핸들러로 전달

 

- * Network Monitor

'WEB > HTTP' 카테고리의 다른 글

[HTTP] MIME 타입(개요,문법,웹 개발자들을 위한 MIME 타입)  (0) 2020.12.15