논문 읽기: 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에 대해서 초점을 맞추고 얘기하고 있다.
락스텝 동기화의 경우 기본적으로,
- 프레임이 시작
- 개별 사용자가 프레임 패킷을 전송
- 모든 사용자의 프레임 패킷이 도착하면 새 프레임 시작
이라는 구존데, 특정 사용자가 2를 하지 않고 버티다가 다른 모든 사용자의 프레임 패킷을 받고 , 그걸 토대로 자신이 유리하게 움직이는 look-ahead 치팅이 가능해진다. (대신 버킷 동기화의 치팅은 피할 수 있다)
반대로 버킷 동기화의 경우
- 버킷의 시작
- 버킷 시간 동안(고정 길이 혹은 가변 길이) 패킷을 받는다
- 버킷 끝에서 받은 동작들을 수행
이런 식으로 도는데, 필연적으로(..) 데드 리커닝이 필요하고, 이를 속이는 치팅 — 업데이트 패킷을 안보내고 버티다가 자신이 유리해지게 조작하고 보내는 것 — 이 가능해진다.
치팅이 불가능한 동기화와 증명
치팅이 불가능하다는 동기화 방법으로 2-phase로 동작하는 lock-step을 제시한다.
- Phase 1 – frame packet의 1-way hash 함수 버젼을 보낸다.3
- 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에 대한 소개가 없는 것도 좀 감점. 근데 이 방법은 시간 속이기라는 잘 알려진 치팅이 있긴하니까.
-
INFOCOM 2001 논문은 웹 상으로 공개되어 있으며 IEEE/ACM Trans. on Net. 2007년 2월 분량은 ACM portal (유료 혹은 가입된 곳에서 사용 가능) 에서 볼 수 있다. ↩︎
-
참고로 IEEE/ACM Transcactions on Networking은 네트웍 쪽 최고의 저널, INFOCOM은 거의 저널급 논문들이 자주나오는 상당히 급수가 높은 컨퍼런스다. 무슨 컨퍼런스 페이퍼가 11장이야. ↩︎
-
해슁된 값을 전송한단 소리. collision을 계산할 만큼 시간이 없으니 md5나 그 이전 variant들을 써도 될듯. ↩︎