본문 바로가기
꼭 알아야 하는

HTTP(Hyper Text Transfer Protocol) 기초부터 알아보기

by findingwonderwall 2024. 2. 29.
반응형
반응형

HTTP(Hyper Text Transfer Protocol)는 우리가 보는 웹 페이지가 어떻게 구조화되어 있는지 브라우저로 하여금 알 수 있게 하는 마크업 언어입니다. 오늘은 인터넷 통신의 핵심인 HTTP에 대해 알아보겠습니다.

 

HTTP(Hyper Text Transfer Protocol)란?

웹은 기본적으로 HTML, URI, HTTP로 구성됩니다. HTTP는 웹 상에서 클라이언트와 서버 간에 데이터를 주고받기 위한 프로토콜입니다. 클라이언트(대부분의 경우 웹 브라우저)가 서버에 어떤 작업을 요청하면, 서버는 그 요청에 응답하여 필요한 데이터를 제공하는 방식으로 작동합니다. HTTP는 이러한 요청과 응답 과정을 규정하는 규칙들의 집합이라고 볼 수 있습니다.

 

HTTP의 탄생

HTTP는 WWW(World Wide Web, 월드 와이드 웹)에 내재된 프로토콜로, 팀 버너스 리(Tim Berners Lee) 박사에 의해 1989년에 발명되엇습니다. 여기서 'WWW'는 인터넷을 통해서 연결된 웹 페이지 시스템을 뜻합니다. CERN(유럽입자물리학연구소)의 팀 버너스 리 박사는 멀리 떨어져 있는 동료 연구자들과 정보를 공유하기 위해서 'WWW' 시스템을 고안했습니다.

 

HTTP의 작동 원리

HTTP의 작동 과정은 매우 단순합니다. 사용자가 웹 브라우저에 URL을 입력하고 엔터를 누르면, 브라우저는 해당 서버에 HTTP 요청을 보냅니다. 서버는 이 요청을 받아 처리한 후, 요청된 웹 페이지나 정보를 HTTP 응답으로 사용자에게 전송합니다. 이 모든 과정은 대부분 눈에 보이지 않게 빠르게 일어납니다.

 

HTTP의 특징

클라이언트와 서버 구조

HTTP는 클라이언트와 서버 간의 요청/응답 프로토콜입니다. 여기서 클라이언트는 주로 웹 브라우저를 말하며, 서버는 웹 페이지, 이미지, 비디오 등 리소스를 제공하는 시스템을 의미합니다. 클라이언트는 서버에 특정 작업을 요청(Request)하고, 서버는 이 요청을 처리한 후 응답(Response)을 보냅니다. 과거 한 컴퓨터에서 클라이언트와 서버가 동시에 작동한 적이 있었는데 트래픽이 많아져 많은 오류를 겪어야만 했습니다. 또한 어느 한쪽에 문제가 발생하면 서로 영향을 주는 큰 결점이 있었습니다. 하지만 HTTP는 클라이언트와 서버가 명확하게 분리되었기 때문에 어느 한쪽에 문제가 발생해도 서로에게 영향을 주지 않습니다. 추가적으로 HTTP는 요청 메시지가 발송되어야만 서버에서 응답 메시지를 전송할 수 있는 특징을 갖고 있습니다.

 

무상태 프로토콜 (Stateless Protocol)

HTTP는 '무상태 프로토콜'이라는 중요한 특징을 가지고 있습니다. 즉, 서버가 클라이언트의 이전 요청에 대한 정보를 기억하지 않는다는 의미입니다. 각 요청은 독립적이며 서로 연관성이 없습니다. 이는 서버의 처리를 단순화하고 각 요청을 독립적으로 처리할 수 있게 해주며, CPU나 메모리에서 리소스의 소비를 절약하는 이점을 가져다줍니다. 단, 사용자의 상태를 유지하기 위해서는 쿠키(Cookies)나 세션(Session)과 같은 기술을 별도로 사용해야 합니다.

 

