Don't reveint the wheel. 바퀴를 재발명하지 말라는 격언은 프로그래밍 공부를 하거나 업으로 삼고계신 분이라면 누구나 한 번쯤 들어봤을 말이다. 특정 문제를 해결하기 위해, 이미 개발된 것이 있다면 그것을 재활용할 것이지 다시 구현하는 삽질에 시간을 낭비하지 말라는 말이다. 하지만 학습을 위해 실제로 구현해보는 것만큼 확실한 방법도 없다. 개념을 잘 이해했다고 생각했다가도, 구현하는 과정에서 막히거나 잘못 이해하고 있었던 부분을 찾는 건 모두가 다 했을 경험이다. 필자는 웹개발에 아주 큰 관심을 갖고있지는 않지만, 방대한 웹 생태계의 기반 기술을 제대로 이해해보고 싶다는 생각에, 웹서버를 구현하는 과제인 webserve과제를 시작하기로 했다.
위키피디아에서는 다음과 같이 웹서버를 정의하고 있다.
웹 서버(Web Server)는 HTTP를 통해 웹 브라우저에서 요청하는 HTML 문서나 오브젝트(이미지 파일 등)을 전송해주는 서비스 프로그램을 말한다. 웹 서버의 주된 기능은 웹 페이지를 클라이언트로 전달하는 것이다. 주로 그림, CSS, 자바스크립트를 포함한 HTML 문서가 클라이언트로 전달된다.
HTTP라고 하는 통신 프로토콜을 사용하여, 클라이언트에서 요청하는 리소스를 파악한 뒤 리소스를 전송하는 프로그램을 웹서버라 부른다. HTTP를 사용하기 때문에, 웹서버를 구현하기 전에 HTTP에 대해 알아볼 필요가 있기에 O'REILLY의 "HTTP 완벽 가이드"의 첫 다섯 장을 읽고 정리하기로 했다.
"HTTP 완벽 가이드"에서는 우선 http를 개략적으로 설명하며 시작한다.
http의 경우, 요청/전송하는 리소스의 종류에 대해 알려주도록 되어있다. 그 이유는 리소스의 종류에 따라서 클라이언트가 이를 처리하는 방식이 달라지기 때문이다. 예시로 브라우저를 통해 까치 이미지를 서버에 요청했다면, 까치 이미지의 형식에 따라서 해당 이미지를 읽어내는 방식이 달라진다. jpeg와 png 그리고 bmp 형식일 때 각각 정보가 인코딩되는 방식이 다르다.
리소스의 종류를 나타내는 방식으로 http는 MIME(Multipurpose Internet Mail Extensions) 타입을 사용한다. MIME 타입은 주 타입(primary object type)과 부 타입(specific subtype)으로 이루어진 문자열이다. html의 경우 text/html, JPEG 이미지는 image/jpeg로 리소스의 종류를 나타낸다.
클라이언트가 원하는 리소스가 무엇인지 지목할 수 있어야한다. 리소스의 식별자로 URI(Universal Resource Identifer)를 사용한다. URI는 크게 URL과 URN으로 나뉘는데 URL은 자원의 위치에 따라 달라지고 URN은 자원의 위치와 상관없이 자원을 식별하는 방법이다. URN은 일반적으로 잘 사용되지 않고 URL이 종종 사용되고 여러분이 이 글을 읽기위해 사용하는 브라우저의 주소창에 표시되는 문자열이 URL이다.
메서드는 요청 명령을 일컫는 말이다. HTTP 요청 메시지는 한 개의 메서드를 갖는데, 이는 서버가 어떤 동작을 취해야할지 나타낸다. 예시로 GET 메서드를 갖는 요청 메시지를 보내면, 특정 자원을 보내달라는 의미이고 DELETE 메서드를 갖는 요청 메시지를 보내면, 해당 자원을 서버에서 삭제해달라는 요청이다.
HTTP 응답 메시지는 상태 코드를 갖는다. 상태 코드는, 클라이언트의 요청이 성공했는지 아니면 어떤 에러가 발생했는지 알려주는 세 자리 숫자다. 예시로 200 상태 코드는, 해당 리소스를 성공적으로 http 바디에 포함시켰다는 의미를 갖는다.
클라이언트의 http 요청을 받아 서버에 전달하는 주체.
서버가 갖고있는 자원의 사본을 갖는 특별한 프락시 서버. 캐시는 일반적으로 클라이언트에 가깝게 위치하여 빠르게 자원을 전송하기 위해 사용된다.
HTTP 트래픽을 다른 프로토콜로 변환하는 서버. 예시로 FTP 서버로부터 FTP 프로토콜을 사용해 리소스를 받아온 뒤 해당 리소스를 HTTP 프로토콜로 클라이언트에게 보내주는 HTTP/FTP 게이트웨이가 있다.
raw 데이터를 열어보지 않고 그대로 전달해주는 소프트웨어.
HTTP 요청을 만들어주는 클라이언트 프로그램. 대표적으로 크롬, 사파리와 같은 웹 브라우저가 있다.