끄적이는 네트워크 공부(2)
1.RPC(Remote Procedure Call) 원격 프로시저 호출
RPC는 다른 컴퓨터에 있는 함수를 마치 로컬 함수처럼 호출하는 기술이다.
게임에서는 보통 클라이언트가 서버의 함수를 호출하거나, 반대로 서버가 클라이언트의 함수를 호출할 때 사용
즉, 네트워크를 통한 함수 호출이라고 보면된다.
1.작동 원리
1. 클라이언트에서 RPC 함수를 호출
2. 네트워크 패킷 생성 - 함수 이름, 인자 값 등 작렬화
3. 패킷 전송(TCP / UDP)
4. 수신 측에서 패킷 역직렬화
5. 함수 맵에서 해당 RPC 찾아 실행
1. RPC의 종류
1. Request-Response RPC
요청 -> 응답까지 기다림(동기) , 로그인 요청, 데이터 요청 등이 있음
2. One-way RPC (Fire-and-Forget)
응답 기다리지 않음(비동기), 이펙트 재생, 사운드 알림 등이 있음
3. Multicast RPC
하나의 요청 -> 여러 대상 호출, 서버가 모든 클라이언트에게 "폭발 이펙트 재생" 명령
예시로는 서버와 클라이언트간의 데미지 계산에 대한 함수를 호출하는 것으로 들 수 있다.
//헤더
UFUNCTION(Server, Reliable)
void ServerAttack();
//cpp
void AmyCharacter::ServerAttack()
{
// 서버에서만 실행되는 공격 로직
}
클라이언트가 ServerAttack()을 호출하면, 서버에서 해당 함수가 실행된다.
2. RPC 사용시 주의 점 및 해결방법
1. 보안 위험
클라이언트가 악의적으로 서버 RPC 호출 - 서버에서 권한 검증 필수
2. 딜레이(Latency)
RPC가 느리게 도착하거나 손실 - 중요 동작은 예측(Prediction) 병행
3. 스팸 호출
RPC 남발 시 서버 과부화 - 호출 제한 및 쿨타임 설정
4. 데이터 손상
인코딩/디코딩 오류 - 직렬화 및 버전 관리를 철저히 한다.
Stub - 클라이언트 측에 있는 프록시 함수
Skeleton - 서버 측에서 호출을 받아 실제 함수로 연결
Dispatcher - 메시지를 해석하고 적절한 함수로 전달
Binder - 서버 주소와 포트를 찾고 연결 설정
RPC는 다른 컴퓨터의 함수를 네트워크로 호출하는 기술
게임에서는 거의 필수 요소로 (서버 - 클라이언트 간 통신의 기본)
신뢰성, 방향성, 사용 목적에 따라 다양하게 사용
보안과 네트워크 예측 시스템과 함께 고려해야 안전하고 부드러운 게임을 구현할 수 있음.
2. 보안
게임 보안은 크게 두 가지로 나눌 수 있다.
네트워크 보안과 게임 로직 보안이다.
1. 네트워크 보안
데이터를 안전하게 전송
1. 패킷 스니핑(Packet Sniffing)
- 해커가 네트워크 통신을 가로채서 패킷을 분석
- 공격자에게 유리한 정보( HP, 위치, 아이템) 확인 가능
- 경우에 따라패킷 재정송이나 위조 가능
해결 방법
- 암호화(Encryption) : 데이터 내용을 숨김
- TLS/SSL : 로그인, 결제 등 민감 정보 보호에 사용
- 자체 프로토콜 암호화 : 게임 내부 채널은 가볍게 XOR 또는 AES로 암호화
2. 암호화(Encryption)
대칭키 암호화(AES) : 같은 키로/ 암호화/복호화
비대칭키 함호화(RSA) : 공개키로 암호화, 개인키로 복호화
세션 시작 시 RSA로 AES 키 교환 -> 이후 AES로 통신
3. 게임로직 보안
문제
1. 클라이언트를 조작하여
- 이동 속도 증가
- 공격력 조작
- 자동 사냥 매크로
- 벽 통과, 위치 수정
2. RPC 호출을 조작하여 서버에게 잘못된 요청
해결 방법
- 모든 게임 로직은 서버에서 처리
- 클라이언트는 UI 표시 + 입력 전달만 담당
- 서버는 항상 위치/공격 판정/피해 계산 등을 검증
4. Anti-Cheat 기법
- 서버 검증 : 이동, 동격 등은 항상 서버가 관리
- 무결성 검사 : 클라이언트 파일 / 메모리 체크 (CRC, 해시값 등)
- 메모리 보호 : 코드 난독화, 안티디버깅 기술
- 행동 분석 : 이상 행동 감지 (Aimbot, 고속 반복 입력 등)
- 패킷 난수화 : 패킷 구조를 동적으로 변경해서 분석 어렵게 만들어줌
- 서버 Authority 구조 : 클라이언트는 요청만 하고, 결과는 서버가 결정
5. 보안 공격 사례 예시 및 방버 방법
- 스피드 핵 : 서버에서 이동 속도 한계 체크
- 워프 핵 : 서버에서 이동 거리 검증
- 에임 봇 : 서버에 시야 범위, 명중률 검증
- 패킷 리플레이 : 패킷마다 시퀀스 넘버 부여 & 만료시간 체크
- 자체 서버 제작 : 인증 절차 강화, 서버 도장검사 필요
6. 네트워크 + 보안
1. 클라이언트 -> 서버 : Attack(TargetID = 23)
2. 서버에서 TargetID 23이 시야 내에 있는지 확인
3. 서버 -> 클라이언트 전체 : PlayerAttackEffect(AttackerID, TargetID)
4. 패킷은 암호화되어 전송
클라이언트가 공격을 임의로 조작하지 못하게 검증
위치/거리/쿨타임 체크
패킷 암호화로 해커 분석 방지
게임 보안에서 중요한 점은
클라이언트는 거짓을 말할 수 있으니 서버에서 판별 해야함
네트워크는 노출이 되어있으니 암호화로 숨겨야 한다.
정직한 유저는 보호해야 한다 보안은 게임의 품질이 좋아진다.