웹 프로그래밍에 필요한 HTTP(하이퍼텍스트 전송 규약, HyperText Transfer Protocol)에 관한 기초 지식을 간단히 설명하고자 한다. HTTP를 이해하면 네트워크 통신 과정이 어떤 식으로 이루어지는 알고 웹 프로그래밍을 더 자유롭게 수행할 수 있다. 전체 그림을 그린다고 생각하고 가볍게 읽어보되, 당장 다 외우려 들 필요는 없다.

HTTP 통신의 기본 원리

HTTP는 클라이언트(client, 정보를 요청하는 컴퓨터·프로그램)가 서버(server, 정보를 제공하는 컴퓨터·프로그램)에 정보를 요청(request)하고, 서버가 요청받은 정보를 응답(response)하는 방식으로 이루어진다. 클라이언트가 요청도 하지 않았는데 서버가 마음대로 클라이언트에 정보를 보내주는 것과 같은 일은 허용되지 않는다. 쌍방이 자유롭게 주고받는 전화가 아니라, 고객이 은행 창구에 찾아가 요청했을 때 서비스를 받는 방식이라고 할 수 있다.

웹 서버와 웹 클라이언트

웹 서버에 HTTP 요청을 보내는 프로그램을 웹 클라이언트라고 한다. 우리는 웹 클라이언트 프로그램을 매일 사용하고 있다. 웹 브라우저가 대표적인 웹 클라이언트 프로그램이니 말이다. 웹 클라이언트 프로그램이 HTTP 요청을 대신 수행해주기 때문에, 일반 사용자들은 HTTP에 대해 잘 모르더라도 웹을 이용할 수 있다. 웹 브라우저만이 웹 클라이언트의 전부는 아니다. 예를 들어, 웹에 흩어진 정보를 자동으로 수집해주는 웹 크롤러도 웹 클라이언트의 한 종류다.

반대로 웹 클라이언트의 HTTP 요청을 받아, 그에 대한 HTTP 응답을 서비스하는 프로그램을 웹 서버라고 한다. 구글, 페이스북 같은 웹 사이트는 웹 서버를 통해 제공되는 대표적인 웹 서비스다. 일반 사용자들은 웹 서버보다는 웹 클라이언트와 훨씬 친숙하다고 생각할 수 있겠지만, 웹 브라우저를 사용하는 이유가 결국 웹 사이트에 접속하여 각종 서비스를 이용하기 위한 것이므로, 실제로는 웹 서버 프로그램과도 항상 상호작용하고 있는 셈이다.

HTTP 요청 메시지

HTTP의 통신은 클라이언트가 서버에 요청 메시지를 발송하고, 서버가 클라이언트에 응답 메시지를 발송하는 것으로 이루어진다. 우리가 웹 브라우저의 주소창에 https://en.wikipedia.org/wiki/Python_(programming_language) 주소를 입력하면, 다음과 같은 일이 벌어진다.

  1. 웹 브라우저가 en.wikipedia.org 호스트에 /wiki/Python_(programming_language)라는 자원을 요청하는 HTTP 요청 메시지를 발송한다.
  2. en.wikipedia.org 호스트(웹 서버)가 클라이언트에 HTTP 응답 메시지를 발송한다.
  3. 웹 브라우저가 응답 메시지를 해석하여 화면에 웹 문서를 출력한다.

메시지를 작성하는 양식은 일정하게 정해져 있다. 요청 메시지와 응답 메시지를 작성하고 해석할 줄 알면, HTTP로 통신을 수행할 수 있다. 요청 메시지와 응답 메시지가 어떤 양식으로 이뤄졌는지 살펴보자.

다음은 파이어폭스 웹 브라우저로 https://en.wikipedia.org/wiki/Python_(programming_language)에 접속했을 때 작성되는 요청 메시지를 보기 편하게 조금 수정한 것이다.

GET /wiki/Python_(programming_language) HTTP/2.0
Host: en.wikipedia.org
Accept: text/html
Accept-Language: en-US
Accept-lang: text/html
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0

이 요청 메시지는 웹 브라우저에서 ‘개발자 도구’를 열어(보통, F12 키를 누르면 실행된다) ‘네트워크’ 탭에서 직접 확인해 볼 수 있다. 크롬, 파이어폭스, 엣지 등 대다수 웹 브라우저에 개발자 도구 기능을 제공하므로 직접 살펴보기 바란다. 요청 메시지를 확인해 보면, 브라우저마다 조금씩 차이는 있겠지만 대개 저것과 비슷하게 작성되어 있을 것이다.

