[실전 커뮤니티 10] 유령 표를 막아라

지난 편에서 스팸과 어뷰징 방어를 다루며 계속 등장한 위협이 있었다. 한 사람이 여러 계정을 만들어 여럿인 척하는 것이다. 이 유령 계정은 표를 조작하고 여론을 왜곡하며 커뮤니티의 근간인 신뢰를 무너뜨린다. 이번 편은 중복 계정과 여론 조작을 어떻게 탐지하고 막았는지에 대한 기록이다.


1. 한 명이 여럿인 척할 때

커뮤니티는 한 사람 한 목소리를 전제로 굴러간다. 추천도, 신고도, 투표도 모두 사람 수를 센다는 가정 위에 있다. 그런데 한 사람이 계정 열 개를 만들면 이 전제가 통째로 무너진다. 혼자서 열 개의 추천을 만들고, 열 번의 신고를 하고, 열 표를 던진다. 다수의 뜻처럼 보이는 것이 사실은 한 사람의 조작일 수 있는 것이다. 이 유령 계정을 업계에서는 흔히 다중 인격 계정이라 부른다.


이게 무서운 이유는 눈에 안 보이기 때문이다. 스팸은 노골적이라 티가 나지만, 잘 만든 유령 계정은 진짜 사람과 구분되지 않는다. 각자 그럴듯한 닉네임과 활동 이력을 갖고 있어, 겉만 봐서는 서로 다른 사람 같다. 이들이 조용히 특정 글을 띄우거나 특정 사람을 공격하면, 커뮤니티는 그것을 진짜 여론으로 오해한다. 조작된 다수가 진짜 소수를 짓밟는 것이다.


유령 계정의 피해는 신뢰의 붕괴로 이어진다. 사용자들이 추천 수를 못 믿고, 인기 글을 조작된 것으로 의심하고, 다수의 의견을 가짜로 여기기 시작하면 커뮤니티의 모든 신호가 무의미해진다. 앞선 편들에서 공들여 세운 표와 정렬과 신고가, 유령 계정 하나로 전부 무력화될 수 있었다. 그래서 이 방어는 커뮤니티의 존립과 직결됐다.


다만 나는 이 문제에 완벽한 해결이 없다는 것도 처음부터 인정했다. 마음먹고 계정을 여러 개 만드는 사람을 백 퍼센트 막을 방법은 없다. 목표는 근절이 아니라, 조작의 비용을 충분히 높여 수지가 안 맞게 만드는 것이었다. 조작이 너무 번거롭고 금방 들통나면, 대부분은 시도하지 않는다. 방어는 완벽이 아니라 억지력의 문제였다.


2. 유령의 흔적을 읽다

유령 계정은 아무리 위장해도 흔적을 남긴다. 왜냐하면 결국 한 사람이 조종하기 때문이다. 나는 그 공통의 뿌리를 찾는 데 집중했다. 여러 계정이 같은 환경에서 접속하거나, 늘 같은 글에만 함께 나타나거나, 활동 시간대가 이상하게 겹치는 패턴은 한 사람이 뒤에 있다는 신호였다. 개념적으로는 겉으로 다른 계정들이 공유하는 은밀한 공통점을 묶어 하나의 배후를 추정하는 것이었다.


가장 강력한 신호는 함께 움직이는 패턴이었다. 진짜 사람들은 관심사가 제각각이라 활동이 흩어진다. 그런데 유령 계정들은 늘 같은 글에 몰려가 같은 편을 든다. 어떤 글이 올라오면 몇 분 안에 같은 계정들이 나타나 추천을 몰아주고, 반대 의견에는 함께 비추천을 던진다. 이 부자연스러운 동행이 유령 계정의 가장 뚜렷한 지문이었다. 나는 표를 개별로 기록해뒀기에 이 동행 패턴을 추적할 수 있었다.


문체도 단서가 됐다. 어떤 커뮤니티는 계정들의 글쓰기 습관, 즉 자주 쓰는 표현이나 문장 부호 버릇을 분석해 같은 사람이 쓴 계정들을 묶어낸다. 아무리 다른 사람인 척해도 글버릇은 잘 안 바뀌기 때문이다. 나는 그 정도로 정교한 분석까지는 아니어도, 명백히 같은 말투와 같은 주장이 여러 계정에서 반복되면 의심 신호로 삼았다.


이 신호들은 하나만으로는 증거가 되지 못했다. 같은 환경 접속은 가족이나 같은 사무실일 수도 있고, 비슷한 시간대 활동은 우연일 수도 있다. 그래서 나는 여러 신호가 겹칠 때만 의심의 강도를 높였다. 하나의 신호는 우연, 둘은 의심, 셋 이상은 조사. 이렇게 신호를 누적해 판단하니 억울한 오해를 줄이면서도 진짜 유령을 잡아낼 수 있었다.


3. 문턱을 높이는 방어

탐지가 사후 대응이라면, 예방은 계정을 만드는 문턱 자체를 높이는 것이었다. 계정 생성이 너무 쉬우면 유령 계정도 쉽게 양산된다. 그래서 나는 계정 하나를 만드는 데 최소한의 검증을 요구했다. 이메일 인증 같은 절차 하나만 있어도, 계정 열 개를 만들려면 이메일 열 개가 필요해져 조작의 비용이 훌쩍 올라간다. 작은 문턱이 대량 생성을 크게 억제했다.


