해결하고자 하는 문제

많은 사람들이 이제는 hosts파일을 편집하여 광고를 거부하는 방법을 알고 있다. 그 방법의 문제점은, 자기 컴퓨터에 웹서버가 설치되어 있지 않는한, 매우 보기 싫은 "연결실패"화면이 섞여 나온다는 것이다.

그 와중에, 뒤로가기 버튼이 말을 안듣는 짜증스러움도 수반된다. 사실은 뒤로가기가 망가진 것이 아니라, 브라우저의 연결실패 처리가 깔끔하지 못해서, 뒤로가기 목록에 따로따로 쌓여서 그런일이 벌어진다. 이유야 어쨌건, 사용하는데 불편하기는 매한가지이다.

기존의 해결방법

이러한 문제를 해결하는 프로그램으로 센스부족이라는 것이 있다. 일단 그 크기가 작아서 좋다. 또, 이 프로그램은 기피대상이 되는 사이트의 블랙리스트를 따로 관리하면서 필요에 따라 hosts파일을 편집하는 편의도 제공한다. 요컨대, 넷웍 초보의 편의를 고려한 유용한 프로그램이라고 한마디로 요약할 수 있다.

그런데, 한글지원을 추가하지 않은 윈도우즈에 "센스부족"을 설치했다가 메뉴를 볼 수가 없어서 매우 당황했다. 이것은 리소스만 약간 손봐주면 쉽게 해결될 수 있다. 한편, 어떤 이유에서인지 "센스부족" 서버는 PMS_SERVER라는 보이지 않는 윈도우를 생성한다. 보통 NT서비스는 윈도우를 생성하지 않기때문에, 처음으로 이 윈도우를 발견했을 때에는 스파이웨어가 들어온 것으로 착각하고 한참 법석을 떨었다.

이런 점들을 조금만 고쳐 사용했으면 좋겠는데, 애석하게도 "센스부족"은 소스가 제공되지 않아서, 처음부터 다시 만들어야 했다.

원리와 단순한 구현

해결책의 원리는 이미 "센스부족"의 제작자가 잘 설명을 해 놓았다.

[...] 로컬에 작고 가벼운 가짜 웹서버가 서비스 형태로 설치되며, 이 웹서버는 무조건 빈페이지를 보여주는 역할을 한다. [...]

우선, "가짜 웹서버"라는 것은 80번 포트를 열어놓고 기다리고 있는 넷웍 통신 프로그램이라는 애기이니, 넷웍 프로그래밍에 관한 책을 조금 읽어보았으면 당장 socket(), bind(), listen()으로 이어지는 상용구와 select()/accept()의 무한루프를 떠올렸을 것이다. 여기서 "가짜"라는 표현대로, 제대로된 웹서버를 구현하는 것이 아니니, 어렵게 생각할 필요가 없다.

그 다음 "서비스 형태로 설치"된다는 것은, NT 서비스를 작성하는 요령에 따라 프로그램을 짜면 된다는 얘기이다. 이는 윈도우즈 SDK에 간단한 예가 있는 것을 비롯해, MSDN에 설명이 잘 되어 있으니, 더이상의 설명이 필요 없다.

마지막으로 "무조건 빈페이지를 보여주는" 응답의 가장 간단한 형태를 C로 표현하면 다음과 같다.

/*
 * int fd에는 accept()로부터 얻은 소켓이 있다.
 * char buf[]에는 브라우저로부터의 HTTP요청이 있다.
 * 이 요청이 유효한 것임은 여기 오기전에 확인한다.
 */
if (memcmp(buf, "GET ", 4) == 0) {
    send(fd, "HTTP/1.1 200 OK\r\n"
"Server: server name\r\n"
"Connection: close\r\n"
"Content-Type: text/html\r\n\r\n", len, 0);
    shutdown(fd, SD_SEND);
}
else {
    /* 501 오류를 보내거나 다른 응답을 한다. */
}
close(fd);
물론, 이 프로그램은 윈도우즈 소켓을 사용할 것이므로, fdSOCKET형이고, close()closesocket()을 써야한다는 것만 유념하면 된다. GET요청이 아닌 다른 요청들에 대해서는, 구현하지 않았다는 의미의 501 오류를 보내거나 적절히 구현해서 응답을 하면, 목표하던 기능구현을 완성하게된다.

이렇게 해석을 해놓고 나면, 구현자체는 넷웍 프로그래밍 입문자를 위한 연습문제 수준에 불과하다는 것을 쉽게 알 수 있다. 이 연습문제 풀이에 약간의 살을 덧붙인 것은 밑에서 받을 수 있다.

단순한 구현의 사용법

설치: 압축파일을 받아서 적당한 곳에 압축을 풀면 두개의 파일이 나온다. 실행파일은 윈도우즈2000 이상의 시스템에서만 정상적으로 작동한다.

brhttpd.exe  NT 서비스 실행파일
brhttpd.ini  간단한 설정파일

설치를 완료하기 위해서는 NT서비스 데이타베이스에 등록해야 한다. 이는 명령행에서 다음과 같이 입력하면 된다. (관리자 권한이 필요하다.)

brhttpd.exe /i
이것으로 가짜 웹서버가 설치가 완료되고 돌아가게 된다. 기본설정은 시스템 시동때마다 자동으로 시작하게 되어있다. 이를 바꾸려면, 시작-제어판-관리도구-서비스를 열어서 Local-only HTTP Server라고 된 것을 찾아 바꿔주면 된다. (고수들은 services.msc라고 명령행에 치는 것을 즐겨쓴다.)

설정: brhttpd.ini는 간단한 설정파일이다. 설정파일은 실행파일과 같은 디렉토리에 있어야 한다.

