HTTP

HTTP

요즘 시대 인터넷을 사용한다는 것은 특수한 경우를 제외하고 상당수가 월드 와이드 웹(WWW) 서비스를 이용한다는 것과 거의 동일할 것이다. WWW 서비스를 이용한다는 것은 웹 서비스를 이용한다는 것인데, 평상시에 웹 브라우저(크롬 등)를 켜고 구글에 접속하고 구글 검색창을 통해 검색을 하고 또 다른 웹사이트에 방문하여 정보를 조회하는 행위 등 이러한 모든 행위들이 웹 서비스를 이용하는 것이다. HTTP가 세상에 나온 것은 1991년으로 이후 웹 서비스는 폭발적으로 큰 성장을 이룰 수 있었고 지금 이 시간에도 빠르게 성장하는 중이다. 그동안 이러한 웹의 성장 뒤에서는 HTTP라고 하는 거대한 기술이 웹 서비스의 근간을 이루고 있었다. 오늘은 개발자들이라면 당연히(?) 이해하고 있을 HTTP에 대해서 알아보고자 한다.

※ 해당 글은 필자 개인적인 학습을 목적으로 작성했으며 잘못된 부분이 있으면 아낌없이 지적해주시기 바랍니다. :)

인터넷과 웹의 관계(이미지 출처: 유튜브 생활코딩)

HTTP란?

모든 웹 브라우저(크롬 등)와 웹 서버는 WWW(World Wide Web, 인터넷 기반 서비스 중 하나)을 통해 통신하며 동작한다. 이때 웹 브라우저와 웹 서버는 일종의 규약을 지키면서 서로 요청과 응답을 주고 받는데 이 규약을 HTTP라고 한다. 즉, HTTP는 HyperText Transfer Protocol(번역: 초 본문 전송 규약)의 약자로 WWW 상에서 정보(HTML, 텍스트, 이미지, 동영상 등)를 주고받을 수 있는 일종의 규약이다.

필자는 규약이라는 단어(사전적인 정의)를 들었을 때 너무 추상적이라 누군가에게 HTTP를 설명한다면 이해를 돕기 위해 굳이 월드 와이드 웹(WWW)을 편의점으로 비유하여 다음과 같이 설명할 것이다. (단, 웹 브라우저가 서버에 정보를 요청만 한다 가정)

편의점 월드 와이드 웹(World Wide Web) 점원(역할 : 편의점 상품을 판매) 웹 서버(역할 : 리소스를 응답) 손님(역할: 편의점 상품을 구매) 웹 브라우저(역할 : 리소스를 요청) 편의점 상품 리소스(HTML, CSS, TEXT, IMAGE 등) 가격정보(공급가액, 부가가치세액), 유통기한, 결제방식(현금, 카드, 외상 등) 등

점원과 손님간 거래가 성사되기 위해 존재하는 모든 조건 · 상황(규약)들 HTTP(요청 메시지, 응답 메시지)

HTTP 동작방식

HTTP는 무상태(Stateless) 프로토콜로서 클라이언트(웹 브라우저)와 웹 서버간의 구조로 이루어져있다. 이때 서버는 클라이언트와의 통신이 끝나면(요청과 응답이 끝나면) 연결 상태를 끊어버리는데, 이로 인해 클라이언트와 웹 서버는 계속 연결된 상태(1:1 관계)가 아니므로 웹 서버 입장에서는 불특정 다수를 대상(1:N 관계)으로 서비스를 제공할 수 있는 장점이 있다. 하지만 단점으로는 클라이언트 입장에서는 반복적인 요청을 다시 한 번 보내야하고 웹 서버 입장에서도 방금 전에 요청했던 클라이언트의 상황을 알 수 없게 된 것이다. 이러한 단점을 보완하기 위해 Cookie와 Session 같은 상태유지 기술이 등장하게 되었다.

HTTP 구성

이미 언급했듯이 HTTP는 웹 브라우저와 웹 서버 간의 통신을 할때 사용된다. 클라이언트가 서버에 접속한다는 것은 클라이언트가 서버에 정보를 요청하는 것이라고 볼 수 있으며 클라이언트의 이러한 요청을 받은 서버는 클라이언트에 데이터를 응답해준다.

즉, HTTP는 크게 요청 메시지와 응답 메시지로 나누어 볼 수 있으며 또한 각각의 요청 메시지와 응답 메시지는 헤드(Head)와 바디(Body)으로 구성 된다. 요청 및 응답 메시지에 대한 상세 정보는 크롬 개발자 도구(F12)를 열어 네트워크 탭에 들어가서 특정 리소스(Name)를 클릭하면 확인할 수 있다.

※ 참고: 각각의 요청 및 응답 메시지별 헤드와 바디 사이에는 빈 줄(empty line)이 존재한다.