지속 연결 (Persistent Connections)

HTTP 초기 버전에서는 요청/응답 통신을 주고받을 때마다 TCP/IP를 연결하고 종료하는 일을 반복적으로 진행했습니다. 이를 비연결성이라고 합니다. 자원을 주고받을 때만 연결하기 때문에 서버에서는 최소한의 자원만 사용하므로 서버 자원을 매우 효율적으로 사용할 수 있었습니다. 하지만 비연결성 상태에는 단점이 있습니다.

요청할 때마다 TCP/IP 연결을 새로 맺어야 하기 때문에 불필요한 시간이 발생합니다. 더군다나 최근엔 웹이 발전하면서 텍스트 파일뿐만 아니라 다양한 데이터 자원을 받아야 하기 때문에 과부하가 발생합니다. 그래서 HTTP/1.0부터 HTTP/1.1 이상의 버전은 지속 연결 방식을 고안했습니다.

지속 연결 상태는 클라이언트와 서버 간에 TCP/IP 연결을 한 번 맺은 후 여러 요청과 응답에 걸쳐 재사용할 수 있게 함으로써, 연결 및 해제에 소요되는 시간과 리소스를 줄여줍니다. 이를 통해 서버 부하와 오버헤드가 줄어들어 웹 페이지의 로딩 시간을 단축시키고 전반적인 효율성을 향상시킬 수 있습니다.

지속 연결은 파이프 라인화(HTTP Pipelineing)를 가능하게 합니다. 파이프 라인화는 동시에 여러 개의 요청을 수행하는 것 입니다. 과거에는 요청 메시지를 발신한 후에 응답 메시지를 수신할 때까지 다음 요청 메시지를 보낼 수 없었습니다. 하지만 파이프 라인화가 가능해지면서 응답 메시지를 기다릴 필요 없이 다음 요청 메시지를 보낼 수 있게 되었습니다.

 

HTTP 요청 메서드

HTTP 프로토콜은 다양한 종류의 요청을 지원합니다. 가장 흔히 사용되는 HTTP 요청 메서드는 다음과 같습니다.

  • GET: 서버로부터 정보를 조회하기 위해 사용. 웹 페이지 열람이나 이미지 요청 등에 활용.
  • POST: 서버에 정보를 생성하거나 업데이트하기 위해 사용. 회원 가입이나 글 작성 등에 활용.
  • PUT: 서버에 있는 정보를 업데이트할 때 사용. 기존 정보의 완전한 교체를 목적으로 함.
  • DELETE: 서버의 정보를 삭제하기 위해 사용.
  • PATCH: 서버에 있는 정보의 일부분만을 수정할 때 사용. 부분적 업데이트에 적합.

HTTP 메시지

HTTP 메시지는 서버와 클라이언트가 서로 데이터 정보를 교환할 때 사용하며, 요청과 응답 두 가지 유형이 있습니다. 요청인지 응답인지에 따라 미시지 내용이 달라질 수 있지만 구조는 크게 변하지 않습니다.

  • 시작라인: 요청 또는 응답 메시지의 첫 줄로, 메시지의 유형을 정의합니다. 요청 메시지에서는 사용되는 메소드와 요청 대상의 URI, HTTP 버전이 포합됩니다. 응답 메시지에서는 HTTP 버전, 상태 코드, 상태 메시지가 포함됩니다.
  • 헤더: 메시지의 메타데이터를 포함하며, 리소스와 클라이언트/서버의 속성에 대한 정보를 담고 있습니다. 예를 들어 'Content-Type' 헤더는 메시지 본문의 미디어 유형을 지정하고, 'Content-Length'는 본문의 길이를 나타냅니다.
  • 본문: 실제로 전송되는 데이터를 담고 있으며, 텍스트나 바이너리 데이터 모두 가능합니다. 모든 HTTP 메시지가 본문을 가지는 것은 아니며, 특히 'GET' 요청 같은 경우 본문을 가지지 않는 것이 일반적입니다.

