기사 공유하기

[box type=”note”]이 글은 개발자 용어에 익숙하지 않은 독자가 읽기에는 어려운 기술적 개념들이 포함돼 있습니다. 비개발자 독자께서는 해당 부분을 건너뛰셔도 무방하리라 봅니다. 이 점 양해를 구합니다. 다만, ‘일간워스트’와 같은 커뮤니티 사이트를 개발하려는 독자께는 이 기록이 좋은 참조가 되길 바랍니다. (편집자) [/box]

이 모든 것은 예정에 없던 일이었습니다.

제 계획은 한 달 남짓 잠만 자다가, 슬슬 잠자는 것도 지겨워질 즈음부터 새로이 만들고 싶어진 서비스를 하나씩 만들어 런칭하겠다는 것이었습니다. 일주일은 쿨쿨 잤죠. 책을 좀 읽어볼까 정도만 생각하고 있었습니다. 그동안 챙기지 못했던 이 은행 저 은행 통장들과 (그놈의) 공인인증서를 정리하고자 지점 방문하고, 몇 년째 썩고 있던 휴면계좌에서 돈 찾고, 새로 신세 질 사무실 구경도 가보고, 그러고 있었습니다.

시절이 하 수상하여 철도파업 때문에 온 나라가 난리였던 주간이었습니다. 금요일 9시 뉴스에 수서발 KTX의 별도법인 면허가 발급되었다는 속보가 떴고, 트위터 타임라인에는 ‘말이라고는 도무지 듣지를 않는다’는 분노의 트윗들이 쏟아지고 있었습니다. 사실 심적으로는 지지하지만, 물벼락과 캡사이신 맞기는 싫어 부끄럽게도 집회에는 안 나가고 있었습니다. 그러던 와중에, 난데없는 트윗 하나가 제 눈길을 끌었습니다.

이 모든 일의 시작

https://twitter.com/youngyangjuke/statuses/416557324036100096

이미 잘 알려졌다시피, 영양줔 님의 이 드립이 모든 일의 시작이었습니다.

재밌겠다는 생각에 저도 트윗을 남겼었죠.

https://twitter.com/rainygirl_/statuses/416557875192791040

설마 열 명이 모일 거라곤 사실 생각조차 못 했습니다. 열 명이 진짜로 모이고 나니, ‘민영화’ 버튼 하나 그거 뭐 대수겠느냐고 생각했습니다. 어차피 ‘엑스프레스엔진’(XpressEngine, 이하 ‘XE’)으로 사이트 만드는 거 10분이면 끝나는데 간단히 해볼까(잠깐 만들어 공개하면, 짤방으로 만들어져 돌아다니지 않겠나) 정도까지만 생각했습니다.

도메인 3개(ilwar.com, ilwor.com, ilwo.net)를 사고, 의견을 모아 wor 대신 war를 쓰기로 결정했습니다. 2시간 동안 호스팅 서버를 뒤져다 계정을 파고, 10분 남짓 XE를 설치하고, 제목에 ‘일간워스트’라고만 적어 사이트를 오픈했습니다.

https://twitter.com/rainygirl_/statuses/416593530308419584

이땐 민영화 버튼조차 넣지 않았던 때였습니다. 헌데 15분 만에 접속자가 몰리며 호스팅 업체의 CPU 제한을 초과해 호스팅이 정지되었습니다.

https://twitter.com/rainygirl_/statuses/416604178929041410

무료 호스팅을 쓰고 있어서 그런가 보다 하고, 유료 호스팅으로 일단 옮겨보았습니다. 민영화 버튼도 넣고, 일베 로고를 그대로 본딴 로고도 적용하여 28일 오후쯤 다시 XE로 사이트로 개장했습니다.

당신들이 민주화를 공격하겠다면, 우리는 민영화를 공격하겠다

건의 게시판에 게시판 증설 요청이 빗발쳤고, 조금씩 늘려갔습니다.

ilwar_02
XE로 급조한 사이트는 이렇게 생겼었습니다

익명의 그림 장인께서 보내주신 멋진 로고를 새로 적용한 것도 이때였습니다. 이 능력자분의 정체는 (숨어있지 않아도 될) 정권이 들어선 이후에 크레딧에 등장할 것입니다.

귀요미
귀요미

그리고 30일 아침, 파이낸셜뉴스에 첫 기사가 나갔습니다. 그리고 네이버 실시간급상승검색어에 이틀 가까이 올라갔습니다.

네이버 분당 그린팩토리 로비에 하루종일 떠있었겠다(..….)
네이버 분당 그린팩토리 로비에 하루종일 떠 있었겠다(..….)

