논문 읽기: C/S 혹은 P2P 구조에서 치팅을 막는 동기화 방법

뭔가 내가 아는게 부족하기도 하고, 좀 제대로 알 필요가 생겨서 GPG 3권부터 시작해서 논문과 아티클을 훑어보는 중. 그 작업 중 일부로 읽었던 논문을 간략히 소개하겠다.1

원제로

N. Baughman, M. Liberatore and B. Levine, “Cheat-Proof Playout for Centralized and Peer-to-Peer Gaming,” Feb. 2007, IEEE/ACM Transactions on Networking

실제로는 2001년 INFOCOM에도 냈던 논문의 연장선인데2, 다루는 내용은 크게 세가지.

현존하는 동기화 방식의 문제

흔히 사용하게 되는 lock-step (frame-locking)과 bucket syncrhonization에 대해서 초점을 맞추고 얘기하고 있다.

락스텝 동기화의 경우 기본적으로,

  1. 프레임이 시작
  2. 개별 사용자가 프레임 패킷을 전송
  3. 모든 사용자의 프레임 패킷이 도착하면 새 프레임 시작

이라는 구존데, 특정 사용자가 2를 하지 않고 버티다가 다른 모든 사용자의 프레임 패킷을 받고 , 그걸 토대로 자신이 유리하게 움직이는 look-ahead 치팅이 가능해진다. (대신 버킷 동기화의 치팅은 피할 수 있다)

반대로 버킷 동기화의 경우

  1. 버킷의 시작
  2. 버킷 시간 동안(고정 길이 혹은 가변 길이) 패킷을 받는다
  3. 버킷 끝에서 받은 동작들을 수행

이런 식으로 도는데, 필연적으로(..) 데드 리커닝이 필요하고, 이를 속이는 치팅 — 업데이트 패킷을 안보내고 버티다가 자신이 유리해지게 조작하고 보내는 것 — 이 가능해진다.

치팅이 불가능한 동기화와 증명

치팅이 불가능하다는 동기화 방법으로 2-phase로 동작하는 lock-step을 제시한다.

  1. Phase 1 – frame packet의 1-way hash 함수 버젼을 보낸다.3
  2. Phase 2 – 실제로 frame packet 전송

각각의 phase에 대해서 lock-step 동기화가 이루어지면 2에서 보내는 패킷을 속이는 — 즉 다른 사람 패킷을 보고 행동을 취하는 — 행위가 불가능해진다는 것

성능 평가

사실 저 방법은 딜레이가 커지기 때문에, 저자는 월드 전체를 쪼개고 — MMORPG에서 흔히 취하는 셀 방식 — 각각의 셀에 대해 근처에 다른 유저가 있을 때만 2-phased lock-step을 쓰자! 라는 것 + 비동기 lock-step이라고 저자가 부르는 일종의 분산 clock을 쓰는 방식에 대한 제안과 시뮬레이션.

물론 성능이야 조금 올라가겠지. 그렇지만 기본적으로 성능이 떨어질 다수의 사용자가 있는 상황에서는 비동기 클락이 큰 의미가 없기 쉽상이고, 그 상황에서 평균치도 아니고 제일 느린 사용자에 끌려갈 수 밖에 없는 lock-step이란건.

논문 전체에 대한 내 평가는,

  • 동기화 방법을 정리하고, 각각의 취약점을 설명해준 것은 좋다
  • 2-phased lock-step 자체도 의미는 있다 — 치팅을 피하는 것
  • 하지만 기본적으로 딜레이가 커지는 lock-step의 문제가 2배로 커진다
  • 셀로 쪼개고 비동기 lock-step을 해도 근처에 있는 사람 중 가장 딜레이가 큰 사용자의 딜레이에 영향을 받고, 그 영향이 2배가 된다

라는 점 때문에, 높은 점수를 주기는 좀 힘들었다. 뭐 일단은 제목가 저널에 낚였으니 -_-a

그리고 상대적으로 널리 쓰이는 방법 중 하나인 event-locking에 대한 소개가 없는 것도 좀 감점. 근데 이 방법은 시간 속이기라는 잘 알려진 치팅이 있긴하니까.


  1. INFOCOM 2001 논문은 웹 상으로 공개되어 있으며 IEEE/ACM Trans. on Net. 2007년 2월 분량은 ACM portal (유료 혹은 가입된 곳에서 사용 가능) 에서 볼 수 있다. ↩︎

  2. 참고로 IEEE/ACM Transcactions on Networking은 네트웍 쪽 최고의 저널, INFOCOM은 거의 저널급 논문들이 자주나오는 상당히 급수가 높은 컨퍼런스다. 무슨 컨퍼런스 페이퍼가 11장이야. ↩︎

  3. 해슁된 값을 전송한단 소리. collision을 계산할 만큼 시간이 없으니 md5나 그 이전 variant들을 써도 될듯. ↩︎