크게 작게 100자평 쓰기  블로그 스크랩  이메일  프린트 

마이스페이스에 숨어 있는 비열한 인간 찾는 방법

6개월 전, 와이어드 뉴스는 공공기관의 성범죄자 등록 데이터베이스와 마이스페이스의 1억2천만 사용자들의 프로필을 대조하여 얼마나 많은 인물이 일치하는지를 알아보는 조사에 착수했다.

이 프로젝트는 와이어드 뉴스의 기고가인 젠 슈레브가 무작위 검색에 의해 서로 일치하는 몇 건의 프로필을 발견하면서 시작됐다. 일종의 소프트웨어 스크립트를 통해 체계적으로 두 데이터베이스의 기록을 일일이 대조한다면 일치하는 프로필을 얼마나 많이 찾을 수 있을까?

우리는 직접 알아보기로 했다. 나는 펄(Perl)을 사용해 일련의 스크립트를 작성하고 데이터들을 걸러내기 시작했다.

이것은 건초더미 속에서 바늘 찾기나 다를 바 없이 매우 원시적인 기법이다. 내가 일치하는 것으로 보이는 프로필을 수작업으로 확인하기 시작하자, 잘못된 정보가 수천 건씩 나타났다.

그럼에도 불구하고, 몇 주에 걸쳐 여유시간을 이 프로젝트에 투자한 결과, 나는 한 명의 용의자를 찾아낼 수 있었다. 그의 행동은 너무나 의심스러워 나는 뉴욕 서퍽 카운티 경찰국과 접촉해 그에 대한 설명을 요구했다. 앤드루 루브라노(Andrew Lubrano)라는 이름의 이 용의자는 아동학대 혐의로 이번 달 초에 체포됐다.

이 박에도 약 700건의 프로필이 일치하는 것으로 확인됐는데, 이들 중 마이스페이스 공개 포스트에서 실제 범법행위를 저질렀다는 증거를 찾을 수 있는 사람은 없었다.

오늘 와이어드 뉴스는 이번 조사에 사용된 프로그램 코드를 공개한다(gzip 형식의 파일을 다운받고 싶으면 여기를 클릭하기 바란다). 누구든 자유롭게 이 소프트웨어를 받아서 내용을 살펴보고 여기서 사용한 방법을 인정(혹은 기각)할 수 있으며, 코드에 대해 토론하거나 코드를 수정 및 개선할 수도 있다.

우리는 BSD 라이선스에 따라 전적으로 그리고 완전히 독립적으로 이 코드를 공개한다. 사전에 통보만 한다면 우리는 이 코드를 채택하여 공개소스를 개발하는 일에도 기꺼이 참여할 것이다.

경고: 이 스크립트는 일회성 프로젝트를 위해 개발됐기 때문에 모든 스크립트들이 전면적인 메모리 정화(淨化)를 초래할 수도 있다.

이 코드가 할 수 없는 일을 주지하는 것도 중요하기에 먼저 짚고 넘어가겠다.

우선, 이 코드는 일반 시민들이 마이스페이스에 계정을 가진 특정 아동들을 보호할 수 있도록 어떤 환경에서든 설치 후 바로 사용할 수 있는 애플리케이션이 아니다. 이것을 사용하려면 웹 서버와 MySQL 데이터 서버를 보유해야 하며 펄 언어에 대한 기본적인 지식도 있어야 한다.

또한 이것은 완전 자동화된 범인탐색 프로그램도 아니다. 그보다는 사람 찾기의 출발점이라고 보는 편이 더 적당하다.

더욱 중요한 것은, 이 방법으로 찾아낸 프로필의 대부분은 잘못된 정보라는 사실을 반드시 주지하고 있어야 한다는 점이다. 나는 자동화된 탐색 결과를 보완하기 위해 내 육안으로 후보자의 각 프로필을 검토하고 사진과 연령, 그리고 대부분의 경우, 생일을 비롯해 마이스페이스와 성범죄자 등록 데이터베이스에서 제공할 수 있는 기타 생물학적 자료들을 대조했다. 이 소프트웨어가 그와 같은 대조작업을 상대적으로 쉽게 만드는 것은 사실이지만 어쨌든 그것은 수작업으로 이뤄져야 할 일이다.