실시간급상승검색어 트래픽을 얻어오기 위해 언론사들이 220여 건의 엉터리 기사를 쏟아낸 것도 이때였습니다. (관련 기사: 일간워스트 오픈과 실시간 검색어 장사)

과거 국정원 트위터 알바 계정을 옆으로 펼쳐두어 똑같은 트윗을 비교했었던 ‘알바 고로케’ 사이트를 나꼼수 김용민 씨가 트위터에다가 소개하는 바람에 하루 방문자가 백만 명 조금 넘게 찍혔던 일이 있었습니다. 그날, 창의적인 서비스든 훌륭한 기술의 플랫폼이든 그런 거 다 필요 없고, 유명인이 마케팅 한 번만 딱 해주는 게 답이었던 건가 하며 잠시 시무룩했던 기억이 있습니다. 헌데, 순 방문자 백만 명은 진작에 돌파했고, 앞자리까지 계속 바뀌며 동시접속자까지도 폭발하고 있었으니 저로서는 황당할 수밖에 없었습니다. 어플 개발 전문가 ‘남자2호’에게 도움을 요청해 함께 서버를 살펴보기 시작했습니다.

앞서 소개했던 것과 같이, 일간워스트 사이트는 PHP 언어 기반의 XE로 10분 남짓 설치한 게 전부였습니다. 이걸로 그 어마어마한 트래픽을 버티려니 쉽지 않았죠. 유료 호스팅에서도 결국 트래픽 초과로 사이트가 내려갔습니다. 결국, 고민끝에 자체서버로 돌리기로 결심했죠. 그렇게 사이트를 이전했습니다.

트래픽과 서버 부하율을 직접 체크하기 시작했습니다. 서버 이전 첫날, 12월 29일, 생전 보도 못 한 어마어마한 트래픽 양이었지만 뭐 견딜만했습니다. 둘째 날인 12월 30일, 그 트래픽에서 정확히 3배가 늘어났습니다. 실시간 검색어 순위에서 겨우 내려간 이후에도 트래픽은 줄어들기는커녕 더 늘어나기만 했습니다. PHP-fpm엔진엑스(nginx)를 얹어 돌리는 환경이었는데, 다행히도 그나마 서버가 잘 버텨주어서 아, 괜찮겠다 싶었습니다. 서버 부하율은 70에서 80까지 넘어가는데도 뻗지도 않으니 원래 PHP로 짠 대용량 사이트들은 이런 건가 하고 있었습니다.

서버 부하율이 100을 넘어갔습니다. 그때부터 조금씩 XE가 500 에러를 토하기 시작하더군요.

대다수 커뮤니티들은 지금도 PHP로 잘만 운영되고 있습니다. 아마도 저마다의 최적화 설정값을 찾아냈으리라 생각했습니다. 접속자는 폭주하는데 이들을 상대로 최적화 테스트나 하고 있을 수는 없었습니다. 백만 년 만에 들여다보는 PHP 코드에, 무척 구조적으로 체계화된 XE만의 문법이 따로 있었던지라, 이걸로는 기민하게 대응할 자신이 없더군요. 조금씩 일베 사용자들의 욕설 게시물도 올라오기 시작했습니다.

효과적으로 이들을 관리하려면 XE에만 의존하면 안 되겠다고 판단했습니다. 멤캐쉬(memcache)를 버리고 레디스(redis)를 붙여볼까 등등 온갖 생각을 다 해보다, 그거 하면서 PHP 다시 익힐 바에야 새로 만드는 게 낫겠다 싶었습니다.

PHP 언어를 버리기로 이날 결심하였습니다. 개발 언어로 노드제이에스(node.js)를 쓸까 파이썬(python)을 쓸까 고민하다 그냥 빠르게 개발하기 위해 파이썬을 선택했습니다. 프레임워크로 플라스크(flask)를 쓸까 장고(django)를 쓸까 고민하다가, 역시 빠르게 개발하기 위해 제일 익숙했던 장고를 선택했습니다. 동시 접속자가 늘 폭주하는 모 소셜커머스 사이트를 장고로 만들었던 기억도 났었고요. 하루 정도면 만들 수 있겠지 라고 생각하고서, 페이스북 소셜 댓글만 달아놓은 고정 페이지(static html)로 사이트를 잠시 교체했습니다.

d는 묵음입니다
d는 묵음입니다

집단 실명 일밍아웃

페이스북 소셜댓글만 달린 웹 페이지(index.html)로 사이트가 교체되자 예기치 않은 사건들이 쏟아졌습니다. 해당 페이지에 하루 동안 2천여 건 가까운 덧글이 남겨졌습니다. 여기에는 일베 유저들이 본인의 프로필 사진과 실명, 소속 회사나 학교를 걸고서 ‘노무현운지노무현운지’ 나 ‘김대중 죽어라’, ‘전라도 새끼들’ 등의 글을 남긴 것도 포함되어 있었습니다. 페이스북 소셜댓글은 페이스북 계정으로 쓰는 글이니 당연히 실명이 나올 수밖에요. 여기다가 저런 글을 써둔 겁니다.

