닉네임 필터를 정규식 한 줄로 믿지 마라 — 유니코드 우회 공격 방어
'admin'과 똑같이 생긴 키릴 문자, 한글 자모를 쪼개는 조합형 우회, 보이지 않는 제어 문자까지. 글로벌 게임의 닉네임·채팅 필터가 뚫리는 이유와 다계층 방어 파이프라인을 정리했습니다.

닉네임 필터를 정규식 하나로 막았다고 안심하는 순간 뚫립니다. 눈에는 admin과 똑같이 보이는 글자가 사실은 전혀 다른 유니코드 문자일 수 있고, 한글은 자음·모음이 결합하는 구조라 단순 단어 매칭이 무력화됩니다. 이 글은 글로벌 서비스에서 실제로 겪는 우회 기법과 방어 구조를 정리합니다.
이 문서는 NotebookLM(노트북 LM)으로 자료를 조사해 만든 문서입니다.
- 문자열 길이와 실제 글자 수는 일치하지 않습니다. 눈에 보이는 것을 믿으면 안 됩니다
- 핵심 원칙은 조기 정규화, 후기 검증입니다. 저장 전 여러 단계를 거칩니다
- 한글은 11,172개의 완성형 음절을 68개 자모로 쪼개서 분석해야 우회를 잡습니다
- 보이지 않는 제어 문자, 다른 언어의 닮은 글자가 필터를 피해 가는 주요 통로입니다
- 완벽한 필터링은 불가능하지만, 완벽에 가까운 아키텍처는 만들 수 있습니다
눈에 보이는 것을 믿을 수 없다

원칙 — 조기 정규화, 후기 검증

1단계 — 유니코드 카테고리로 걸러낸다

언어마다 허용 범위를 일일이 지정하는 방식은 새 언어가 추가될 때마다 구멍이 생깁니다. 문자의 속성(카테고리)으로 판단하는 방식이 유지보수 측면에서 훨씬 안전합니다.

2단계 — 유니코드 정규화

멋 부린 특수 유니코드 글꼴로 금칙어를 쓰는 경우가 흔합니다. NFKC 정규화 한 단계만 넣어도 이런 시도의 상당수가 걸러집니다.
3단계 — 한글이라는 난제

한글 특유의 조합 구조 때문에 영어권에서 만든 필터 라이브러리를 그대로 가져다 쓰면 대부분 뚫립니다. 국내 서비스라면 이 단계를 반드시 별도로 구현해야 합니다.


마지막 문장이 현실적인 한계를 짚어 줍니다. 구조적 우회는 알고리즘으로 잡히지만, 문맥적 은어는 결국 별도의 판단 모델이 필요합니다.
4단계 — 언어를 섞은 위장

관리자 사칭 닉네임 문제의 상당수가 이 기법입니다. 한 닉네임 안에 서로 다른 스크립트가 섞여 있으면 그 자체를 의심 신호로 보는 규칙이 유용합니다.
성능 — 실시간으로 처리하려면

방법론 비교

이 표가 실무 결정에 유용합니다. 모든 것을 AI로 처리하려 하면 비용과 지연이 감당되지 않고, 정규식만 쓰면 우회에 뚫립니다. 앞 세 단계를 기본기로 깔고, AI는 애매한 사례에만 보조로 씁니다.
클라이언트와 서버의 역할 분담

클라이언트 검증만 믿으면 위험합니다. 최종 판단은 반드시 서버에서 해야 하고, 클라이언트 쪽은 사용자 경험을 위한 1차 필터일 뿐입니다.


자주 묻는 질문
정규식 블랙리스트만으로는 정말 부족한가요? 욕설 변형을 일일이 등록하는 방식은 새로운 변형이 나올 때마다 쫓아가야 해서 유지비가 계속 늘어납니다. 자모 분리와 정규화를 먼저 거치면 애초에 변형의 여지가 줄어들어, 블랙리스트가 훨씬 짧아지고 오래갑니다. 블랙리스트를 없애라는 뜻이 아니라 마지막 단계로 축소하라는 뜻입니다.
모든 검증을 서버에서 하면 사용자 경험이 나빠지지 않나요? 클라이언트에서 1차로 걸러 즉시 피드백을 주고, 서버에서 최종 확정하는 이중 구조가 정답입니다. 사용자는 입력 중 바로 안내를 받고, 실제 저장은 서버가 재검증한 값으로만 이루어집니다. 클라이언트 검증 결과를 그대로 믿고 저장하면 우회가 뚫립니다.
한글 자모 분리를 도입하면 성능에 얼마나 영향이 있나요? 자모 분리 자체는 유니코드 값에 뺄셈과 나머지 연산만 쓰는 가벼운 계산입니다. 문제가 되는 것은 매 프레임 반복 호출하는 경우입니다. 채팅처럼 입력이 잦은 곳은 결과를 캐싱하고, 정규식은 컴파일된 상태로 재사용하는 것으로 대부분 해결됩니다.
욕설의 은어나 발음 유사성까지 잡으려면 AI가 꼭 필요한가요? 구조적 우회(동형 문자, 자모 쪼개기, 제어 문자)는 알고리즘으로 대부분 막을 수 있지만, 문맥적 은어는 결국 사람이나 모델의 판단이 필요합니다. 다만 모든 텍스트를 AI로 보내면 비용이 커지므로, 알고리즘 필터를 통과한 것 중 신고가 들어온 것만 AI로 재검토하는 방식이 현실적입니다.
저희가 이 이야기를 하는 이유
에버스톤은 여러 언어권에 게임을 서비스하면서 닉네임·채팅 필터를 직접 운영합니다. 정규식 하나로 막아 두었던 초기 버전이 얼마 지나지 않아 우회당하는 것을 겪었고, 그 뒤로 정규화와 자모 분리를 기본 단계로 두게 되었습니다. 언어별로 우회 방식이 다르다는 것도 실제로 신고 사례를 보며 배운 부분입니다.
인용한 기법과 코드 예시는 원 자료 기준입니다. 실제 적용 전에는 서비스 환경에 맞는 별도 검증이 필요합니다.