다만 여기서도 개방과의 균형이 문제였다. 가입 문턱이 너무 높으면 진짜 신규 사용자가 가입을 포기한다. 첫 편에서 강조한 잔존의 관점에서, 가입 단계의 마찰은 소중한 신규 유입을 잃게 한다. 그래서 나는 문턱을 유령 계정에게는 부담이 되지만 진짜 사용자에게는 견딜 만한 수준으로 세밀하게 맞췄다. 한 번의 인증은 참을 수 있어도 열 번은 번거롭게, 이 비대칭이 핵심이었다.


또 하나의 방어는 계정의 나이와 활동을 신뢰의 근거로 삼는 것이었다. 갓 만든 계정에는 신뢰를 적게 주고, 오래 성실히 활동한 계정에는 신뢰를 많이 줬다. 이러면 유령 계정을 급조해 당장 조작에 쓰기 어려워진다. 신뢰를 쌓는 데 시간이 걸리게 만들면, 즉석에서 만든 계정 부대는 힘을 쓰지 못한다. 시간이라는 비용을 조작에 부과한 것이다.


이 방어들의 공통점은 조작의 경제성을 무너뜨린다는 것이었다. 유령 계정을 만드는 것도, 신뢰를 쌓는 것도, 들키지 않게 조종하는 것도 전부 품이 들게 만들었다. 조작으로 얻는 이득보다 조작에 드는 비용이 커지는 순간, 대부분의 조작 시도는 사라졌다. 방어의 목표는 이 손익 계산을 조작자에게 불리하게 뒤집는 것이었다.


4. 표의 무게를 다시 생각하다

유령 계정 문제는 나로 하여금 표의 의미를 다시 생각하게 했다. 모든 표를 똑같이 한 표로 세는 것이 과연 공정한가. 갓 만든 계정의 표와 오래 활동한 계정의 표가 같은 무게여야 하는가. 나는 여기서 앞선 정렬 편의 통찰을 다시 꺼냈다. 표의 절대 수가 아니라 표의 신뢰도로 판단하면, 유령 계정의 몰표가 힘을 잃는다.


구체적으로 나는 순위 계산에 신뢰의 개념을 녹였다. 신뢰도 낮은 신생 계정들이 몰아준 표는 순위에 덜 반영되게 하고, 다양한 신뢰 계정에서 고루 온 표는 강하게 반영되게 했다. 개념적으로는 표를 던진 주체의 신뢰도에 따라 표의 실효 무게를 달리하는 방식이었다. 이러면 유령 계정 열 개의 몰표보다 진짜 사용자 다섯의 표가 더 무거워진다.


이 접근은 탐지의 부담도 덜어줬다. 유령 계정을 하나하나 찾아내 처벌하지 않아도, 애초에 그들의 표가 힘을 못 쓰면 조작의 의미가 사라진다. 잡아내는 방어와 무력화하는 방어는 다르다. 후자는 완벽한 탐지가 없어도 작동한다. 나는 잡는 것과 동시에, 잡히지 않아도 소용없게 만드는 이중 전략을 폈다.


물론 신뢰도로 표를 차등하는 것에도 위험은 있었다. 신규 사용자의 목소리가 부당하게 묻힐 수 있기 때문이다. 그래서 나는 이 차등을 극단으로 밀지 않고, 조작을 억제할 만큼만 적용했다. 신규 사용자도 성실히 활동하면 금세 신뢰를 얻어 온전한 목소리를 갖게 했다. 방어가 새 사람의 입을 막는 도구가 되지 않도록 늘 경계했다.


5. 신뢰가 최후의 방어선이다

유령 계정과 싸우며 나는 역설적인 결론에 도달했다. 기술적 방어는 필요하지만, 최후의 방어선은 결국 커뮤니티 자체의 건강함이라는 것이다. 사용자들이 서로를 알아보고, 조작을 이상하게 여기고, 부자연스러운 여론에 의문을 제기하는 문화가 있으면, 유령 계정은 아무리 표를 몰아줘도 결국 들통난다. 사람의 눈이 어떤 알고리즘보다 예리했다.


그래서 나는 방어를 시스템에만 맡기지 않고, 커뮤니티가 스스로 이상을 감지하게 만들려 했다. 조작이 의심되는 상황을 사용자들이 신고할 수 있게 하고, 그 신고를 진지하게 처리했다. 시스템의 탐지와 사람의 감시가 겹칠 때, 방어는 가장 튼튼했다. 앞선 신고 편의 협업 구조가 여기서도 그대로 힘을 발휘했다.


돌아보면 유령 계정 방어의 본질은 신뢰를 지키는 일이었다. 표가 진짜라는 신뢰, 여론이 조작되지 않았다는 신뢰, 여기 있는 사람들이 진짜 사람이라는 신뢰. 이 신뢰가 살아 있는 한 커뮤니티는 조작을 견뎌냈고, 이 신뢰가 무너지면 어떤 기능도 의미를 잃었다. 방어의 궁극적 대상은 계정이 아니라 신뢰 그 자체였다.


지금까지 커뮤니티를 위협으로부터 지키는 이야기를 했다. 이제 다시 밝은 쪽으로 돌아가, 사람들의 참여를 끌어내는 기능을 다룬다. 다음 편에서는 토론과 투표 같은 참여 장치를 어떻게 설계했는지, 단순한 글과 댓글을 넘어 사람들이 함께 결정하고 겨루게 만드는 기능들을 이야기하겠다.