박ㅁㅁ 씨, 여기서 전체공개로 이러시면(...…)
박ㅁㅁ 씨, 여기서 전체공개로 이러시면(……)

일베 유저였음을 드러내는 글에 ‘오빠 일베였어요?’ ‘너 일베였냐?’ 등 지인들 덧글이 마구 달리자 황급히 글을 지우는 사람들도 나타났습니다. 일베에서는 ‘야후 계정으로 새로 가입하라’ ‘페이스북 계정을 하나 더 만들어라’ 등의 의견교환이 이루어질 정도였습니다. 새로 개설한 계정으로 일간워스트 비난 덧글을 남기는 사용자도 있었지만, 페이스북의 자체 시스템에 따라 점수가 낮게 매겨져 노출 자체가 거의 되지 않았습니다. 전기 방충기에 파닥파닥 타들어 가는 소리가 들린다는 평가도 있더군요. ‘여기가 일베 유저가 셀프 일밍아웃하는 곳이냐’ 는 소문이 퍼져나갔습니다. 의도한 건 전혀 아니었습니다. 그냥 사이트를 잠시 닫는데 커뮤니케이션 툴은 하나 두어야 하지 않을까 하여 코드를 갖다 넣었을 뿐이었습니다. 근데 이런 일이 벌어지더군요.

사이트 재개발

파이썬 기반으로 게시판을 저녁 동안 짰습니다. 게시판 만들기는 웹프로그래밍 서적들도 기본 중의 기본 예제로 다룰 만큼 간단한 개발입니다. 그걸 하루나 걸린 건 사실 제가 좀 밍기적거렸던 것도 있습니다. 모델은 어떻게 짤까. 대댓글 구조는 어떻게 만들까 등등…… 그러다 별 고민 없이 일단 나중에 뜯어고치기 쉽게만 해놓고 오픈하기로 했죠. XE 쓸 적 이미지, 스타일시트(CSS), 자바스크립트(JS) 등의 구성 요소(static resources)들이 수도 없이 갱신되며 쏟아졌던 기억이 있어 웹페이지(html)든 뭐든 모조리 압축(minify)하고 만료 시간(expires)을 걸어 캐쉬가 적용되도록 했습니다. 모바일 마크업을 따로 구성했다간 나중에 운영하며 고칠 때마다 감당이 되지 않을 것 같아, 그냥 최소한의 마크업으로 짜두고 미디어 쿼리(media query)로 모바일/피씨 가 분기되도록 했습니다. 이건 타협이었죠. 그렇게 준비한 뒤 다음날 아침 재개장하기로 했습니다.

minify는 소스보기 열여본 사람들을 멘붕에 빠트리려는게 아닙니다
minify는 소스 보기 열여본 사람들을 멘붕에 빠트리려는 게 아닙니다

트롤밭의 탄생

오전에 사이트를 오픈하기 직전, 그때부터 고민이 생겨나더군요. 종전의 XE 기반에서도 나타났었던 일베 유저들의 분탕질(도배, 악성댓글 등)을 어떻게 효과적으로 관리해야 할까 하는 문제였습니다. 금칙어를 정해봤자 우회하면 그만이고(예: 노고무현운지!->노고무현운ㅈ1), 도배 유저의 아이디를 막아봤자 또 가입하면 그만이고, 이메일 인증도 이메일 여러 개 발급이나 임시이메일 발급서비스도 있으니 무의미하고, 캡챠(CAPTCHA) 또한 거의 뚫렸다시피 했으니 소용없고……. 그러다가 고민이 귀찮아져서, 그래 그러면 고민할 거 없이, ‘막지 말고 다만 가려버리자!’고 결심했습니다. 일베 유저에게는 게시판을 도배한 것으로 보이지만, 본래 회원들에게는 보이지 않는 것이죠. 괜히 접속을 막아 저항심만 키우는 부작용도 없을 터이니 이게 좋겠다고 생각했습니다. 그다음부터는 ‘어떻게 분류해 가릴 것인가?’ 를 고민하기 시작했습니다.

1. 우선 금칙어로 걸러내기로 했습니다

일베에서 주로 쓰는 표현들, ‘노고무현’(고 노무현 대통령을 지칭), ‘운지’(운지천에서 유래된, 자살을 의미하는 단어로 고 노무현 대통령을 지칭), ‘오유에서왔습니다’(오늘의유머 사이트 회원을 사칭하며 불쾌감을 유발하는 게시물을 등록할 때 쓰는 표현), 그리고 각종 욕설들, 가령 ‘씨발, 씹년, 지랄, 개새끼, 김치년’ 등을 금칙어로 걸어두기로 했습니다.

