무슨 일이 있었나
이 사이트의 테스트는 모두 순위표로 끝납니다. 한 판을 마치고 닉네임을 적으면 점수가 그 자리에 남고, 다음 사람이 그것을 봅니다. 회원가입은 어떤 기능에서도 요구하지 않는 것이 본 사이트의 원칙이라, 순위표도 이름 하나면 등록됩니다.
그 말은 닉네임 칸이 한 사람이 적은 글자를 나머지 모두가 보게 되는 유일한 입구라는 뜻이기도 합니다. 2026년 8월, 누군가 그 칸에 남의 어머니를 두고 하는 욕설을 적어 올렸습니다. 반응속도 순위표에 그대로 올라와 있었고, 사람이 눈으로 보고 나서야 발견했습니다.
그때까지 쓰던 필터는 금지어 열한 개를 적어 두고 닉네임에 그 글자가 그대로 들어 있는지만 보는 검사였으며, 두 군데에서 뚫렸습니다.
- 목록에 없는 낱말: 그 욕설을 이루는 낱말이 열한 개 안에 없었습니다.
- 띄어쓰기: 제출된 닉네임은 낱말 사이에 공백이 하나 들어 있었습니다. 글자를 그대로 맞춰 보는 검사라 공백 하나에 낱말이 갈라졌고, 목록에 있었더라도 걸리지 않았을 상태였습니다.
두 번째가 더 중요합니다. 금지어를 열한 개 더 넣어도 막지 못했다는 뜻이기 때문입니다. 띄어쓰기 하나, 마침표 하나, 늘려 쓴 글자 하나면 목록이 아무리 길어도 옆으로 지나갑니다.
목록은 문제의 작은 일부분일 뿐입니다
새 필터는 닉네임을 검사하기 전에 문자열을 정리하는 과정(접기)을 거칩니다. 의미가 없는 요소들을 먼저 제거하거나 표준화합니다.
- 글자 모양 통일: 폭이 넓은 전각 문자로 적은 글자를 일반 글자로 되돌립니다.
- 대소문자 통일: 영문은 전부 소문자로 바꿉니다.
- 글자 흉내 문자 복원: 글자 대신 쓰는 숫자와 기호를 원래 글자로 되돌립니다.
sh1t과@ss가 여기서 원래 모양으로 돌아옵니다. - 구분자 제거: 띄어쓰기·마침표·밑줄·이모지를 전부 버립니다.
- 반복 축약: 같은 글자가 이어지면 하나로 줄입니다. 늘려 쓴 표기가 여기서 원래 길이로 돌아옵니다.
이렇게 하면 뚫렸던 그 욕설도 붙은 한 덩어리로 도착합니다. 띄어 쓴 것, 점을 찍은 것, 기호를 끼운 것, 글자를 늘린 것이 전부 같은 모양이 되기 때문입니다. 아무도 그 변형들을 일일이 손으로 적어 넣지 않았는데도 걸립니다. 목록의 길이는 거의 그대로인데 낱말 하나가 덮는 범위가 달라진 것입니다.
금지어 목록은 하나씩 늘어나지만 우회 표기는 조합에 따라 곱하기로 늘어납니다. 우회를 목록으로 따라잡으려 하면 목록만 길어지고 결과는 그대로이므로, 입력을 먼저 접는 단계가 실제로 잡는 양을 결정합니다.
더 큰 문제는 너무 많이 막는 쪽입니다
흔히 필터라고 하면 못 막은 경우만 문제로 생각하기 쉽습니다. 하지만 실제로 더 큰 손해는 반대쪽에서 발생합니다. 멀쩡한 닉네임이 거부당하면 그 사람은 이유를 알 수 없습니다. 그저 사이트를 이탈합니다. 사이트가 고장 났다고 생각하고 나가면서 항의를 남기지도 않으므로, 저희는 그런 일이 있었다는 사실조차 모른 채 지나갑니다.
한국어는 음절을 쌓아 낱말을 만들기 때문에 이 문제가 특히 자주 생깁니다. 평범한 낱말 안에 거친 두 글자가 우연히 들어앉습니다. 출발하는 지점을 뜻하는 '시발점'이 대표적이고, '나혼자지존'이나 '나는바보지' 같은 흔한 닉네임도 글자만 놓고 보면 금지어 조각이 들어 있습니다. 영어권에도 같은 사례가 있습니다. 영국 도시 스컨소프(Scunthorpe)는 이름 안에 든 네 글자 때문에 여러 해 동안 인터넷에서 이름을 쓰지 못했습니다.
그래서 검사기는 안전어 목록을 따로 두고, 접은 문자열에서 안전어를 먼저 지운 다음 금지어를 찾습니다. 이 순서가 중요합니다. 처음 만들 때는 안전어가 보이면 그 닉네임 전체를 통과시켰는데, 그러면 욕설 뒤에 멀쩡한 낱말 하나만 붙여도 그대로 통과합니다. 안전어를 지우는 방식으로 바꾸면 겹친 부분만 제거되고 나머지는 그대로 걸립니다.
멀쩡한 닉네임이 거부됐다는 제보가 오면 금지어를 깎지 않고 안전어를 늘립니다. 욕설 하나를 놓치면 한 사람이 불쾌하지만, 멀쩡한 이름을 막으면 그 사람은 아무 설명도 없이 되돌아가야 하기 때문입니다.
한국어 초성 검사의 함정
한국어는 초성만 따서 줄여 쓰는 일이 흔하고, 욕설도 그렇게 자주 씁니다. 그러면 닉네임을 전부 초성으로 바꿔 한 번 더 검사하면 되겠다는 생각이 자연스럽게 듭니다.
하지만 그렇게 만들면 안 됩니다. 온전한 음절을 초성으로 줄이는 순간 그 음절을 멀쩡하게 만들어 주던 정보가 통째로 사라지고, 남은 자음 두 개만으로는 그것이 욕설을 줄여 쓴 것인지 평범한 낱말이었는지 구별할 방법이 없어지기 때문입니다. '수박'의 초성은 가장 흔한 욕설의 초성과 완전히 같습니다. '손발'도 '소방관'도 마찬가지입니다. 그렇게 만든 필터는 수박을 거부합니다.
그래서 초성 검사는 처음부터 자음만으로 적어 넣은 닉네임에만 적용합니다. 자음 두 개를 적은 사람은 무언가를 줄여 쓴 것이고, 온전한 낱말을 적은 사람은 그 낱말을 적은 것이므로 낱말로 둡니다.
금지어 목록을 브라우저에 두지 않는 이유
글자를 입력하는 동안 바로 알려 주면 더 편할 것입니다. 그러려면 금지어 목록을 브라우저로 내려보내야 하는데, 그것은 무엇을 피하면 되는지 적힌 지도를 함께 배포하는 일입니다. 그 지도가 가장 유용한 사람은 필터를 찔러 보는 사람입니다.
그래서 검사는 서버에서만 진행합니다. 제출을 실제로 거부할 수 있는 유일한 자리이기도 합니다. 대신 닉네임 때문에 거부된 응답은 길이나 형식 오류와 다른 코드로 돌려주고, 화면은 그것을 받아 다른 이름을 입력해 달라고 구체적으로 안내합니다. 거부됐다는 사실은 바로 아실 수 있고, 목록에 무엇이 들었는지만 공개하지 않습니다.
못 막는 부분
솔직하게 말씀드리면, 작정하고 우회하는 사람은 지금도 통과합니다. 세 가지는 알면서 열어 두었습니다.
- 글자 끼워넣기: 욕설 가운데에 글자를 하나 끼워 넣으면 접기 단계가 무력해집니다. 이를 막으려면 음절을 자모로 풀고 모음을 지워야 하는데, 그러면 평범한 사람 이름과 가수 이름이 함께 거부됩니다. 새는 쪽보다 잘못 막는 쪽의 손해가 크기 때문에 열어 두었습니다.
- 로마자 표기: 한국어 욕설을 알파벳으로 적은 것은 목록에 없습니다. 그 알파벳 배열이 다른 언어권의 평범한 이름 안에 들어 있어, 잡는 것보다 잘못 막는 경우가 먼저 발생하기 때문입니다.
- 금지어를 안 쓴 모욕: 창의적인 욕은 대개 이쪽이고, 목록으로는 아무것도 잡지 못합니다.
그래서 마지막 단계는 사람이 순위표를 읽고 지우는 것입니다. 8월의 그 닉네임도 그렇게 처리했습니다. 자동 필터가 맡는 일은 테스트를 하러 온 사람이 우연히 마주치는 불쾌감을 없애는 것이지, 작정하고 악의를 품은 사람과 싸워 이기는 것이 아니기 때문입니다.
순위표에 무엇이 남는지는 그것을 보게 되는 방문자가 아니라 저희 책임입니다.
자주 묻는 질문
제 닉네임이 거부됐는데 욕설이 아닙니다. 어떻게 하나요?
ysc9550@gmail.com으로 그 닉네임을 알려 주시면 안전어 목록에 넣습니다. 인사치레가 아니라 실제 수정입니다. 잘못된 거부는 버그로 취급합니다. 당한 사람에게는 이유를 알 방법이 없기 때문입니다.
이미 올라간 기록을 지워 달라고 할 수 있나요?
가능합니다. 같은 주소로 테스트 이름과 닉네임을 알려 주십시오. 모욕적인 기록은 제보가 없어도 발견하는 대로 지우지만, 순위표를 사람이 들여다보는 주기가 정해져 있지 않아 제보가 훨씬 빠릅니다.
외부 검열 서비스를 쓰지 않은 이유는 무엇인가요?
분류 성능만 보면 외부 서비스가 낫습니다. 특히 금지어를 쓰지 않은 모욕에 강합니다. 다만 방문자가 입력한 닉네임을 전부 외부 회사로 보내야 하고, 지금은 이 사이트 밖으로 나가지 않는 제출 경로에 외부 호출이 하나 생기며, 요청마다 비용이 발생합니다. 닉네임 칸 하나를 위해 치를 값으로는 크다고 판단했습니다.