중복 닉네임 생성 방지

Arthur·2024년 12월 2일
0
post-thumbnail

작성하게 된 계기

회사에서 Live 중인 게임 프로젝트에서 중복 닉네임이 생성되는 문제가 발생했습니다.
그래서 유저 케릭터의 중복 닉네임이 N개가 프로필 관련 데이터베이스 테이블에 저장되어 있었습니다.


문제 상황 정리

  • 유저가 케릭터 생성 시 중복 닉네임 생성
    • 확인해보니 SELECT 쿼리로 중복 검사 없이 바로 닉네임 칼럼에 UPDATE 쿼리 실행
  • 중복되는 닉네임이 데이터베이스 프로필 테이블에 N개 이상 발견

제일 큰 문제는 중복 검증 로직이 없어서 발생하는 문제였습니다.
이런 문제가 발생 시 운영팀과 개발자의 입장에서 각자 고려해봤습니다.




닉네임 중복의 문제점

🧑‍💻개발자 입장에서 봤을 때 닉네임 중복의 문제

  1. DB 무결성 훼손
    닉네임이 중복되면 데이터베이스의 무결성이 손상될 수 있습니다.
    특히, 닉네임을 기본 키나 고유 식별자로 사용하는 경우 문제가 심각합니다.

  2. 쿼리 및 검색 오류
    게임 내 특정 플레이어를 찾기 위해 닉네임 기반으로 쿼리를 작성할 때,
    중복된 결과가 반환되어 의도치 않은 동작을 초래할 수 있습니다.


🧑‍💼운영팀 입장에서 봤을 때 닉네임 중복의 문제

  1. 명성 관리 및 악용
    인기 있는 플레이어의 닉네임을 다른 사용자가 복사하여 사칭할 수 있습니다.
    이를 통해 부정적인 행동을 하거나 명성을 악용하는 사례가 발생할 수 있습니다.
  2. 계정 탈취 및 사기
    중복 닉네임을 통해 유저를 혼란시켜, 계정 정보나 게임 내 재화를 탈취하려는 시도가 발생할 수 있습니다.
  3. 신원 도용 및 사칭
    동일한 닉네임을 사용하여 다른 플레이어의 신원을 도용하거나 사칭하는 경우, 부정행위 또는 사기가 발생할 가능성이 있습니다.
  4. CS 처리에 대한 문제
    게임에서는 신고 제도를 도입해서 유저를 킥(Kick)하거나 밴(Ban)하는 시스템이 있습니다.
    이런 유저의 신고는 보통 아이디 보다는 유저에게 보이는 닉네임을 통해서 받게 됩니다.
    근데 닉네임이 중복되어 있으면 운영팀에서 유저 신고에 대한 CS를 처리하기 곤란합니다.



닉네임 중복을 해결하기 위한 시도

1. 중복 닉네임 검사를 위한 접근 방법

(1) SELECT 쿼리로 중복 체크

  • 문제점
    • Race Condition: 두 사용자가 동시에 동일한 닉네임을 선택하면, NOT EXISTS 조건을 통과할 가능성이 있어 중복이 허용될 수 있음.
    • 성능 저하: 서브쿼리와 LIMIT 1 조합은 인덱스가 없을 경우 성능에 악영향을 미침.
  • 해결책:
    • 인덱스 추가: Username 컬럼에 인덱스를 설정해 검색 속도 향상.
    • FOR UPDATE 사용: SELECT ... FOR UPDATE로 잠금을 설정해 Race Condition 방지.

(2) UPDATE 쿼리에 서브쿼리 사용

UPDATE 프로필 SET 닉네임 = @닉네임 
WHERE 유저ID = @유저ID 
AND NOT EXISTS (SELECT 1 FROM (SELECT 1 FROM 프로필 WHERE 닉네임 = @닉네임 LIMIT 1) a);
  • 장점: 동시성이 낮을 때는 간단하게 중복 검사를 처리할 수 있음.
  • 단점: 동시성 이슈가 여전히 존재하며, 대규모 데이터에서는 비효율적.

2. READ COMMITTED 격리 수준 활용

  • 설명: 트랜잭션 중 커밋된 데이터만 읽을 수 있도록 보장하여 Dirty Read를 방지.
  • 장점:
    • 데이터 일관성 확보.
    • Deadlock 방지: 잠금을 최소화하여 교착 상태 발생 가능성을 줄임.
    • 동시성 향상: 낮은 수준의 잠금으로 여러 트랜잭션이 동시에 작업 가능.

3. 이미 생성된 중복 닉네임 처리

해결 방안:

  1. 고유 값 추가: 중복된 닉네임에 숫자 또는 랜덤 문자열을 추가.
    • 예) 닉네임1, 닉네임2.
  2. Riot ID 방식 도입: 닉네임 + 태그 조합을 사용해 고유성을 보장.
    • 예) 닉네임#1234.
  3. 임시 테이블 활용:
    • 중복된 닉네임을 SELECT하여 임시 테이블에 저장.
    • 고유 Auto Increment 값 을 추가한 후, 실제 테이블을 업데이트.