2. 레퍼러도 체크하기로 했습니다

다시 말해서, 일베 사이트에서 링크를 타고 들어오는 경우, 일베 유저로 자동 판독하도록 하였습니다. 일반인들이 일베를 들어가지는 않을 것이고, 보통 일베 유저가 타 사이트로 퍼져나가는 식의 패턴이 보였으니까요. 이 조치 때문에 “일베는 ilwar.com”이라는 문자열(String)을 금칙어로 지정했습니다. 레퍼러가 찍히지 않는 직접 타이핑 접속 등을 유도한 것으로 판단합니다. 어찌 되었든 일간워스트 사이트를 의식한 일베 운영진 측의 조치가 있었던 것이고요.

3. 누적 평가를 적용하기로 했습니다

사람이 살다가 나도 모르게 욕설이 튀어나올 때가 있죠. 한두 번 욕설을 쓴다면 그럴 수 있겠다 치지만, 모든 글에 욕설이 담겨있다면 그건 일베였든 일베가 아니든 커뮤니티에서 배제하는 게 맞기에, 욕설 사용 빈도수가 누적되면 그냥 걸러내도록 했습니다. 한두 번 정도는 봐주고 말이죠.

4. 그리고 사용자의 도움을 받기로 했습니다

그래도 자동 분류를 뚫고 트롤들이 들어오면 어쩌지? 라는 고민을 잠시 하다, 그럼 회원들이 걸러내면 되지. 라고 생각하고 고민을 멈춰버렸습니다. 회원들이 직접 적발해내는 투표시스템에 맡겨버리기로 한 것이죠. 일간워스트에 있는 ‘민영화’ 버튼의 누적 투표량이 20 이상이 넘어갈 경우 ‘트롤’로 분류되도록 했습니다. 오류가 어느 정도 있을수도 있지만 트롤로 분류된 글의 주요 단어를 예비금칙어로 조금씩 담아두어 스스로 학습도록 했습니다.

사실 깊이 고민한 건 아니었습니다. ‘커뮤니티에 해를 입히는 ‘트롤’ 들을 어떻게 효과적으로 막을까?’ 라는 고민을 하다가 ‘못 막을 테니 그냥 분류만 하고 가리자’고 결정한 뒤, ‘어떻게 분류할까?’ 를 고민한 게 전부였습니다. 그 시스템까지 준비한 뒤 사이트를 열었습니다. 그리고 마침……

https://twitter.com/unheim/statuses/417908415579426816

루비 집사님께서도 관심을 보여주셨고, 당연히 일베 유저들의 도배가 시작되었습니다. 그 결과는 이러했습니다.

ilwar_08
흐릿한 제목은 일베 유저로 분류된 글. 일반 유저에게는 보이지 않지만, 일베 유저들끼리는 게시판을 장악한 것으로 보임.

거의 다 잡히더군요. 만일 잡히지 않은 경우에도 회원분들께서 직접 방제해주셨습니다. 이 광경을 보며 조금은 안심하게 되었습니다.

방제 현장
방제 현장

이미지 도배

텍스트 위주로 방충망이 작동하자, 이번에는 ‘노알라’ (노무현 대통령 사진과 코알라를 합성한 비하성 이미지), ‘김대중 대통령 관’ (김대중대통령 서거 후 장례중 공개된 관) 이미지들이 무더기로 올라오기 시작했습니다. 처음에는 일베닷컴(ilbe.com)이라는 도메인 아래에 올라온 첨부 파일들이 올라오고, 이후에는 타 도메인에 있는 ‘노알라’ 사진이 올라오더군요. 이 사진들 또한 탐지되어 걸러지기 시작했고, 미처 걸러내지 못한 사진들은 회원들이 투표로 걸러내었습니다. 그 와중에 희한한 사례가 하나 보이더군요. 브라우저가 느려지게끔, 일부러 이미지 높이(height)를 몇 억 픽셀로 적어둔 것입니다.

“height:800000000000000px”
“height:800000000000000px”

이 사례는 저에게 또 다른 경고를 준 것이기도 했습니다. 본래 일간워스트에서 제공하는 위지윅 에디터에는 자동으로 HTML5 문법에 맞지 않는 태그나 불필요한 속성(Attribute)을 제거하는 기능이 있었습니다. 이미지 또한 폭(width), 높이(height) 속성을 그냥 제거토록 엄격하게 설정되어 있었는데요, 이걸 뚫고 높이(height)를 설정한 코드가 들어왔다는 건 자바스크립트 바깥 영역에서 무언가를 작동시켰다는 이야기였습니다. 다시 말해 브라우저나 위지윅 에디터를 거치지 않고, 보낸(submit) 거죠. 프로그래밍할 줄 아는 놈이 움직이거나, 프로그램을 가동하고 있다는 이야기였습니다.

