HTTP 프로토콜에 대하여

2020. 1. 12.

인터넷은 TCP/IP라는 통신 규약을 주로 이용합니다. 이 TCP/IP 기반의 네트워크인 인터넷 기반의 서비스 중 하나가 바로 World Wide Web (WWW)입니다. 이메일, FTP 통신, DNS 등 다양한 프로토콜이 존재하는데 이 모든 것이 인터넷을 기반으로 동작합니다.

WWW는 HTTP라는 프로토콜을 이용하는데, 이 글에서는 HTTP라는 프로토콜을 다뤄보겠습니다.

HTTP (Hypertext Transfer Protocol)

HTTP는 서버와 클라이언트가 인터넷 상에서 데이터를 주고 받기 위한 프로토콜(규약)입니다. WWW을 만든 팀 버너스 리(Tim Berners-Lee)와 그가 속한 CERN의 팀이 만들었습니다. 현재 HTTP는 성능 향상을 위해 계속 발전하고 있으며 2020년 1월 현재는 HTTP/2 프로토콜까지 등장하였습니다. 아직까지는 HTTP/1.1을 가장 많이 사용하고 있습니다.

HTTP는 서버-클라이언트 모델을 따릅니다. 서버는 서비스를 제공하는 컴퓨터이며, 클라이언트는 사용자의 컴퓨터나 스마트폰과 같은 기기를 말합니다. 클라이언트에서 서버에게 데이터를 요청하면 서버는 클라이언트가 요청한 데이터를 제공하는 것입니다.

HTTP는 불특정 다수에게 서비스를 제공할 때 적합하다는 장점이 있습니다. 클라이언트가 요청을 하면 서버가 응답만 하는 방식 즉, 비연결식이기 때문입니다. 이는 얼마나 많을 지 모르는 불특정 다수의 클라이언트가 서버에 데이터를 요청할 때, 클라이언트와 서버 간의 연결 상태가 지속되지 않으므로 서버의 부하를 줄일 수 있어 유리합니다.

하지만 연결을 끊어버리기 때문에, 서버가 클라이언트의 상황을 알 수가 없다는 단점이 있습니다. 이러한 상태를 무상태(Stateless)라고 합니다. 이러한 문제를 해결하기 위해 쿠키(Cookie)와 같은 기술이 생겨났습니다. 웹 사이트에 로그인하는 것을 구현할 때 쿠키를 이용합니다.

HTTPS (Hypertext Transfer Protocol Secure)

HTTP는 암호화가 되지 않은 채로 데이터를 전송합니다. 그렇기 때문에 서버와 클라이언트 사이에서 어떠한 데이터가 오고 가는 지 감청하기가 매우 쉽기 때문에 악의적인 감청이나 중간에 데이터를 가로채어 변조시킬 수 있는 등의 보안 문제가 있습니다. 이러한 데이터를 암호화하여 통신할 수 있게 한 것이 HTTPS입니다. HTTPS를 이용하면 암호화된 데이터를 주고 받아 보안을 강화시킬 수 있고, 통신되는 데이터에 문제가 없다는 무결성을 유지할 수 있습니다. 또한, 클라이언트가 요청한 서버가 가짜 서버가 아닌 진짜 서버임을 인증할 수 있습니다. 때문에 만약 서버를 운영하게 된다면, 특히나 데이터를 입력받는 서비스를 운영하게 된다면 반드시 HTTPS를 이용할 것을 권장하고 있습니다.

URL (Uniform Resource Locator)

URL은 쉽게 말하면 인터넷 상에서 서버의 위치를 알려주는 주소입니다. 흔히 알고 있는 https://google.com 과 같은 형태를 URL이라고 합니다. 맨 앞에 있는 https는 HTTPS 프로토콜을 이용한다는 뜻이고, google.com은 서버의 도메인 이름입니다.

