HTML HTTP

불꽃남자·2020년 9월 21일
0
post-custom-banner

오늘은 HTTP와 REST API에 대해서 알아본다.

HTTP?

HTTP는 Hyper Text Transfer Protocol의 약자로, 클라이언트와 서버간의 통신에 있어 데이터의 형식에 대한 규칙이라고 이야기 할 수 있다.
MDN에선 프로토콜에 대해 다음과 같이 정의하고 있다.

프로토콜은 컴퓨터 내부에서, 또는 컴퓨터 사이에서 데이터의 교환 방식을 정의하는 규칙 체계입니다. 기기 간 통신은 교환되는 데이터의 형식에 대해 상호 합의를 요구합니다. 이런 형식을 정의하는 규칙의 집합을 프로토콜이라고 합니다.

HTTP 기반 통신의 구성

HTTP는 클라이언트-서버간의 프로토콜이다. 클라이언트에서 서버로 요청을 보내면, 서버에서 클라이언트로 응답을 보낸다.

그리고 이 요청과 응답 사이에 게이트웨이, 혹은 프록시가 존재한다. 이들은 요청과 응답을 중계하며 그 외 다양한 작업을 한다.
http 1

클라이언트

HTTP에서, 클라이언트는 사용자 에이전트이다. 사용자 에이전트는 단어 그대로 사용자를 대신하여 동작하는 것을 의미하는데, 이는 대부분의 경우 브라우저이다.
클라이언트에서 요청을 보낼 때에 요청의 헤더에 User-Agent라는 key의 value로 담기는데, 쉽게 말해서 이 요청이 어떤 환경에서 보내졌는가? 를 나타내는 것이다.

웹 서버

서버는 클라이언트로 요청을 받고, 요청의 내용에 알맞은 응답을 보낸다. 웹 서버는 웹 사이트가 표시되기 위한 데이터를 반환하고, 웹 서버는 주로 HTML, JS Script, CSS 및 이미지 등을 반환한다.

프록시

프록시는 클라이언트와 서버 사이를 중계해주는 역할을 수행한다. 중계뿐만 아니라 여러가지 기능도 수행할 수 있다.

  1. 캐싱: 자주 받는 요청에 대한 응답을 프록시에 저장해두고, 같은 요청이 들어왔을때 프록시에서 바로 응답을 반환한다. 이로 인해 응답을 받기까지의 시간이 줄어든다.
  2. 필터링: 부적절한 서버로의 요청등을 필터링 할 수 있다.
  3. 인증: 다양한 리소스에의 요청을 제한한다. 예를 들어 일반 사용자가 서버에 저장된 다른 사용자들의 아이디와 비빌번호 데이터들을 요청할 수는 없을 것이다.
  4. 로깅: 요청과 응답에 대한 이력 정보들을 저장한다.

HTTP 작동 흐름

  1. TCP 연결을 연다. TCP는 데이터 전송 프로토콜이다.
  2. HTTP 메시지를 전송한다. 아래는 요청 HTTP 메시지이다.
GET / HTTP/1.1
Host: developer.mozilla.org
Accept-Language: fr
  1. 서버가 보내온 응답을 받는다. 아래는 응답 HTTP 메시지이다.
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)

HTTP 메시지

HTTP 요청 메시지

아래 코드는 MDN의 HTTP 웹 문서에 나와있는 HTTP 요청 메시지의 예시이다.

GET / HTTP/1.1 //Start line
Host: developer.mozilla.org //Header
Accept-Language: fr

HTTP 메시지는 크게 세 부분으로 나뉜다.

  1. Start Line
  2. Header
  3. Body

Start Line

요청 메시지의 Start Line은 HTTP 메서드, 가져오려는 리소스의 경로, HTTP의 버전으로 구성된다. 예시의 요청 메시지는 HTTP1.1 버전으로 GET 메서드를 / 경로에 보내고 있다.

요청 메시지의 Header는 요청 메시지에 대한 부가적인 설명이다. 대부분의 Header는 option이지만 Host와 같이 필수적인 Header도 있다. Host는 HTTP1.1에선 필수 Header이다.

Body

예시에는 나오지 않지만 요청 메시지도 body가 있다. 서버는 요청 메시지의 메서드, 요청 리소스 경로, 요청 메시지의 body의 내용 등으로 응답 메시지의 내용을 결정한다.
내가 만들었던 blog를 예를 들면 요청 메시지의 body에 postId의 key와 value를 넣고, /post 경로로 GET 메서드를 요청한다면 서버는 요청 메시지의 postId에 해당하는 Id를 가진 Post를 반환한다.

HTTP 응답 메시지

아래 코드는 MDN의 HTTP 웹 문서에 나와있는 HTTP 응답 메시지의 예시이다.

HTTP/1.1 200 OK //Start Line
Date: Sat, 09 Oct 2010 14:28:02 GMT //Header
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) //Body

Start Line

응답 메시지의 Start Line을 살펴보자.
HTTP1.1은 역시 HTTP의 버전이 1.1임을 나타낸다. 200 이라는 숫자는 요청이 성공적으로 되었다는 것을 나타내는 HTTP 상태 코드이다.
상태코드는 100번대 부터 500번대 까지 5개의 그룹으로 나뉘어진다. 모든 상태 코드에 대한 명세는 MDN에 정리되어 있다.
OK 는 상태 코드 200에 대한 짤막한 설명이다.

Header

응답 메시지의 Header 또한 응답에 대한 부가적인 정보를 담고 있다. 예시 메시지를 보면 언제 응답이 되었는지, 웹 서버의 종류가 무엇인지, Content의 크기나 타입 따위에 대한 정보가 들어있음을 알 수 있다.

Body

요청에 대한 Content를 담고 있는 부분이다. 예시 코드에는 웹 사이트의 HTML 코드가 담겨 있다. 응답 메시지의 Content는 꼭 HTML코드만이 아니라 json코드일 수도 있고, 다른 것이 될 수도 있다.
또한 모든 응답 메시지가 Body를 갖고 있지는 않다.

참고 사이트

MDN

profile
프론트엔드 꿈나무, 탐구자.
post-custom-banner

0개의 댓글