자동 글도배 프로그램 등장

자동 가입/자동 글도배 프로그램은 웹페이지의 폼(form) 구성요소를 자동으로 탐지하여 가입, 글쓰기 등을 진행하는 프로그램입니다. 수많은 블로그에 광고 덧글이 달리는 건 다 이들 때문이지요. 과거에는 포르노사이트 광고가 쏟아졌고, 최근에는 바카라 등의 도박사이트 광고가 돌아다닙니다. 광고문자발송 업체들과 함께 이들 프로그램을 운영하는 업체들도 지하경제의 선두주자라 할 수 있죠. 어쨌든, 이들이 쓰는 자동 글도배 프로그램이 있습니다.

이 프로그램은 보통 널리 알려진 콘텐츠 관리 시스템(CMS, Contents Management Systme)의 폼 구성요소에 의존합니다. 티스토리(테터툴즈), 다음 블로그, 과거 제로보드4나 요즘의 워드프레스 등의 마크업 형식을 모두 기억하고 도배를 진행합니다. 일간워스트의 게시판은 제가 직접 짠 것이기 때문에 문서 객체 모델(DOM, Document Object Model) 구조도, 폼의 구성요소도 다 다릅니다. 장고 미들웨어를 그대로 가져다 썼으니 크로스 사이트 요청 위조(CSRF) 방지 정도는 기본으로 생성되고요. 여기에 맞추어 자동가입/자동글쓰기 프로그램을 가동하려면 몇 가지 손을 봐야 합니다.

간헐적으로 ‘테스트’라는 제목의 글이 올라오더군요. 아마도 자동 글도배 프로그램이 곧 가동되겠구나 싶었습니다. 기술적으로야 팬텀제이에스(Phantom.js)와 같은 웹킷 기반 API들도 있기 때문에 얼마든지 이를 뛰어넘을 수도 있지만, 실제로 실행으로 옮기기엔 여간 까다로운게 아닐테니 일베의 정서를 공유하는 집단이라면 귀찮아서 안 할거라 생각했습니다. 근데 생각보다 전투적이더군요. 코드가 들어올때부터 알아봐야 했습니다. 실제로 자동 가입/자동 글도배 프로그램 가동을 실천한 일베 유저가 나타났습니다.

자동가입/자동글도배 프로그램 가동을 실천한 일베 유저
자동 가입/자동 글도배 프로그램 가동을 실천한 일베 유저

스크린샷에서 보이는 바와 같이 1000001 1000002 등의 이름으로 아이디를 만든 뒤, 제한이 걸릴 때마다 새로 아이디를 만들어 글을 쓰는 식이었습니다. 물론 이들의 도배는 사용자별 글쓰기 쿼터 제한에 걸려 멈추었죠. 그러자 900001 900002 등의 이름으로 또다시 도배가 시작되었습니다. 그렇지만 이들 도배글 모두 기계가 자동으로 작성했다는 태생적 한계때문에 간단한 패턴 체크로 모두 필터링이 가능했습니다.

서버가동 방해 공격

그날 오후 서버에서 이상한 에러 로그가 날아왔습니다. HTTP 요청 방식(request method)이 GET, POST, PUT와 같은 표준이 아니라 엉뚱한 게 들어왔다는 것이죠. 이 경우를 처리하는 항목은 만들어두지 않았기에 급히 추가해 적용해두고서, 유입되는 로그를 확인해보았습니다.

공격 여부를 확인하기 위해 유입로그 확인
공격 여부를 확인하기 위해 유입 로그 확인

공격성 접속이 분명해 보였습니다. 웹서버로 “GET / HTTP/1.1″이 아닌 엉뚱한 문자열을 쏘아댄 것이죠. 서버 타임아웃(timeout)이 무척 짧았기 때문에 별 영향은 없었지만, 문제는 지속해서 쏘아댄다는 데 대한 찝찝함이었습니다. 여름에 자는데 모기가 계속 웽웽거리고, 그거 잡고 싶은데 불켜서 보면 보이지도 않고, 에프킬라는 안보여서 그냥 홈매트만 켜놓고 자는데 계속 또 귓가에 웽웽거려 짜증 났던 기억 다들 한 번씩은 있을 겁니다. 서버 상태 확인을 위해 여러 지표들을 확인하는데 트래픽 쪽에 계속 얘들이 거머리처럼 붙어있더군요.

