Blog, Nucleus: 블로그의 스팸들
국내 몇 안 되는 Nucleus 사용자 중 한 분이신 Miren 님이 코멘트 스팸 때문에 고생하셨다는 얘기를 듣고 블로그와 관련된 스팸 문제가 결코 남의 일이 아니라는 생각이 들었습니다. 누구나 결국 한 번쯤은 겪게 될 문제인 것 같습니다.
블로그와 관련된 스팸은 크게 코멘트 스팸(comment spam), 리퍼럴 스팸(referral spam), 트랙백 스팸(trackback spam) 정도가 있는 것 같습니다. 이 세 가지 대표적인 블로그 스팸의 성격과 대처방안에 관해서 정리해 보고자 합니다.
1. 코멘트 스팸(Comment Spam)
코멘트 스팸은 단순하고 개방적인 웹 프로토콜의 특성 때문에 스패머들에게는 아주 손쉬운 대상입니다. 코멘트를 블로그에 등록할 때 웹서버로 전달되는 POST 메시지의 구조를 알면 누구나 스팸을 보낼 수 있습니다. 해당 페이지의 코멘트 메시지의 구조는 브라우저에서 HTML 소스만 봐도 쉽게 파악할 수 있습니다. 대개는 이름, 이메일이나 홈페이지, 본문으로 구성되어 있으며 대부분 별도의 인증을 요구하지 않습니다. 이러한 블로그는 언제든지 코멘트 스팸에 노출될 가능성이 있다고 볼 수 있습니다.
코멘트 스팸을 막기위해 코멘트를 아예 막아 놓을 필요는 없습니다. 어떤 다른 이유가 아니라 단순히 스팸 때문에 코멘트를 없애는 일은 그다지 바람직하지 않습니다. 코멘트는 자기 글에 대한 독자들의 피드백이기도 하지만 자기 글을 더 풍성하게 만드는 것이기 때문입니다. 게다가 코멘트 스팸을 막는 방법은 여러가지가 있습니다.
- 가장 쉽게 떠올릴 수 있는 방법으로는 블랙리스트(blacklist)를 관리하는 것을 들 수 있습니다. 코멘트의 본문 등에 포함된 주소를 모두 검사하여 블랙리스트에 등록된 주소가 발견되면 코멘트를 버리는 방식입니다. 대부분의 스팸 코멘트들은 자기 웹페이지를 광고하기 위한 목적으로 본문안에 주소를 포함시키기 때문에 매우 효과적인 대응방법입니다. 금칙어를 정해 놓고 본문을 검사하는 방식도 유사한 방식이라 할 수 있습니다. 뉴클리어스에도 NP_Blacklist 플러그인이 있습니다.
- 아예 IP를 차단하는 방식도 생각해 볼 수 있습니다. 뉴클리어스에는 관리자 페이지에서 차단할 IP를 등록할 수 있습니다. 유동 IP가 대다수인 시대에 그다지 효과가 없을 것 같지만 급하게 공격을 막는 방법으로는 괜찮은 선택입니다.
- Typekey 등과 같이 적절한 절차를 밟아 승인된 사람만 코멘트를 쓸 수 있도록 하는 것도 한 방법입니다. MT를 운영하는 블로그에서는 자주 볼 수 있지만, 뉴클리어스에는 아직 관련 플러그인이 없습니다. 저는 다소 절차가 번거롭다는 느낌이 들어서 꺼리고 있습니다.
- 이미지로 된 보안코드를 입력받는 방식도 있습니다. 이미지로 출력한 보안코드는 사람은 쉽게 알아 볼 수 있지만 스팸 소프트웨어는 읽을 수 없습니다. 다만, 이미지를 동적으로 생성하여 보내는 방식이기 때문에 다른 방식들에 비해 웹서버 측 부담이 큽니다. MT에는 scode라는 플러그인이 있습니다. 뉴클리어스 플러그인으로는 제가 만든
NP_SCode라는 것이 있습니다. 지금 테스트 중이며 곧 공개할 계획입니다. - 코멘트를 등록하기 전에 '미리보기' 단계를 하나 더 두는 방식도 있습니다. 이런 절차를 두면 자기가 쓴 코멘트를 다시 한번 확인하여 오류를 바로잡을 기회도 생긴다는 이점이 있을 뿐 아니라, 스팸 소프트웨어들에게는 통과해야 할 까다로운 단계를 하나 더 만들어 준다는 의미가 있습니다. 뉴클리어스에는 아직 이런 기능을 하는 플러그인이 없는 것 같습니다.
2. 리퍼럴 스팸(Referral Spam)
리퍼럴 스팸은 블로그 이전에는 있었다고 해도 별로 의미가 없던 것인데 블로그가 인기를 끌면서 골치거리로 떠오르고 있습니다. 리퍼러(referrer)는 HTTP 요청 헤더(request header)의 한 부분인
Referer*1 필드를 가리키는 말로서 현재 문서를 참조하고 있는 문서의 주소를 담고 있습니다. HTTP 규약에서는 클라이언트가 해당 문서의 주소를 포함하고 있지 않은 주소를 리퍼러로 보내서는 안 된다고 강조하여 규정하고 있습니다. 때문에 웹서버들은 이 값을 별도로 검증하지 않습니다. 스패머들은 이러한 신뢰에 바탕한 체계의 맹점을 악용하는 셈입니다. 그들이 스팸을 보내기 위해서 하는 일은 코멘트 스팸보다 더 간단합니다. 메시지의 크기도 더 작습니다. 단지 Referer 헤더에 자신의 웹사이트 주소를 넣어서 웹서버에 GET 메시지를 전송하면 됩니다.
리퍼럴 스팸은 자신의 블로그에 리퍼러 목록을 표시하지 않는다면 무시해도 좋지만 그렇지 않은 경우에는 상당히 신경에 거슬립니다. 하지만 리퍼럴 스팸을 막기 위한 방법은 그리 많지 않습니다.
- 가장 널리 사용되는 방법은 웹서버가 특정 단어가 포함된 리퍼러를 무시하도록 하는 것으로 아파치 웹서버의 경우
.htaccess에 정해진 문법에 따라 규칙을 추가하면 됩니다. - 위와 같이 웹서버 차원에서 제한을 가하기 힘들다면 사용하는 블로깅 소프트웨어의 리퍼러를 기록하는 코드를 수정하는 것입니다. 리퍼러에 "hot", "sex", "casino" 따위가 포함된 것은 무시하도록 하거나
User-Agent값을 를 검사하는 방법도 있습니다. 리퍼러 스팸들에서 발견되는 어떤 공통된 패턴을 찾아서 걸러내는 것입니다. 뉴클리어스의 경우NP_Referrer,NP_Referrer2등의 플러그인을 수정하면 됩니다. - 생각해 볼 수 있는 다른 방법 중 하나는 단순무식하게 모든 리퍼러가 적법한 리퍼러인지 확인하는 것입니다. 다시 말해서, 해당 리퍼러가 담고 있는 주소의 문서를 요청해서 검사해 보는 것입니다. 하지만 이 방법은 상당히 부담스러운 작업입니다. 리퍼러가 지시하는 문서의 크기가 크다면 서버는 더 많은 자원을 낭비하게 됩니다. 해당 문서까지 한번의 요청으로 도달한 것이 아니라 몇 차례 리다이렉션되어 온 경우라면 더 복잡해집니다. 때문에 이 방법은 결코 좋은 방법이라 볼 수 없습니다.
3. 트랙백 스팸(Trackback Spam)
트랙백 스팸은 그야말로 신종 스팸입니다. 트랙백이 블로그와 함께 등장한 것이므로 블로그에 고유한 스팸이라고 봐도 무방합니다. 트랙백 프로토콜은 MT에서 만들었는데 본질적으로 특수한 POST*2 메시지에 불과합니다. 이 요청 메시지는 글의 제목(title), 본문 요약(excerpt), 문서의 고유 주소(permalink), 블로그 이름(blog_name)으로 구성되어 있습니다. 서버 측의 트랙백 처리 스크립트는 트랙백 핑이 접수되면 간단한 XML 형식의 응답메시지를 보냅니다. 트랙백 핑으로 전달된 주소의 글이 자기 글과 관련이 있는지 없는지는 인간이 아닌 이상 알 도리가 없습니다. 때문에 코멘트 스팸처럼 트랙백 스팸도 POST 메시지를 웹서버에 보냄으로서 간단히 목적을 달성하게 됩니다.
트랙백 스팸을 막는 방법 역시 많지 않습니다.
- 가장 유력한 방법으로는 코멘트와 유사하게 블랙리스트를 관리하는 것입니다. 주소나 요약된 본문에 블랙리스트의 단어가 나타나면 무시하도록 하는 방식입니다. 트랙백 핑을 처리하는 코드를 수정해야 하는데 MT의 경우는
MT-Blacklist플러그인에서 트랙백 스팸도 막아주는 것 같습니다. 뉴클리어스의NP_Blacklist플러그인은 아직 코멘트 스팸만 처리하므로,NP_Trackback플러그인을 직접 수정하여야 합니다.*3



![Validate my RSS feed [Valid RSS]](http://justhurd.net/weblog/skins/sunnycat/valid-rss.png)
![Validate my Atom 1.0 feed [Valid Atom 1.0]](http://justhurd.net/weblog/skins/sunnycat/valid-atom.png)

comments
대소문자를 구분하니 실수하면 바로 모든 글이 사라지는군요. (일부러 대문자를 소문자로 넣어 봤습니다.)
쓸 때도 조심해야겠습니다. 후훗
아, 이미 그렇게 하신건가봐요;;