요청 메시지에서는 첫 행이 가장 중요하다. 첫 행에는 메서드(GET), 하위 경로(/wiki/Python_(programming_language)), 프로토콜 버전(HTTP/2.0)을 표기한다.

  • 메서드: 자원을 ‘어떻게’해 달라는 것인지 지시하는 명령어. GET, POST, UPDATE, PUT, DELETE 등이 있다. 일반적으로 웹사이트에 접속할 때는 자원을 ‘조회’하는 명령어인 GET이 사용된다.
  • 경로: 요청하는 자원의 경로. 하위 경로만 작성할 때가 많다. 위 예에서는 /wiki/Python_(programming_language).
  • 프로토콜 버전: HTTP도 시간이 지나면서 여러 버전이 발표되었다. 현재는 1.1과 2.0이 많이 사용된다.

첫 행 뒤에 이어지는 행들은 ‘요청 헤더’라고 한다. 여러 가지 옵션을 부가적으로 지정하는 데 쓰인다. 여러 가지 헤더 항목을 지정할 수 있지만, 대표적인 것으로 Host, Accept, User-Agent이 있다.

  • Host: 어떤 호스트에 요청하는 것인지 표기하는 헤더. 첫 행에서 경로에 하위 경로만 썼다면, Host 헤더를 필수로 작성해야 한다.
  • Accept: 자원을 이 형식으로 제공해 달라고 요청하는 헤더. text/html은 HTML 문서를 원한다는 뜻이다.
  • User-Agent: 요청을 보내는 클라이언트 프로그램의 종류

이 외에도 추가로 전달해야 할 내용이 있을 수 있다. 예를 들어, 웹 사이트에 이미지를 업로드하고 싶을 수 있는데, 그런 부가적인 정보는 헤더를 모두 작성한 뒤 한 행을 띄고 삽입한다. 이것을 요청 메시지의 ‘내용(body)’ 또는 ‘첨부(payload)’라고 한다. 요청 메시지에서는 본문이 생략될 때가 많다.

HTTP 응답 메시지

클라이언트가 요청 메시지를 보내면 웹 서버는 그 요청 메시지를 해석한 뒤 적절한 결과물을 응답 메시지로 작성해 돌려준다. 다음은 위의 요청에 의해 위키피디아 사이트가 돌려준 응답 메시지를 조금 고친 것이다.

HTTP/2.0 200 OK
Date: Thu, 18 Jan 2018 08:45:39 GMT
Content-Type: text/html
Content-Length: 11879
Content-Language: en
Last-Modified: Wed, 03 Jan 2018 03:42:23 GMT

<!DOCTYPE html>
<html class="client-nojs" lang="en" dir="ltr">
... (중략) ...
</html>

응답 메시지의 첫 행에는 프로토콜 버전 정보(HTTP/2.0), 상태 코드(200), 상태 코드를 부연설명하는 메시지(OK)가 나온다. 상태 코드는 세 자리 숫자로 번호에 따라 의미가 정해져 있다. 첫번째 자리가 무엇이냐에 따라 크게 다음과 같은 의미를 가진다.

  • 200 번대: 요청 처리에 성공했음.
  • 300 번대: 리디렉션 처리가 필요함. 예를 들어, 301은 요청한 자원이 다른 주소로 영구적으로 이동했으므로 새로운 주소로 요청하라는 의미다.
  • 400 번대: 클라이언트의 요청에 문제가 있음. 예를 들어, 404는 클라이어트가 요청한 자원이 존재하지 않음을 의미한다.
  • 500 번대: 서버에 문제가 있음. 예를 들어, 503은 서버 점검·장애 등으로 인해 일시적으로 서비스를 할 수 없음을 뜻한다.

요청 메시지의 요청 헤더와 마찬가지로, 응답 메시지에서도 첫 행 뒤에 이어지는 행들에 ‘응답 헤더’가 나온다. 역시 여러 가지 헤더 항목이 있으나, 위에 나온 것들만 설명하겠다.

  • Date: 메시지 제공 일시
  • Content-Type: 본문이 작성된 형식. 이 형식을 나타내는 표기법을 ‘MIME 타입’이라는 형식이라고 한다. 위 경우는 text/html인데, application/json, image/png 등 여러 가지가 있다.
  • Content-Length: 본문의 길이. 위 경우는 11879 바이트.
  • Content-Language: 본문이 작성된 언어
  • Last-Modified: 해당 자원이 마지막으로 수정된 일시

더 알아보기

이상으로 웹 프로그래밍의 기반이 되는 HTTP 통신의 기본 사항을 설명했다. 하지만 이것은 수박 겉핥기 정도밖에 안 된다. 앞으로 웹 프로그래밍 전문가가 되고자 한다면 HTTP에 관해 좀 더 자세히 학습하기를 권한다. 추천하는 책은 앞으로의 학습에서 소개한다.