세심한 시각적 검토를 거친 후 일치하는 프로필을 발견했더라도, 스스로 법집행관이 되는 우를 범해서는 안 된다. 성범죄 데이터베이스 구축에 기반이 된 메건법(Megan's Law)은 이 데이터를 사용해서 전과자를 괴롭히는 일을 금하고 있다. 또 한 가지 중요한 법률적 문제가 있다. 내가 이 소프트웨어를 돌릴 때에는 마이스페이스도 미국 법무부(Department of Justice, DOJ)도 그들의 데이터베이스에 대한 자동화 검색을 금지하지 않았다. 하지만 그런 상황은 언제든 바뀔 수 있다.

이제, 소프트웨어로 돌아가 보자.

마이스페이스에서 성범죄자를 탐색하는 과정은 세 단계로 이루어진다. 첫 번째 단계는 성범죄자 목록을 확보하는 것이다. 나는 4월 말경에 첫 번째 스크립트인 scraperps.pl의 작성을 마쳤다. 이 프로그램은 DOJ의 데이터베이스에서 우편번호(ZIP 코드) 목록을 먼저 검색한 뒤, 그 하위 자료로 단순하게 데이터베이스 양식을 채운다. 한 번에 다섯 개의 우편번호를 읽어 들이는 방법을 통해 조회 속도를 최대로 끌어올렸다. 그 다음 이름과 우편번호, 주소가 채워진 완성된 양식을 데이터베이스에, 즉 ‘perps’라는 이름의 테이블에 저장한다.

내가 처음 프로그램을 작동시켰을 때 법무부 사이트는 일시적으로 내 프로그램을 차단시켰다. DOJ 서버는 연속적으로 많은 조회를 수행하는 것을 좋아하지 않는다는 얘기다. 차단 조치가 해제되자(법무부가 피도 눈물도 없다는 말은 절대 하지 말아야 한다), 나는 조회 사이에 30초의 간격을 두었다. 그러자 서버도 만족한 것 같았다. 하지만 프로그램 실행 시간은 71시간이 넘게 늘어났다.

이런 작업이 진행되는 동안, 나는 마이스페이스 스크린 스크래핑(screen-scraping)에 착수했다. 마이스페이스에 등록할 때 마이스페이스에서는 성과 이름, 우편번호를 요구한다. 이 정보들은 마이스페이스 프로필에는 나타나지 않는다. 그것이 바로 수많은 범법자들이 자신의 이름을 주저 없이 입력하는 이유일 것이다. 하지만 마이스페이스 검색엔진은 사용자의 이름을 통한 검색을 허용하며, 그 결과를 특정 우편번호의 반경 8킬로미터 이내로 제한한다. 이런 제한 덕분에 법무부의 성범죄자 등록 자료와 적절한 비교가 가능한 데이터를 얻을 수 있었다.

마이스페이스 스크래퍼(scraper)인 myspacebot.pl은 ‘perps’에 저장된 모든 항목들과 마이스페이스 사용자를 비교하는 작업을 수행했고 그 결과는 ‘myspace’라는 이름의 테이블에 저장됐다.

이론상으로는 단순하지만 이 코드는 DOJ 스크래퍼보다 훨씬 더 복잡했다. 수많은 디버깅을 거쳐야 했고 코드의 전반적인 검토를 요구했다. 이 프로젝트에 사용된 다른 코드들처럼, 이것도 일회용으로 작성됐기 때문에 프로그램에 대한 주석은 거의 전무했고 “$foo”나 “$bar”와 같은 무의미한 변수명은 아무런 도움이 되지 못했다. 게다가 나는 엄청나게 많은 ‘GOTO’ 명령을 사용했다.

마이스페이스 서버는 예측이 불가능하다. 탐색이 실패하여 빈 페이지만 나타나거나 에러 메시지가 뜨는 경우가 비일비재하고, 한 번의 탐색이 바로 결과로 이어질 수도 있고, 그러다가 바로 다음 탐색에서는 30초나 걸릴 수도 있다. 따라서 코드는 매우 지속적이고 끈질겨야 한다. 탐색으로 이어질 때까지 몇 번이고 시도를 해야 하니 말이다. 동시에 몇 개의 스레드를 운용하는 것은 가능하다. 예의상 나는 딱 네 개의 스레드만 사용했다.

어느 순간, 결과가 나타나기까지 아주 오랜 시간이 걸리는 것은 예외 없이 탐색이 실패할 조짐이라는 사실을 깨달았다. 나는 클라이언트의 탐색종료 시간을 10초로 조정했고, 그러자 탐색 속도는 눈에 띄게 증가했다. 하지만 오후가 되자 이 방법이 통하지 않았다. 나는 십대들이 학교를 끝내고 집으로 돌아와 한꺼번에 접속하는 바람에 서버의 속도가 느려졌다는 것을 깨달았다. 그래서 내가 설정한 탐색종료 시간이 바보의 공상이 돼버렸다는 사실을 말이다. 나는 다시 탐색종료 시간을 20초로 늘였고 그 조치는 어느 정도 효과가 있는 것 같았다.

일단 가능성이 있는 프로필들을 확보하자, 나는 또 다른 스크립트, ‘lookup.pl’을 사용해 DOJ의 데이터베이스에 접속하고 이전 단계에서 얻은 프로필과 주의 범법자를 직접 연결시킬 수 있는 자료를 수집했다.

세 번째 단계, 즉 수작업 분석에서 나는 많은 사고력을 동원했다. 이 단계에서 가장 많은 시간을 소비했다.

결국 CGI 스크립트인 ‘msresults.pl’를 만들어 냈다. 이 프로그램은 일치 가능성이 있는 각각의 결과를 화면에 보여주는 것으로, 한 쪽에는 범죄자 정보가, 다른 한 쪽에는 마이스페이스 프로필이 나타난다. 이름과 마지막 접속 시간, 접속 장소, 나이, 프로필의 디폴트 사진이 성범죄자 사이트에서 제공된 골자 정보 위쪽에 배치되고 그의 전과기록으로 연결되는 링크가 제공되며, 마이스페이스 프로필과 자기소개 페이지, 사진 페이지, 친구 목록으로 연결되는 링크도 제공된다.

주석을 달 수 있는 필드도 있고 어떤 프로필을 계속 추적하도록, 또는 추적 대상에서 제외시키고 나면 더 이상 화면에 나타나지 않도록 설정하는 체크 박스도 있다. (코드나 URL에 설정할 수 있는) 옵션들도 있어서 디폴트 사진이 없을 경우 그 프로필은 일단 보이지 않게 하거나(나는 이 옵션을 사용했다), 사용자에 의해 일치하는 것으로 표시된 프로필만 보이도록 하거나, 최종 결과를 인쇄화면으로 보여주도록 설정할 수 있다. 그 외에도 여러 가지 옵션이 제공된다.

나는 마이스페이스를 탐색하고 다니는 일이 대단히 유해한 일이라는 사실을 금방 깨달을 수 있었다. 탐색자의 미적 감각은 물론 파이어폭스(Firefox) 웹브라우저에게도 해로웠는데, 이 소프트웨어는 종종 유별난 자바스크립트와 스트리밍 미디어, 정신 나간 HTML의 뒤범벅을 처리하기보다는 종종 자살하는 쪽을 택한다.

따라서 나는 용의자의 친구목록을 좀더 쉽게 검사해보려고 또 다른 스크립트, ‘friendbot.pl’을 작성했다. 이것은 선택사양이니 여러분에게는 필요 없을지도 모른다.

‘friendbot.pl’은 안정적으로 실행되지 않았는데, 아마도 마이스페이스 서버의 간헐적인 개입이 그 원인이었을 것이다. 하지만 적절히 실행되기만 하면 이 프로그램은 친구목록을 헤집고 다니며 친구들 각각의 프로필을 수집하고 가장 핵심적인 정보(주로 친구의 연령)를 확보한다. 이 모든 정보가 데이터베이스에 저장되면 실제 마이스페이스가 제공하는 친구 목록을 대신해줄 수 있는 또 다른 CGI 스크립트 ‘friend.pl’을 통해 제공될 수 있다. ‘friendbot.pl’을 통해 수집된 정보를 이용해 나이 어린 친구의 숫자가 비정상적으로 많은 성범죄 후보자의 프로필을 추출하도록 시도해 볼 수도 있을 것이다.

‘age_filler.pl’ 스크립트는 17세 미만의 친구 수와 정확히 16세인 친구의 수, 그리고 전체 친구의 수를 계산해서, 그 프로필 항목을 ‘myspace’ 데이터베이스에 기록해준다. 이 데이터들은 ‘msresults.pl’를 통해 화면에 전시된다.

그 방법은 코드를 보면 알 수 있을 것이다.

(wired.daum.net) = By Kevin Poulsen / Also by this reporter

입력 : 2006.10.25 10:10 23'

100자평 쓰기  블로그 스크랩  이메일  프린트 


 |