여기서 설정할 수 있는 것은 로그파일 이름과 열어둘 포트 목록, 그리고 메모리 사용량 최소화를 위한 시간간격이다. 설정파일은 없어도 상관없다. 설정파일이 없으면, 로그파일은 실행파일이 있는 디렉토리에 brhttpd.log라는 이름으로 생기며, 가짜 웹서버는 80번 포트를 열어놓고 기다린다. 기다리는 시간이 1분이 넘어가면 가짜 웹서버는 사용메모리를 최소화하고 계속 기다린다.

설정은 서비스가 시작할 때마다 읽어들인다. 설정을 변경한 후에 이를 적용하려면, 시작-제어판-관리도구-서비스를 열어서 Local-only HTTP Server를 재시작하면 된다.

로그파일 이름은 가급적이면 드라이브이름까지 포함하여 지정하는 것이 나중에 로그파일 찾기에 도움이 된다. 상대경로로 지정하면 윈도우즈는 %systemroot%\system32의 상대경로로 해석한다. 로그파일 생성 자체를 막으려면 로그파일 이름을 NUL이라고 주면 된다.

[Settings]
LogFile=NUL

포트는 최대 64개까지 지정할 수 있다. 상식적으로 생각할때, 64개는 지나치게 많지만, 가끔은 상식이 설명하지 못하는 일들이 벌어지기도 한다. 포트를 지정하는 키는 port0에서 port63까지이며, 순서대로 쓸 필요도 없고, 키번호가 건너뛰어도 상관없다.

[Settings]
port0=80
port10=8080
이 예에서는 80번 포트와 8080번 포트를 열어놓도록 지정했다.

버전 1.1에 새로 추가된 설정: 웹서핑을 하지 않을 때에는 가짜 웹서버도 메모리를 덜 사용하도록 지정할 수 있다. 가짜 웹서버가 웹서핑이 없다고 판단하는 기준은 가짜 웹서버에 HTTP요청이 들어오는 시간간격이다. 일정 시간동안 HTTP요청이 들어오지 않으면, 가짜 웹서버도 할 일이 없다고 판단하고 메모리 사용량을 최소로 줄이게 한다. 사용자가 설정하는 것은 바로 그 시간간격을 초 단위로 적어주는 것이다. 이 값이 설정되지 않으면 기본값으로 1분을 설정한다.

[Settings]
MemCleanTimeOut=120
이 예에서는 2분동안 가짜 웹서버로 HTTP요청이 들어오지 않으면 메모리 사용을 최소화하도록 지정했다. 시간간격의 최대값은 1시간(=3600초)이며, -1을 지정하면 메모리 사용량을 줄이려는 시도를 하지 않는다. 메모리 사용량을 줄이는 기법은 CleanMem이나 그 비슷한 프로그램들과 같은 기법을 사용한다. 그런 프로그램과 기법이 유효한지는 논란이 아직 많다. 이 기법에 회의적이라면 -1로 설정하면 된다.
[Settings]
MemCleanTimeOut=-1
시간간격이 너무 길면 메모리 절약효과가 없고, 너무 짧으면 메모리 절약은 되더라도 다른 측면에서 비효율이 발생한다. 어림값으로는 한 웹페이지에 평균적으로 머무는 시간을 정하면 된다.

삭제: 프로그램을 삭제하려면 우선 서비스를 종료하고

brhttpd.exe /u
라고 명령행에 입력하여, 서비스 데이타베이스에서 삭제한다. (관리자 권한이 필요하다.) 그후에는 실행파일을 지우고, 설정파일이나 로그파일이 있으면 지우면 된다.

한계

가짜 웹서버를 사용하는 것은, 근본적으로 hosts파일을 사용하여 광고서버로 가는 트래픽을 다른 곳으로 돌리는 방법에 추가적인 편의를 덧붙인 것 뿐이다. 따라서, hosts파일 편집방법의 한계를 고스란히 안고 있다. 예컨대, 광고서버가 따로 분리되어 있지 않고, 광고와 정상적인 내용이 같은 도메인 네임을 가진 서버에서 제공된다면, 이 방법은 전혀 효과가 없다.

이를 해결하려면 브라우저마다 확장으로 제공되는 프로그램을 사용하거나, 파이어폭스에서는 userContent.css를 직접 편집하는 방법을 쓸 수 있다. 한편, 여기의 방법을 좀더 발전시켜, 프록시 서버로 확장하여 HTTP요청을 일일이 걸러내는 방법도 가능하다.

파일

다운로드 전에: 이 프로그램을 실행함으로써 발생할지도 모르는 어떠한 불상사에 대해서도 제작자는 책임지지 않는다. (이는 더도 아니고 덜도 아니고 딱 마이크로소프트 수준의 사용허가 문구이다.)

버전: 1.2 (2014년 7월 21일)
달라진 점: 내부 구조를 바꾸고 몇가지 사소한 버그를 고쳤다. (사용자가 바로 느낄만한 기능상의 차이는 없다. 그러므로 이전 버전을 사용하면서 문제가 없었다면 굳이 업데이트할 필요는 없다.) 64 비트용 실행파일이 추가되었다. 컴퓨터에 설치된 윈도우즈에 따라 32비트용과 64비트용 실행파일을 자동으로 선택해서 설치한다.

brhttpd-1.2.exe
brhttpd.exe  (32비트용: 11776 바이트)  NT 서비스 실행파일
   (64비트용: 14848 바이트)   
brhttpd.ini  (2475 바이트)  간단한 설정파일

사용 예

(2010년 3월 12일 추가)

Posted by movsd
,