HTTP는 어떻게 동작하는가?

  1. 클라이언트가 서버에 연결합니다.
  2. 클라이언트가 서버로 HTTP 요청(Request)을 보냅니다. 이 때의 HTTP 요청은 요청 헤더(Request Header)라고 하는 요청에 관련된 정보를 함께 보냅니다. 몇몇 정보는 요청 바디(Request Body)에 넣는 경우도 있습니다.
  3. 서버가 클라이언트에게 HTTP 응답(Response)을 보냅니다. 이 때, 응답과 관련된 정보는 응답 헤더(Response Header)에, 서버가 보내준 데이터는 응답 바디(Response Body)에 들어있습니다.

스마트폰에서 구글 웹 사이트를 띄우는 예시를 이용하여 조금 풀어서 설명하자면 다음과 같습니다.

  1. 스마트폰에서 구글에 접속하기 위해 https://google.com 이라는 URL을 이용하여 구글 서버에 연결합니다.
  2. 구글 서버에게 구글 페이지를 띄워달라고 요청합니다. (Request)
  3. 구글 서버가 구글 웹 페이지를 띄워주는 HTML을 담아 스마트폰에게 응답합니다. (Response)

이후에 스마트폰의 웹 브라우저가 화면에 HTML을 뿌려주기만 하면 될 것입니다.

HTTP 작동 방식

요청 헤더 (Request Header)

클라이언트가 서버에게 보내는 HTTP 요청에는 서버에게 어떤 데이터를 달라고 요청하는 것인지에 대한 정보가 들어있어야 할 것입니다. 이를 요청 헤더에 담습니다. 헤더에는 정말 다양한 항목들이 있지만 그 중에서 몇 가지만 짚어보고자 합니다.

요청 메서드 (Request Method)

서버에 데이터를 요청하는 방식을 요청 메서드라고 합니다. GET, POST, PUT, DELETE 등 다양한 메서드가 존재합니다. 주로 웹 페이지를 요청하기 위해 사용되는 메서드는 GET입니다.

  • GET : 데이터를 받기 위한 요청
  • POST : 데이터를 입력하는 요청
  • PUT : 데이터를 수정하거나 업데이트하는 요청
  • DELETE : 데이터를 삭제하기 위한 요청
  • OPTIONS : 서버가 지원하는 요청 메서드의 종류를 요청
  • HEAD : HTTP 헤더 정보만 요청. 주로 서버의 상태를 확인하기 위해 사용됩니다.
  • TRACE : 클라이언트의 요청을 그대로 반환. 서버의 상태를 확인하기 위해 사용됩니다.

요청 URL

어떠한 서버에 어떠한 데이터를 요청했는지를 명시합니다.

HTTP 프로토콜 버전

어떤 HTTP 프로토콜 버전을 이용할 것인지 명시합니다. 주로 HTTP/1.1을 이용하며, HTTP/2로 요청이 가능한 서버에는 HTTP/2로 요청을 보낼 수도 있습니다.

응답 헤더 (Response Header)

서버가 클라이언트에게 보내는 HTTP 응답에 관련된 정보를 응답 헤더에 담습니다. 응답 헤더에서 가장 중요한 것은 응답 상태 코드입니다. 이는 정상적으로 응답되었는지, 아니면 어떤 문제가 발생했는지 서버가 응답 코드를 통해 알려줍니다. 다양한 응답 코드들이 있지만 대표적인 응답 코드 몇 가지만 짚어보겠습니다.

  • 200 OK : 성공적으로 요청을 처리했음.
  • 403 Forbidden : 서버가 요청을 거부했음.
  • 404 Not Found : 요청한 데이터 리소스를 찾을 수 없음. 즉, 서버에 해당 데이터가 없을 때 이 응답 코드가 돌아옵니다.
  • 500 Internal Server Error : 서버 내부에 오류가 발생해 요청을 수행할 수 없었음.

응답 바디 (Response Body)

응답 바디에서는 주로 서버에 요청한 데이터가 들어있습니다. 예를 들어 구글 웹 사이트를 요청했다면 웹 사이트의 HTML 코드가 응답 바디에 들어있을 것입니다.

참고 자료

부스트코스 웹 프로그래밍 - 웹의 동작 (HTTP 프로토콜 이해)


심문성

심문성

커피를 유별나게 좋아하는 프론트엔드 개발자입니다.