HTTP 요청 및 응답 메시지 구조(이미지 출처: https://developer.mozilla.org/ko/docs/Web/HTTP/Messages)

[ HTTP 요청 메시지 - 헤드(Head) ]

HTTP 요청 메시지의 시작 줄(첫번째 줄)과 HTTP 요청 메시지의 헤더(header)를 통틀어 "요청 헤드(head)"라고 한다. 이때 HTTP 요청 메시지의 시작 줄은 HTTP 메서드, 요청 URI, HTTP 버전으로 구성되고 HTTP 요청 메시지의 헤더는 사용자 에이전트(User-Agent), Accept-Language 등의 정보를 포함하고 있다.

① HTTP 메서드

웹 개발을 공부할 때 가장 빈번하게 나오는 것을 하나 꼽자면 바로 HTTP 메서드일 것이다. HTTP 메서드는 클라이언트가 서버에게 이게 어떤 요청인지 알려주기 위해 사용된다. 주로 사용하는 HTTP 메서드는 GET, POST, PUT, DELETE 등이 있는데, 실제로 다른 메서드들 도 있지만 여기서는 이 4가지만 다루도록 하겠다.

GET 요청은 주로 클라이언트가 서버로부터 정보를 요청하기 위해서 사용된다. 데이터 처리 관점에서 보면 SELECT(Read)에 해당한다고 볼 수 있다.

POST 요청은 주로 클라이언트가 서버에 정보를 주입하기 위해서 사용된다. 데이터 처리 관점에서 보면 INSERT(Create)에 해당한다고 볼 수 있다.

※ GET 요청과 POST 요청의 차이

GET 요청은 요청 바디가 없고(∵ 단순 정보 조회), POST 요청은 요청 바디가 있다.(∵ 정보 생성) POST 요청은 보통 HTML form 태그를 통해 서버에 데이터를 전송하는데 이 데이터가 요청 바디에 포함되는 것이다. 또한 GET 요청은 서버에 전달하는 파라미터명과 그 값이 브라우저 주소창(URL 상)에 그대로 나타나는 반면, POST 요청은 서버에 전달하는 데이터 값이 주소창에 드러나지 않는다.(∵ 요청 바디를 통해 전송) POST 요청 시 데이터가 주소창에 드러나지 않는다고 해서 안전한 것은 아니므로(∵ 요청 바디를 통해 확인 가능) 중요한 데이터라면 반드시 암호화 작업이 필요하다.

※ GET 요청과 POST 요청 각 메서드별 차이는 캐싱 등 더 상세한 내용을 담고있으나 여기서는 HTTP 전반적인 내용을 다루고자 하여 최대한 생략했다.

PUT 요청은 주로 클라이언트가 서버에 있는 정보를 업데이트하기 위해서 사용된다. 데이터 처리 관점에서 보면 UPDATE에 해당한다고 볼 수 있다.

DLETE 요청은 이름 그대로 주로 클라이언트가 서버에 있는 정보를 삭제하기 위해서 사용된다. 데이터 처리관점에서 보면 당연히 DELETE에 해당한다고 볼 수 있다.

※ 참고 : PUT과 DELETE 요청 역시 GET 요청과 동일하게 URL 상으로 서버에 파라미터 값을 전달할 수 있다.

② request target

주로 URL로 나타낼 수 있다. 이때 URL(Uniform Resourse Locator, 정형화된 자원의 위치를 가르키는 문자열)과 URI(Uniform Resourse Identifier, 정형화된 자원의 고유한 식별자)이 헷갈릴 수 있는데, URI는 URL를 포함하는 상위 개념이다.

URL은 "프로토콜", "호스트명(도메인)", "포트 번호", "패스(path)"를 포함한다. 예를 들어 우리가 네이버의 '웹 주소 또는"링크" 라고 부르는 https://www.naver.com는 URL이다. 여기서는 포트 번호가 생략되어있고 패스는 존재하지 않으며 프로토콜과 호스트명(도메인)을 확인할 수 있다. 사용자 브라우저는 주소창에 이 URL을 표시한다.

※ Path 대신 *.html, *.php 등 파일이 나올 수 있다.

반면, URI는 URL이 포함하고 있는 모든 정보 뿐만 아니라, 파라미터(Parameter), 패스 배리어블(Path Variable) 등도 포함한다. 예를 들어 https://news.naver.com/main/list.naver?mode=LSD∣=sec&sid1;=001는 네이버 뉴스 속보에 대한 리소스에 대한 URI이다. 왜냐하면 URL에 ?과 &을 통해 파라미터 명과 파라미터 값이 식별자로서 포함되어 있기 때문이다.

또한 필자의 기술 블로그 URL은 https://ikjo.tistory.com/이다. 그러나 이 글은 해당 해당 기술 블로그 중 어느 특정한 하나의 글(리소스)이므로 URI인 https://ikjo.tistory.com/9로 식별할 수 있다.

※ URN(Uniform Resourse Name)은 일반적으로 리소스를 찾기에 보편화된 방법은 아니므로 여기서 다루진 않겠다.

URI과 URL(이미지 출처: https://programming119.tistory.com/194)

③ HTTP 프로토콜 버전

웹 브라우저가 사용하는 HTTP 프로토콜의 버전을 나타낸다.

※ ①~③ 예시 : GET http://developer.mozilla.org/en-US/docs/Web/HTTP/Messages HTTP/1.1

④ 사용자 에이전트(User-Agent)

사용자 에이전트는 사용자 웹 브라우저에 대한 식별 정보를 나타내는데, 어떤 웹 브라우저인지, 어떤 운영체제인지 등의 정보가 담겨있다.

⑤ Accept-Language

Accept-Language는 클라이언트가 어떤 언어를 이해할 수 있는지에 대한 정보이다.

※ HTTP 요청 메시지 헤더의 정보는 이 외에도 많이 있지만 여기서는 이 정도까지만 다루고자 한다.

[ HTTP 요청 메시지 - 바디(Body) ]

HTTP 요청 메시지 바디는 요청 메시지 마지막 부분에 들어간다. 이미 언급했듯이 GET 요청처럼 서버로부터 정보를 가져오기만 하는 요청은 일반적으로 바디가 필요없으나, POST 요청처럼 HTML Form 태그 정보를 포함하는 경우에는 바디에 내용을 포함한다.

[ HTTP 응답 메시지 - 헤드(Head) ]

HTTP 요청 메시지와 마찬가지로 HTTP 응답 메시지의 시작 줄(첫번째 줄)과 HTTP 응답 메시지의 헤더(header)를 통틀어 "응답 헤드(head)"라고 한다. 이때 HTTP 응답 메시지의 시작 줄은 상태 줄(status line)이라고도 불리며 "프로토콜 버전", "상태 코드", "상태 텍스트"로 구성되고 HTTP 응답 메시지의 헤더는 Content-Type, Date 등의 정보를 포함한다.

① HTTP 프로토콜 버전

HTTP 요청 메시지와 마찬가지로 웹 브라우저가 사용하는 HTTP 프로토콜의 버전을 나타낸다.

② 상태 코드(Status Codes)

HTTP 요청이 성공적으로 처리되었는지를 상태 코드를 통해서 알려주는데, 이 상태 코드는 의미에 따라 크게 5개의 그룹으로 나누어진다. 1xx(informational response)인 경우 "현재 요청이 수신되어 처리가 되고있음"을, 2xx(Success)인 경우 "요청을 정상 처리했음"을, 3xx(Redirection)인 경우 "요청을 완료하려면 추가적인 행동(새로운 요청 등)이 필요함"을, 4xx(Client Errors)인 경우 "클라이언트의 오류로서 유효하지 않은 문법 등을 사용했음"을, 5xx(Server Erros)인 경우 "서버의 오류로서 현재 서버가 해당 요청을 정상적으로 처리하지 못하고 있음"을 의미한다.

※ 각각의 상태 코드 그룹별로 다시 세분화 되지만 너무 길어지므로 여기서는 다루지 않겠다.

③ 상태 텍스트(Status Text)

위 상태 코드에 대한 간결한 설명을 글로 나타내어 사용자가 HTTP 응답 메시지의 결과를 이해할 수 있도록 도와준다.

④ Content-Type

웹 서버가 웹 브라우저에 응답할 때 반환된 콘텐츠의 유형이 무엇인지(text/html; charset=utf-8 등) 알려준다.

⑤ Date

응답 메시지가 만들어진 날짜와 시간을 알려준다.

※ HTTP 응답 메시지 헤더의 정보는 이 외에도 많이 있지만 여기서는 이 정도까지만 다루고자 한다.

[ HTTP 응답 메시지 - 바디(Body) ]

HTTP 응답 메시지의 바디 역시 응답 메시지의 마지막 부분에 들어간다. 응답 메시지 바디는 "길이가 정해진 단일 파일로 구성된 단일 리소스", "길이를 알 수 없는 단일 파일로 구성된 단일 리소스", "서로 다른 정보를 담고 있는 멀티파트로 구성된 다중 리소스" 3가지 종류로 나뉜다. 이때 모든 요청 메시지 바디에 데이터가 들어가지는 않았듯이 웹 브라우저에 특별히 특정 데이터를 전송하지 않는 이상 모든 응답 메시지 바디에 데이터가 들어가지는 않으며 특히 201, 204과 같은 상태 코드를 가진 응답에는 바디가 없다.

지금까지 HTTP의 정의와 동작방식 그리고 구성에 대해서 알아보았다. HTTP는 서두에 언급했듯이 웹 개발의 근간이 되는 기술로서 웹 개발자라면 반드시 알아야 하는 기술이다. 여기서 정리한 HTTP 개념은 사실상 숲을 보는 관점에서 최대한 간결하게 서술한 것이고 MDN 등의 문서를 확인해보면 좀 더 상세하게 내용을 다루고 있으니 참고하도록 하자.

참고자료

- 유튜브 생활코딩

- 부스트코스 "웹 프로그래밍(풀스택)"

- 위키백과

- MDN Web Docs

from http://ikjo.tistory.com/9 by ccl(A) rewrite - 2021-10-22 06:27:11