HTTP 상태 코드

HTTP를 다루기 위해서는 HTTP 상태 코드를 알아야 합니다. 상태 코드를 알면 웹과 서버에서 전송하는 메시지를 이해할 수 있습니다. HTTP 상태 코드가 클라이언트가 요청 메시지에 대한 서버의 응답 결과를 직관적으로 알려 주기 때문입니다. 상태 코드는 크게 다섯 가지로 구분합니다. 여기서 401, 402, 403 등으로 더 세분화해서 클라이언트에게 정보를 제공합니다.

코드 클래스 설명
1XX Informational 요청을 받아들여 처리 중
2XX Success 요청을 정상적으로 처리
3XX Redirection 요청을 완료하기 위해 추가 동작이 필요
4XX Client Error 서버는 요청 이해 불가
5XX Server Error 서버는 요청 처리 실패

 

HTTPS(HyperText Transfer Protocol Secure)란?

HTTP는 요청이 들어오면 상대를 확인하지 않고 데이터 정보를 제공합니다. 이 떄문에 위장한 클라이언트가 이를 악용하는 사례도 종종 발생합니다. HTTP는 암호화되지 않은 평문 데이터를 전송하기 때문에, 보안에 취약할 수 있습니다. 최근에는 네트워크가 발전하면서 데이터 정보를 지키는 일이 더욱 중요해졌습니다.

HTTP의 약점을 보완하기 위해 데이터 통신 연결부인 소켓을 SSL(Secure Sockets Layer) 또는 TLS(Transport Layer Security) 보안 프로토콜을 대체한 것이 HTTPS(HyperText Transfer Protocol Secure)입니다. 웹 브라우저의 주소 표시줄이 'https://'로 시작하는 것을 확인할 수 있습니다.  HTTPS는 데이터를 암호화하여 전송하기 때문에, 보다 안전한 데이터 교환을 가능하게 합니다.

 

소켓(Socket)

소켓은 네트워크 상에서 서로 다른 시스템 간에 데이터를 주고받기 위한 엔드포인트(Endpoint)입니다. 소켓을 사용하면 서로 다른 네트워크에 있는 시스템들이 데이터를 주고받을 수 있게 되는데, 이는 인터넷을 포함한 다양한 네트워크 환경에서 통신을 가능하게 하는 기본적인 수단 중 하나입니다. 웹 브라우저에서 서버의 응답을 받기 위해 HTTP 요청 메시지를 생성했다고 가정하겠습니다. 그러면 이 데이터는 소켓 라이브러리를 통해서 TCP/IP 계층으로 전달됩니다. 반대로 서버에서 응답 메시지를 전달할 때도 소켓이 있어야 합니다.

 

SSL(Secure Sockets Layer)과 TLS(Transport Layer Security)

SSL(보안 소켓 레이어)과 TLS(전송 계층 보안)는 인터넷 상에서 데이터를 안전하게 전송하기 위해 사용되는 암호화 프로토콜입니다. 이 프로토콜들은 데이터의 기밀성과 무결성을 보장하여, 사용자와 서버 간의 통신이 도청이나 데이터 변조로부터 보호될 수 있도록 합니다.

 

HTTP는 인터넷에서 정보를 주고받는 데 있어서 기본적이고 필수적인 프로토콜입니다. 웹 개발을 하거나, 단순히 웹 서핑을 즐기는 사용자로서도 HTTP에 대한 기본적인 이해는 매우 중요합니다. 다음번에는 더욱 흥미로운 꼭 알아야하는 IT 지식에 대해서 알아보겠습니다.

 

참고자료

"개발자가 되기 위해 꼭 알아야 하는 IT 용어", 고승원 외 21명, 비제이퍼블릭, 2022

반응형