Http Protocol

Http는 일상생활에서 굉장히 많이 목격하며 ‘인터넷에는 이런게 있구나’라는 것을 컴퓨터 관련 지식이 없더라도 컴퓨터나 스마트폰을 하는 대다수의 사람들은 알고 있습니다. 그러나 Http에 대해 보기는 했지만 그것이 무엇인지 한번 알아보고 통신은 어떻게 이루어지는지 보려고 합니다. 웹개발을 하는 사람이라면 Http에 대해 알고있으며 통신을 실제로 많이 해봤을 것입니다. 그러면 Http에 대해 알아보려고 합니다.

Http의 뜻을 살펴보면 HyperText Transfer Protocol입니다. 뜻을 살펴 보면 Hyper Text를 운반하는 Protocol입니다. 그렇다면 Hyper Text라는 것은 무얼 뜻하는 것일까요? 먼저, Hyper의 뜻을 살펴보면 초, 최고의 이며, 생태학적 관점에서 가장 높은 단계를 뜻하는 단어 입니다. 단계별로 분류하면 Infra < Sub < Hypo < Ultra < Super < Hyper 순으로 나오는데 Hyper가 최상위를 뜻하는 단어 입니다. 그러면 HyperText는 초월적인, 최고의 문자이고, 이런 HyperText들로 이루어진 언어의 집합을 HTML(HyperText Markup Language)이라고 하며, Protocol은 통신 규약이라는 뜻을 가지고 있습니다. 즉, Http는 초(월적인)문자를 운반하는 통신규약 이라고 볼 수 있습니다.
* Ultra Text, Greate Text라는 말을 쓸 수도 있지않나 생각이 들지만, 알파벳 하나하나의 코드로 음악, 동영상, 그림 등 모든 것을 표현 할 수 있기에 Hyper를 써서 글자할 수 있는 최고수준의 역할을 하기에 HyperText라고 쓰지 않았나 생각이 들기도 합니다.

Http 구조

Http요청시에 브라우저가 서버에 요청(Request)를 하고 서버는 그 응답(Response)을 브라우저로 전달함으로써, 서로간의 주고받는 데이터 통신이라고 볼 수 있습니다

Jekyll

Request

요청라인, 헤더 정보, 공백, 본문의 형식을 가지고 있습니다. Http요청시에 Header에 담기는 정보와 Body에 담기는 정보를 요청하려는 내용에 따라서 다르게 넣을 수 있으며 형식은 다음과 같습니다

<!-- Request Line -->
POST http://localhost:52456/Default/default.aspx/getResult HTTP/1.1
<!-- Header Line -->
Host: localhost:52456
Connection: keep-alive
Content-Length: 33
Accept: application/json, text/javascript, */*; q=0.01
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
Content-Type: application/json; charset=UTF-8
Origin: http://localhost:52456
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: http://localhost:52456/Default/Default.aspx
Accept-Encoding: gzip, deflate, br
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
<!-- Blank Line -->

<!-- Body Line -->
{'userid' : '1', 'name' : 'Mike'}

Request Line

Request Line에는 요청 메소드, 요청 Url, Http버전이 있습니다. 요청 메소드로는 일반적으로 GET, POST, PUT, DELTE 등이 있으며 이 이외에도 여러가지가 있지만 보통 이 4가지 범주를 잘 벗어나지 않습니다

GET : 어떤 정보를 찾을 때
POST : 어떤 정보를 추가 할때
PUT : 어떤 정보를 수정할 때
DELETE : 어떤 정보를 삭제할 때

Jekyll

Http요청시 Url은 다음과 같으며 각 영역은 다음 내용과 같습니다

Protocol : http와 http중 어떤 것을 이용하여 접속하는지 구분합니다.
Host/IP : 접속하려는 Host정보를 입력 합니다. www.naver.com이 될 수도 있고 218.xxx.xx.xxx와 같은 IP주소로도 입력이 가능합니다.
Port : 접속하려는 Host의 어느 Port로 갈지 입력합니다. 기본적으로 Http는 80 Port, Https는 443 Port이며, 이 Port의 의미는 Host에 들어가기 위한 문(?)의 번호라고 이해하면 수월합니다.
Resource Path : Host에 접속하여 찾으려고 하는 자원의 위치를 지정하는 영역이며 /의 마지막에는 최종적으로 찾으려고 하는 파일명이라고 볼 수 있습니다.
Query : 주로 GET방식으로 Http를 호출할 때 Query영역을 이용하여 데이터를 보냅니다. 형식은 ?key=value&key=value&key=value이며 ?로 시작하여 key값의 구분자는 &로 합니다.(id, name과 같은 전송할 데이터의 제목은 key, 값은 value라고 명명합니다.)
GET방식으로 하면 Query에 값을 담지만 POST로 전송시 body영역에 값을 담아서 요청합니다.

Header Line(Request)

Http요청시 클라이언트 측의 주요 정보를 담아서 보내는 영역입니다.

Content-Type : 전송할 데이터의 전송타입을 결정합니다. 주로 Json을 많이 쓰긴 하지만 상황에 맞게 Xml이나 다른 형식을 쓸 수 있습니다.
User-Agent : 현재 사용자의 브라우저의 구체적인 정보를 나타냅니다.

Blank Line(Request)

Header Line과 Body Line을 구분하기 위한 영역입니다. 구분을 위한 영역으로 한줄 공백인 영역입니다.

Body Line(Request)

Http요청시 필요에 따라 데이터를 넣을 수 있는 영역입니다. API통신시에도 필요에 따라 여러개 넣을 수 있습니다.

Response

Requst와 비슷한 형식이며 상태라인, 헤더 정보, 공백, 본문의 형식을 가지고 있습니다. Http요청내용에 따라 Body영역이 Html, css, javascript 등의 코드 및 태그가 될 수 있습니다.

<!-- Status Line -->
HTTP/1.1 200 OK
<!-- Header Line -->
Cache-Control: private, max-age=0
Content-Type: application/json; charset=utf-8
Server: Microsoft-IIS/10.0
X-SourceFiles: =?UTF-8?B?RDpcREFUQVxDb2RpbmcgU3R1ZHlcQXNwLk5ldChXZWIpXFV0aWxXZWJcVXRpbFdlYlxEZWZhdWx0XGRlZmF1bHQuYXNweFxnZXRSZXN1bHQ=?=
X-Powered-By: ASP.NET
Date: Mon, 06 Jul 2020 12:54:37 GMT
Content-Length: 15
<!-- Blank Line -->

<!-- Body Line -->
{"d":"Success"}

Status Line

Http버전정보와 상태코드를 응답하는 영역입니다. 200이면 성공이며 이 외에도 요청결과에 따라 여러가지 응답코드가 있을 수 있습니다

Header Line(Response)

Http응답시 헤더정보를 담고 있습니다. Request때와는 반대로 서버의 주요 정보를 담고 있습니다.

Blank Line(Response)

Header Line과 Body Line을 구분하기 위한 영역입니다. 구분을 위한 영역으로 한줄 공백인 영역입니다.

Body Line(Response)

Http요청결과에 따른 서버의 응답결과를 반환합니다. Html, css, javascript코드 등이 될 수 있습니다.