4. UNIQUE INDEX 적용

  • 장점: 데이터베이스에서 직접 중복을 방지하므로, 별도의 검증 로직이 필요 없음.
  • 단점: 기존 데이터가 중복될 경우, 인덱스 생성이 어려움.
  • 대안: 중복 데이터를 해결한 후 UNIQUE 인덱스를 설정.

추천 전략

  • 단기: SELECT ... FOR UPDATE를 사용하여 트랜잭션 내에서 동시성 제어.
  • 장기: 닉네임 + 태그 시스템 도입 또는 UNIQUE INDEX 활용으로 데이터베이스 차원에서 중복을 방지.



'리그오브레전드'에서의 중복 닉네임 처리

리그 오브 레전드(LoL)에서 중복 닉네임이 허용됩니다, 하지만 단순히 "똑같은 이름"을 허용하는 방식은 아닙니다. 정확히는, 같은 이름이라도 공백, 대소문자, 특수 문자, Riot ID 태그 등을 활용해 다른 이름으로 인식될 수 있습니다.

Riot ID 시스템

  • Riot ID는 "소환사 이름#태그" 형식으로 되어 있습니다.

    • 예를 들어, "Summoner#NA1""Summoner#EUW"는 서로 다른 사용자로 간주됩니다.
      태그 부분은 지역마다 다를 수 있고, 사용자가 커스터마이징할 수도 있습니다.
  • 공백, 대소문자, 특수 문자
    이름에 공백이나 대소문자를 다르게 사용하거나, 일부 허용된 특수 문자를 삽입해 같은 이름처럼 보이지만
    실제로는 다른 닉네임을 생성할 수 있습니다.

    • 예) Summoner, Summo Ner, SUMMONER 등은 다른 닉네임으로 인식됩니다.
  • 서버 구분
    지역별로 닉네임 중복이 가능하며, 예를 들어 한국 서버와 북미 서버에 같은 이름을 사용할 수 있습니다.

  • LoL에서는 Riot ID 시스템과 다양한 문자 조합을 활용해 같은 이름처럼 보이는 중복 닉네임이 가능합니다.
    다만, 정확히 동일한 조합은 허용되지 않습니다.




디아블로4의 중복 닉네임 처리


디아블로 4에서는 닉네임 중복이 허용됩니다.

대신, 배틀태그 시스템을 통해 각 플레이어를 식별합니다.
캐릭터 이름은 게임 내에서 자유롭게 설정할 수 있으며, 같은 이름을 여러 캐릭터에 사용할 수도 있습니다.
다른 플레이어와 중복되더라도 문제없이 사용할 수 있으며, 구체적인 구분은 배틀태그로 이루어집니다


닉네임 중복이 허용되는 다른 게임 사진




중복 닉네임을 허용하는 이유

일부 게임에서 중복 닉네임을 허용하는 이유는 사용자 경험을 개선하고 시스템 유연성을 높이기 위해서입니다.
다양한 게임 디자인과 기술적 요구 사항에 따라 중복 닉네임을 허용하는 이유는 다음과 같습니다.

  1. 사용자 편의성 향상
  • 닉네임 제한 완화
    인기 있는 닉네임은 이미 사용 중인 경우가 많기 때문에, 중복을 허용하면 플레이어들이 원하는 이름을 쉽게 사용할 수 있습니다.
    예) 페이커같은 유명인의 닉네임도 선택 가능.

  • 창의성 부담 감소
    고유 닉네임을 강제할 경우, 플레이어가 이름을 만들 때 복잡한 조합(숫자, 특수 문자)을 사용해야 하는 번거로움이 생깁니다.
    중복을 허용하면 이러한 부담이 줄어듭니다.

  1. 사회적 요소 및 커뮤니티 경험
  • 친구 찾기 및 소셜 기능 강화:
    플레이어들이 닉네임만 보고 친구를 찾는 것이 아니라, 고유 ID 또는 소셜 플랫폼을 통해 연결되기 때문에
    중복 닉네임 허용이 가능해집니다.

  • 익명성 강화:
    동일한 닉네임을 사용하는 플레이어들이 많아지면, 특정 닉네임이 익명성을 유지하는 데 도움이 될 수 있습니다.

  1. 글로벌 서버 및 크로스 플랫폼 지원
  • 서버 간 중복 허용
    글로벌 게임에서는 지역 서버마다 닉네임을 다르게 관리하는 경우가 많아, 같은 이름을 여러 지역에서 사용할 수 있게 합니다.
  • 플랫폼 통합
    크로스 플랫폼 지원 게임에서는 PC, 콘솔, 모바일 플레이어가 각각 동일한 닉네임을 사용할 수 있도록 허용합니다.


참고 자료

profile
기술에 대한 고민과 배운 것을 회고하는 게임 서버 개발자의 블로그입니다.

0개의 댓글