왼쪽 미미한 수치가 평소 트래픽이라면, 오른쪽 인위적으로 튀는 트래픽이 공격 트래픽
왼쪽 미미한 수치가 평소 트래픽이라면, 오른쪽 인위적으로 튀는 트래픽이 공격 트래픽

일단 형사고발을 위해 로그부터 뽑아 저장했습니다.

형사고발을 위해 로그부터 뽑아 저장
형사고발을 위해 로그부터 뽑아 저장

두 개의 IP더군요. 마침 사이트를 마비시키겠다는 글이 올라와 있던 것도 확인했습니다.

  • 예고글 1 : http://ilwar.com/humor/12636 (로그인해야 보입니다)
  • 예고글 2 : http://ilwar.com/humor/12663 (로그인해야 보입니다)
  • 예고글 3 : http://ilwar.com/humor/12671 (로그인해야 보입니다)

이들 글의 IP와 공격지 IP는 같았습니다.

HTTP 요청 방식이 이상한 거라면 그냥 무시토록 해두었더니 별 영향은 없었습니다. TCP, 신 플루딩(SYN Flooding) 공격은 진작에 자체 방화벽에서 차단되었죠. 물론 계속 들어오는 트래픽이 좀 짜증이 났습니다. 그래서 간단히 해당 IP들에 대해 네트워크 인터페이스상에서 무응답 처리토록 했습니다. 공격지에서 ‘서버를 다운시키는 데 성공했다’ 라고 판단했는지 트래픽 보내기를 멈추더군요. 디도스(DDOS)라고 하기도 민망한 이들 서버가동 방해 공격도 이렇게 막을 내렸습니다.

덧글 임베드(embed) 코드 삽입

한편 게시판에서는 글이 아닌 덧글을 활용한 공격도 이어졌습니다. ‘노알라’ 사진에 이어, 노무현 전 대통령이나 김대중 전 대통령을 토막 내는 플래시(Flash) 화면, 또는 노무현 대통령을 비하하거나 매일 일베에 들어간다는 노래를 담은 유튜브 등이 올라오기 시작했죠. 그 이후에는 유튜브가 아닌 타 도메인의 자동재생 음악 플래시 파일(swf)이 올라왔습니다. 그것도, 일반 회원인 것처럼 ‘좋은 글 감사합니다’ 라는 메시지 뒤에 숨은 코드를 삽입하는 방식이었죠. 이런 식으로 말입니다.

저도 좋은 정보 감사합니다. embed width=”0″ 이라니(......)
저도 좋은 정보 감사합니다. embed width=”0″ 이라니(……)

진중권 교수가 재밌다고 트윗에 링크 걸어둔 글마다 이런 숨은 자동재생 음악 코드를 일베유저들이 심어두기 시작했습니다. 링크를 타고 글을 열면 난데없이 ‘나는 오늘도 일베를 한다~’ 등의 노래가 나오는 식이었죠. 글쓰기에는 필터링을 걸었지만, 글 수정에는 필터링을 미처 걸지 않아두었던 것을 찾아내어, 글쓰기 때만 평문으로 작성하고 수정 시 코드를 넣는 어뷰징 유저도 있더군요. 글 수정에서도 단어를 분류해 일베유저임을 판독도록 고쳤습니다.

주소(URL) 탐지를 회피하기 위해 302 리다이렉트(redirect)를 제공하는 단축 URL서비스를 활용하여, 단축 URL로 임베드(embed) 코드를 삽입하는 사례도 발견되었습니다.

네 이놈 다 알고 있다! 모를줄 알았더냐!!
네 이놈 다 알고 있다! 모를 줄 알았더냐!!

잔머리 잘 쓰는구나 싶었습니다.

한편 코드를 보니 소문자 임베드(embed)만 막는 것을 알고 대소문자를 섞어서 등록을 시도하는 것도 보였습니다. EmBeD라니! 귀여웠지만 어쨌든 이건 제가 꼼꼼히 체크하지 못한 부분이었죠. 대소문자 모두 인식하여, 문제가 되는 자동재생 음악 작성자는 모두 일베 유저로 분류토록 고쳤습니다. 이쯤 되니, 이들이 사이트 디버깅을 알아서 해주는 것만 같아 짝프로그래밍하는 기분도 들었습니다.

삽질 1: 아파치 설정 맞추기

엔진엑스를 쓸까 잠시 고민했지만 당장은 익숙한  아파치2(Apache2)mod_wsgi를 쓰기로 했습니다. 아파치 설정은 너무나도 오랜만에 해보는 거라 맥스클라이언트(maxclient)니 민스페어서버즈(minspareservers)니 프로세스(process), 스레드(thread) 니 하는 설정은 생소하더군요. 멍청하게도 이들 숫자를 무척이나 작게 설정해두었더니 어느새 사이트가 느리다는 피드백이 쏟아졌습니다. 왕창 늘렸더니 서버가 무척 빨라지더군요. 헌데 갑자기 서버 부하율이 치솟을때가 있었습니다. 엔진엑스와 PHP-fpm으로 돌릴 때처럼 부하율이 높아져도 괜찮나 보다 싶었는데 서버 부하율이 또 100을 넘어갔고, 서버가 응답을 멈출 때가 있더군요.

