2006년 12월 12일에 네이버 블로그에 적은 글입니다.



온라인 게임을 만들 때 가장 처음 틀을 잡는게 로그인과 로그아웃 부분일겁니다. 그리고 이 부분의 정확성은 확실해야 되고요. 로그인이 잘 못되면 유저들이 게임에 접속을 못하는 수가 있고 로그아웃 부분이 잘못되면 유저의 게임 결과 데이터 저장에 문제가 발생하겠죠.


그래서 신경써서 작업을 하지만 가끔 버그라기 보다는 게임의 흐름에서 예외적인 처리부분을 생각하지 못해서 논리적인 오류에 의해서 발생하는 버그가 있습니다.


아래의 제가 겪어본 경우를 2가지 예를 들어보겠습니다.



1. 로그 아웃 할 때

사용자 삽입 이미지

위의 그림과 같은 흐름으로 정상적인 로그아웃은 1. 클라이언트에서 로그 아웃 함을 통보, 2. 서버는 유저의 게임 데이터를 DB에 저장, 3. 클라이언트는 서버로 부터 끊어도 된다는 통보를 받으면 접속 종료.

예전에 다닌 회사 중 이런식으로 되어 있었던 적이 있습니다.

그런데 문제는 클라이언트가 해킹이 되어 클라이언트가 3번 끊어도 된다는 통보를 받고 난 후도 끊지 않는 경우가 문제가 됩니다. 즉 2번에서는 이미 유저의 게임 결과는 DB에 저장 되었기 때문에 3번에서 끊지 않고 유저가 자신이 가지고 있는 게임 머니를 다른 사람에게 줘버려도 유저의 정보에는 저장이 되지 않아서(이미 앞에서 저장이 되었기 때문에 게임서버 입장에서는 이 유저는 공중에 붕 떠 있는 상태죠) 유저는 자기 돈은 한푼도 쓰지 않으면서 다른 사람에게 마구 게임 머니를 주는 사태가 발생하였습니다. 다행히 로그로 이상 상태를 잡아서 모니터링을 하여 빨리 알아채려서 큰 피해는 없었습니다.





2. 중복 접속 시

사용자 삽입 이미지

이 문제는 오늘 발생한 버그였습니다.(개발 중이라서 다행이죠 ^^;;;;)

저희 게임은 A 그림처럼 로그인 상태에서는(게임서버 리스트를 받은 상태) 로그인 서버와 연결된 상태이지만 게임 내에 접속을 하면 로그인 서버와의 연결은 끊어지고 B 그림처럼 게임서버와 연결이 됩니다.

이전까지는 주로 중복 접속은 첫번째 유저가 이미 게임에 접속되어 있는 상태라서 게임서버와 클라이언트간의 연결만 끊어면 괜찮았습니다. 그런데 문제는 1. 선행유저가 로그인 서버에 접속한 상태에서,  2. 후행 유저가 똑같은 아이디로 로그인 시도를 하면 중복접속이라는 알림이 나오고, 3. 중복 접속을 끊는다고 하면 선행 유저를 잘라야 됩니다.

그러나 언제나 중복 접속 문제는 선행 유저가 게임서버에 접속되어 있다는 가정만 생각을 하고 있어서 게임서버와 클라이언트만 연결을 잘라버리지, 로그인 서버와 클라이언트간의 접속을 하고 있을 때는 짜르지 않고 있었죠

또한 로그인 서버는 클라이언트가 로그인 이후에 요청하는 패킷에 대해서는 인증을 받았는지, 인증 정보의 소켓 정보와 요청하는 유저가 동일한 소켓인지 체크를 해야 되는데 이것을 안하고 있어서 A 상태에서는 중복 접속이 된 상태에서 두명이 동시에 게임에 접속해서 게임을 할 수 있게 되었습니다.



 이 버그는 아마 테스트 하시는 분이 일부러 이렇게 할려고 하지 않았으면 모르고 있을 수도 있을겁니다(항후 코드 검사를 하겠지만 못 찾을 가능성이 크죠). 다행히 매일 다양한 방법으로 테스트를 해주니 생각지도 못한 부분에서 버그를 찾을 수가 있었습니다.


이러한 논리적인 오류에 의한 버그는 다양한 테스트를 통해서 알아 차릴 수 있지 실제 서비스 후 일 터지기전까지는 모를 수도 있습니다.


게임 로직을 만들 때 다양한 예외적인 처리를 생각하여 만들어야 되는건 당연한거지만 사람이 완벽할 수 없으니 실수를 할 수도 있으니 이런 실수를 찾아내는 테스트는 꼭 필요한 것이라고 생각합니다.

신고
by 흥배 2008.03.21 00:02
| 1 |