1994년, National Science Foundation에서는 인터넷 상에서의 광고 금지를 중단했다. 당시는 이메일과 Usenet이 통신 포럼의 주류를 이루고 있고, Gopher 등의 단순한 게시 시스템이 사용자 기반을 넓히려고 하던 시절이었다. 웹은 이때까지도 아직 등장하지 않았다. 바로 그 해에 Canter & Siegel이라는 법률 회사에서 Perl 프로그래머를 고용하여 "그린 카드 복권" 서비스를 광고하는 첫 번째 대량 상업 스팸을 Usenet에 올렸으며, 이 스팸은 6,000개 이상의 뉴스그룹으로 순식간에 퍼져 나갔다. 그들은 악명을 얻어 유명해진 후 스팸을 만들어주는 사업에 진출하여 스팸의 장점을 홍보하고 "인터넷 마케팅"을 주제로 한 책까지 냈다. 그 이후 모든 온라인 포럼이 원하지 않는 상업 광고로 인한 피해를 입었다. 온라인 토론장으로서의 웹의 중요성이 높아지고 Web 2.0 기술로 인해 사람들이 단순히 읽는 것에 그치지 않고 쓸 수도 있는 공간이 마련되면서 스팸의 폐해도 더욱 심해졌다.
웹 스팸은 때때로 사소한 문제로 그치기도 하지만 대부분의 경우에는 치명적인 문제를 야기시킨다. 스패머는 한두 개의 메시지를 게시하는 데 만족하지 않고 원하는 대상을 완전히 압도할 때까지 스팸 메시지로 포럼을 도배한다. 스팸에는 포럼 참가자의 반감을 일으키는 춘화나 반사회적 메시지가 들어 있기도 하다. 대부분의 검색 엔진은 스팸 메시지가 들어 있거나 스팸에 연결된 사이트에 대한 링크가 포함된 페이지를 차단한다. 이는 결국 스팸이 검색 엔진의 최적화에 부정적인 영향을 주게 된다는 것을 뜻한다. 그리고 최종적인 피해는 다른 작업에 투자할 시간을 빼서 스팸을 처리하기 위해 리소스를 낭비해야 하는 웹 게시자에게 돌아가게 된다.
웹 스팸은 다음과 같은 여러 가지 형태를 가지고 있다.
- wiki에 올려져 있는 스팸 기사 및 악의적 기사
- Weblog에 올려져 있는 주석 스팸
- 포럼, 이슈 트래커 및 기타 토론 사이트에 게시된 스팸
- 리퍼러 스팸(스팸 사이트가 리퍼러를 나열한 대상 사이트로 사용자를 유인하는 경우)
- 소셜 네트워크의 잘못된 사용자 항목
웹 스팸 처리가 매우 어려움에도 불구하고 웹 개발자들은 스팸 예방 책임을 등한시하고 있다. 이 기사와 Part 2에서는 여러 종류의 웹 스팸을 차단할 수 있는 기법, 기술 및 서비스에 대해 설명한다.
온라인에서 발생하는 사람들의 행동을 분석하면 타이밍과 컨텐츠에 불규칙한 패턴이 있다는 것을 알 수 있다. 스팸은 일반적으로 Canter & Siegel에서 6,000개의 Usenet 그룹에 도배했던 Perl 스크립트 같은 프로그램에 의해 생성된다. 이러한 프로그램의 기계적 패턴을 사용하여 스패머에 대응할 수도 있다. 등록이 필요한 경우 다양한 경고 기호를 사용하여 계정에 플래그를 지정한 후 나중에 검토할 수 있다. 예를 들어 .ru, .br, .biz 등의 최상위 레벨 도메인의 계정은 스패머와 관련되어 있을 가능성이 높다. 계정에 플래그가 지정된 경우 해당 계정의 처음 몇 개의 게시물을 일단 보류한 후 게시물을 검토하고 보류를 풀 수 있다.
Wiki, Weblog 및 포럼 스패머는 수 초 내에 수십 개의 요청을 보내기도 한다. 이 경우 한 사용자나 IP 주소에서 일정 간격 내에 보낼 수 있는 요청의 수를 제한하여 피해를 최소화할 수 있다. 이 기법을 플러드 제어라고 한다. 이 방법을 사용할 때는 한 페이지가 아닌 사이트 전체에 대한 요청을 제어해야 한다.
이러한 동작 평가 기법과 다음 섹션에서 설명하는 기법들을 사용하여 스팸 외에도 웹에서 발생하는 다른 유형의 남용을 차단할 수 있다. 예를 들어 웹 메일 서비스를 호스트하는 경우 스패머가 스팸을 보낼 수 있는 계정을 대량으로 만들려고 시도하거나 온라인 경매 사이트를 호스트하는 경우 스패머가 경매 프로세스를 조작하는 프로그램을 작성할 수 있다. 신규 사용자를 등록하는 시스템이 있는 사이트라면 어디에서나 신규 사용자 중 일부가 문제를 일으키기 위해 자동 가입 방법을 찾으려고 시도하는 경우를 자주 볼 수 있다. 이러한 시도가 발생할 경우 웹 개발자는 서비스 사용자 중에 스패머가 있다는 것을 쉽게 확인할 수 있다.
대부분의 스팸은 로보트를 이용해서 생성되기 때문에 사이트의 사용량을 보면 몇 가지 특징적인 패턴을 발견할 수 있으며 이러한 패턴을 이용해서 스팸을 차단할 수 있다. 그림 1에서는 일반적인 사람과 일반적인 로보트가 사이트에 추가할 메시지나 주석을 제출할 때 나타나는 워크플로우의 차이점을 보여 준다.
그림 1. 사람과 로보트의 일반적인 웹 워크플로우 비교
POST 요청으로 직접 접근하는 일반적인 로보트 워크플로우를 감지하여 많은 양의 스팸을 차단할 수 있다.
가장 먼저 확인할 사항은 요청자가 기본 폼을 로드했는지 여부이다. 이를 확인하는 한 가지
방법은 폼의 일부를 사용자에게 표시하거나 숨기는 방식으로 변경하는 것이다. 일반적인 속임수는 폼 필드의
이름을 변경하는 것이다. 날짜, 사용자 IP 등의 수정자를 기본 이름에 사용하여 만든 필드 이름(예:
content_081010_68_45_76_45)과 함께 기본 컨텐츠가 담긴 텍스트 영역을 사용자에게
보낼 수 있다. 변형 필드 이름의 재사용을 허용하지 않을 수 있으며 일부 사용자에게 게시할 때 상자를 선택하도록
요청하여 변형을 표시할 수도 있다. 이 경우 다른 패턴이 나타나면 사용 중인 IP를 의심해 볼 수 있다.
임의 값은 폼이 포함된 각 페이지 보기에 대해 생성되는 추측하기 어려운 값이다. 그런 다음 해당 임의 값을 폼 제출의 필드 중 하나로 요청한다. 로보트는 폼 제출을 바로 POST하려고 시도하지만 HTML 페이지를 로드하지 않았기 때문에 예상 임의 값을 알지 못한다. 여러 가지 방법으로 임의 값 테스트의 세부사항을 조정할 수 있다. 모든 경우에 임의 값을 재사용할 수 없도록 설정할 수 있다. 그렇게 하지 않으면 스패머가 쉽게 우회할 수 있다. 페이지가 요청된 날짜 또는 시간과 IP 주소를 사용하여 임의 값을 생성하고 임의 값의 유효성을 검증할 수 있다.
일부 로보트는 페이지를 로드한 후 임의 값을 읽어서 임의 값 테스트를 무력화하려고 시도한다. 부주의한 스패머의 경우 필수 정보를 가지고 있다고 해서 로보트에서 POST를 즉시 보내기도 한다. 사람이 폼 입력을 채운다고 가정할 때 폼 입력을 완성할 수 없는 짧은 시간 간격을 사용하여 폼이 로드된 직후 제출된 폼에 플래그를 지정할 수 있다. 이 기법은 플러드 제어 테스트와 관련된다. 주의를 기울여서 만든 로보트라고 하더라도 폼 페이지의 JavaScript를 실행하는 로보트는 많지 않다. 이 특징을 여러 가지 방법으로 사용할 수 있다. 무엇보다도 폼 페이지의 실제 컨텐츠에서 임의 값을 생성하지 않는 것이다. 대신 폼 페이지의 보조 JavaScript 요청을 사용하여 임의 값을 생성한다. 사용자가 기본 컨텐츠 필드에 데이터를 처음 입력할 때 사용할 이벤트 처리기를 설정할 수 있다. 그림 2에서 이를 설명한다.
그림 2. JavaScript를 사용하여 임의 값 테스트 개선
이 기법을 사용할 때 발생하는 주요 문제는 일부 사용자가 JavaScript를 사용하지 않는다는 것이다. 실제로 일부 회사 정책에서는 JavaScript를 사용하지 않도록 요구하고 있다. 따라서 이 문제를 해결하려면 사용자가 스스로 인증할 수 있는 보조 수단을 제공해야 한다. 예를 들어 JavaScript를 호출하지 않는 사용자에 대해서만 폼 변형을 사용하는 등의 방안을 마련해야 한다. 반면 일부 스패머는 브라우저 엔진 내에서 스크립트를 사용하여 공격을 실행하기 때문에 JavaScript 호출이 발생한다. 이 경우에는 스팸 감지 과정 중에 JavaScript 테스트를 절대적인 판단 요소가 아닌 일종의 가중 요소로 사용할 수 있다.
임의 값 테스트 변형이 웹 스팸을 차단하는 방법으로 많이 사용되고 있다. 사람에게는 쉽지만 로보트에게는 까다로운 시각적 테스트를 POST 폼에 포함시키는 방법이다. 그 중 가장 많이 사용되는 방법이 CAPTCHA이다. 이 테스트에서는 사용자가 읽고 폼 필드에 입력해야 하는 영숫자 문자를 보여 주는 이미지를 제공한다. 스패머는 광학 문자 인식을 사용하여 CAPTCHA를 뚫으려고 시도하지만 이들 이미지에는 대개 상당히 왜곡된 부분이 포함되어 있다. 그림 3은 CAPTCHA 이미지의 예이다.
그림 3. 사용자가 "smwm"이라고 응답해야 하는 CAPTCHA 이미지
이 예처럼 약한 수준의 왜곡이 적용된 경우 스패머가 CAPTCHA를 뚫을 수 있었다. 결국 스패머를 막기 위해 그림 4처럼 더욱 높은 수준의 왜곡이 사용되고 있다.
그림 4. 사용자가 "following finding"이라고 응답해야 하는 CAPTCHA 이미지
여기에는 몇 가지 문제점이 있다. 첫 번째 문제점은 스패머를 막기 위해 CAPTCHA의 왜곡이 심해질수록 사람들이 읽기 어려워진다는 것이다. 시각 장애인처럼 CAPTCHA 이미지를 전혀 볼 수 없는 사람들도 있기 때문에 이 기법을 사용할 경우 액세스 가능성이 낮아질 뿐 아니라 합법적이지 못한 상황까지도 발생할 수 있다. 이러한 난제가 있음에도 불구하고 CAPTCHA는 가장 유명한 스팸 차단 기법 중 하나가 되었다.
액세스 가능성 문제를 피할 수 있는 비슷한 기법은 임의의 텍스트 질문을 사용자에게 제시하는 것이다. 사이트에 특정 도메인이 있다면 해당 도메인에 대한 기본적인 지식을 묻는 질문을 제시할 수 있다. 의학 뉴스 및 정보 사이트의 경우 "호흡과 연관된 주 기관은 무엇입니까?"와 같은 질문을 제시하고 "폐"라는 대답을 기대할 수 있다. 이 기법을 사용할 경우에는 여러 가지 변형된 질문을 사용해야 하고 사람들은 일반적으로 대답할 수 있지만 로보트는 추측할 수 없는 단어를 선정해야 한다는 점이 중요하다.
사람들에게 자신의 게시물을 미리 보도록 하면 이 기사에서 설명한 모든 기법의 난해도를 높일 수 있다. 이 워크플로우 단계를 추가하기만 해도 일부 스패머를 잡을 수 있으며 좀 더 주의를 기울이면, 예를 들어 JavaScript를 사용하여 일부 사용자에 대한 미리보기를 자동화하면 사용자의 불편을 최소화할 수 있다. 워크플로우에 따라 CAPTCHA, 폼 변형, 임의 값 등의 기법을 적용하여 대부분의 유효한 사용자가 알아차릴 수 없는 방법으로 스패머를 곤경에 빠뜨릴 수 있다.
동작을 평가하고 워크플로우를 관리하기만 해도 스팸을 줄일 수 있지만 완전히 제거할 수는 없다. 예를 들어 일부 스패머는 사람을 고용하여 이 기사에서 설명한 모든 통제를 뚫기도 한다("mechanical turk" 공격이라고도 함). 스패머는 인건비가 낮은 사람에게 비용을 지불하고 대상 사이트로 가서 스팸 메시지를 직접 남겨두도록 시킨다. 대부분의 교활한 스팸 로보트뿐 아니라 mechanical turk까지도 해결하려면 여러분처럼 스팸을 싫어하는 사람들이 모인 대규모 커뮤니티의 도움을 받아야 한다. 이를 실현하는 방법에 대한 내용은 이 시리즈의 다음 기사에서 설명하겠다.
교육
- 자세한 이야기를 알고 싶다면 개척 스패머 Canter
& Siegel에 대한 이야기를 읽어보라. Spam 기사에서 배경 정보도 찾아보라.
- CAPTCHA에 대한 Wikipedia 기사에서 역사, 변형 및 구현에 대해 다루고 있다.
- Spam in blogs에 대한 Wikipedia 기사에 수집되어 있는 유용한 정보를 찾아보라.
- Weblog 또는 포럼 소프트웨어의 많은 개발자들이 스팸 차단과
관련된 좋은 자료를 많이 가지고 있다. 대표적인 자료로는 Six
Apart(makers of MovableType)와 Wordpress가 있다.
- David Mertz의 "Charming
Python: Beat spam using hashcash"에서 Wiki와 이메일의 스팸을 최소화하는 hashcash 기법에 대해 배워보자.
- developerWorks 웹 개발 영역에서
이 컬럼의 이전 연재물을 비롯하여 웹 기술에 특화된 기사와 튜토리얼을 통해 사이트 개발 기술을 향상시키자.
- developerWorks 기술 행사 및 웹 캐스트를 통해 최신 정보를 얻을 수 있다.
토론
- developerWorks 블로그에 참여하여 developerWorks 커뮤니티의 일원이 되자.