ilwar_17

프로세스(process) 곱하기 스레드(thread) 값이 맥스클라이언트(maxclient) 값보다 작아야 한다는 걸 사실 그때야 알았습니다. 제가 야매 개발자인데다 아파치설정은 백만 년 만에 해보는 것이었고, 대규모 트래픽 수용은 경험이 없어서(…) 가장 최적화된 설정값을 입력하고 나니 그제서야 수만 여건 동시접속을 잘 처리하더군요. 몬스터를 만나보고 나서야 스킬을 익히는 건 좋은 건 아니지만 어쨌든 덕분에 많이 익혔습니다.

삽질 2: 옛날 설정파일은 지웁시다

그러다 문제는 다른 곳에서 또 터졌습니다.

OperationalError: (2006, ‘MySQL server has gone away’)

서버 장애가 줄어들자 동시접속자가 급증하였고, 때문에 DB서버 이용량도 덩달아 급증한 거죠. /etc/my.cnf 파일의 최대 연결(max_connection) 값을 열심히 늘렸지만, 소용이 없었습니다. 그러다. 서버에 my.cnf 파일이 두 개나 있는 것을 발견했습니다. /etc/my.cnf, /etc/mysql/my.cnf 두 개가 있더군요(!!!) 아마 옛날 MySQL을 쓰다 MariaDB로 새로 깔면서 예전 파일이 남았던 모양입니다. 저는 옛날 설정파일만 죽어라 수정하고 있었던 것이었죠. 새 파일에서 설정값을 다시 넣어두니 더는 에러가 없었습니다.

드디어 완성

일베의 모든 공격이 수포로 돌아갔고, 접속자 폭주를 감당할 수 있는 서버 환경도 갖추어졌습니다. 이렇게 [일간워스트]라는 신생 커뮤니티가 삐거덕거리지 않고 정상 가동하기 시작했습니다. 일베 게시판에는 직전에 본인들이 저질렀던 서비스 방해 행위 (도배, 코드삽입, 디도스 공격 등)에 대해 형사처벌이 정말 가능한지에 대한 문의 글이 올라오더군요, 경우에 따라선 운영자에 대한 분노를 쏟아내는 글도 올라왔고요. 어찌 된 영문인지 이들 게시물은 현재 모두 삭제되었습니다. 요즘 여러 송사에 휘말리는 사이트이니 그럴 만도 하겠다 싶었습니다.

간간이 최근에도 도배나 합성짤 등록을 시도하는 일베 유저들이 종종 발견됩니다. 절반 넘는 비율로 자동으로 걸러지며, 나머지는 회원들이 적발해내고 있습니다.

일워 회원들의 자율적 자정 작용
일워 회원들의 자율적 자정 작용

회원들이 감당할 수 있는 정도의 적발 부담이었기에 나름 재미있는 문화도 생겨나더군요. 도대체 이런 훌륭한 짤방은 어디서 찾아낸 걸까 신기했습니다.

방제 현장 http://ilwar.com/humor/4879
방제 현장

많은 응원 부탁합니다

일간워스트 라는 사이트를 만들게 된 것은 맨 처음 언급했다시피 무척이나 간단한 동기였습니다. 계획도 구상도 아무것도 없이, 단지 개드립의 가벼운 실현으로 10분 남짓 XE를 설치하며 시작했다가 몇백만 명이 매일 들어오는 사이트가 갑자기 탄생해버렸습니다. 급작스런 유명세와 급작스런 접속자 폭주는 아마도 네이버 실시간검색어에 이틀 가까이 올라있었던 것이 가장 큰 이유였을 것이고, 그다음으로는 아마도 ‘일베에 대항한다’ 라는 포지션 때문에 자극적인 대결 부추기기 기사들이 언론사들로부터 마구 쏟아졌던 덕택이 아니었을까 싶습니다. (관련 기사)

솔직히, 충격 고로케를 통해 언론사들의 낚시성 기사제목 달기와 실시간검색어 지향 반복 송고행태를 보여주려 했던 게 딱 작년 이맘때쯤이었는데(당시 슬로우뉴스 인터뷰), 정확히 1년 지나 이들 언론사들이 그 종전의 어뷰징 행태들을 충실히 이행하며 [일간워스트]라는 거대한 커뮤니티 탄생을 한마음으로 도와버렸으니 저로서는 무척이나 아이러니합니다.

일베 잡는  비옥한 논두렁에 오신 것을 환영합니다.  ilwar.com
일베 잡는 [일간워스트] 비옥한 논두렁에 오신 것을 환영합니다.
ilwar.com
3~4일 남짓 들어오는 서비스방해공격 들을 다 막아놓고 나서 둘러보니 사이트의 회원들은 이미 사이트의 컨셉도 잡고, 어투도 만들고, 저마다의 위로와 격려를 나누고, 여러 모에화 작품을 만들고 있더군요. 어느새 사이트는 농촌 컨셉이 되어있었고, 모두 서로를 농민으로 부르며, 모든 게시판은 밭이 되었고, 글은 심는 게 되었으며, 새글은 새싹으로, 베스트글은 오늘의 풍작이 되어버렸습니다. 정치사회 게시판은 무척이나 진지한 토론이 오가지만 다른 게시판은 너무나도 다정다감한 분위기였고요. 남친이 일베임을 알아 어찌할 줄 모른다는 여성분의 일워 글을 일베 남친이 읽고서 다툼이 나 결국 헤어졌다는 사건 글도 계속 올라오는 중입니다. 꽤 많은 일베 유저들이 일간워스트 게시판을 눈팅하며 영향을 받고 있는 게 아닐까 싶습니다.

여하튼, 예정에 없이 갑자기 제가 돌보아야 할 서비스가 하나 새로 생겨버린 건데, 줄지 않고 더 늘어나기만 하는 트래픽을 보며, 결국 이게 운명이겠거니 하는 마음으로 조금씩 가꾸어볼까 합니다. 당분간은 회원들(농민들) 의견을 들을 것이고요. 운영이 점차 안정화되면 새로운 기회도 만들어보고, 다른 많은 스타트업 서비스나 여러 단체와도 엮어보고 할 생각입니다. 물론 제가 이전에 만들었던 서비스들도 다시 고쳐볼 생각입니다. 사는 게 원래 그렇죠 뭐. 여하튼, 마음에 들어 하는 분들, 좋아하는 분들이 이토록 많아 저도 기쁩니다. 앞으로도 많은 응원 부탁하겠습니다.

[divide style=”2″]

이 글은 필자의 블로그인 레이니걸닷컴(rainygirl.com)에도 실렸습니다. 글의 표제와 본문은 슬로우뉴스 편집원칙에 따라 일부 수정, 보충하였습니다. (편집자)

관련 글

17 댓글

  1. 높은 트레픽 서비스를 개발 할 때, 문제점 등에 대해서도 매우 참고할 만한 훌륭한 경험 글이네요.
    쥔장님 정말 짧은 시간에 고생도 많이 하셨네요.
    대단합니다.. 굿좝~~

  2. 통쾌한 일워 개발기닭. 프로그래밍 전문용어 하나도 모른다까기만, 개발자님의 일워사이트 단기속성 ㅇㅂ벌레 퇴치법과 농부님들의 해충 퇴치법을 보니 일워에 절로 가입하고 싶어진다농

  3. 솔직히 일간워스트가 일간베스트 따라했다는점에서 정치나 사람들 하는것 보다도
    특정 게시판을 따라했다는것때문에 정이 딱히 안감…

  4. 우덜식 민주주의인가요? 자유공간인 인터넷에서 특정사이트의 리퍼러를 차단 한다는게 이해할 수 없네.. 단지 생각이 달라서?? 허허허.. 쓰레기 집단이라는 말은 비단 일베뿐 아니라 오유나 여시나 매 마찬가지지.. 일베에 편승해서 뭔가 얻을려고 개지랄하는 것으로 밖에 안보임. 독재농부 일워

  5. 자유공간인 인터넷에서 운영자가 회원들의 동의하에 특정사이트의 리퍼러를 차단하는 게 이상한가? 자유공간이니까 야짤이고 혐짤이고 막 올려도 된다 할 사람일세. 운영자 입장에서 적대적인 사용자들을 차단하고 우호적인 사용자를 배려하는 건 매우 훌륭한 자세라고 생각하는데.

  6. ㅋㅋㅋㅋㅋㅋ자유드립 웃기네 ㅋㅋㅋㅋㅋㅋㅋㅋ
    자유공간이니까 이사람저사람 다욕하고 다녀도 되겠네요!

  7. 박정희 사진 합성해서 유포시키나요? 박정박정하박~
    이런식으로 장난치나요? 박정희 죽은장소로 인증하나요?
    노무현이든 박정희든 비하하면 분명 욕먹을텐데요?ㅋㅋㅋㅋ
    이중성이 아니라 그쪽만 다른시각으로 보시는듯

댓글이 닫혔습니다.