본문으로 건너뛰기
Unreal Engine 멀티플레이LESSON 02

서버 권한 구조와 클라이언트의 역할

난이도입문 → 초급
예상 시간60분
선수지식1강의 상태 데이터 이동 지도

2강. 서버 권한 구조와 클라이언트의 역할

1. 이번 강의에서 해결할 문제​

클라이언트가 “점령 완료, 10점 추가”를 그대로 서버에 보내면 변조된 클라이언트가 원하는 만큼 점수를 만들 수 있습니다. 서버 권한 구조는 모든 일을 서버에서 렌더링하라는 뜻이 아니라, 공유 월드의 최종 결과를 서버가 관찰 가능한 입력과 규칙으로 다시 계산한다는 뜻입니다.

2. 학습 목표​

3. 핵심 개념​

서버는 데미지, 점수, Spawn, 아이템 획득과 승리 같은 공유 결과의 source of truth입니다. 클라이언트는 이동 입력, 조준 방향, 상호작용 의도처럼 서버가 검증할 수 있는 요청을 보냅니다. 요청에는 최종 점수나 임의의 Actor 포인터를 신뢰 가능한 값으로 담지 않습니다.

데이터클라이언트가 보냄서버가 계산·검증
발사시작 위치·방향 또는 입력 시점탄약, 쿨다운, 시야, Trace와 데미지
점령점령 지점 안에 머무름실제 Overlap, 팀, 시간과 점수
아이템획득 시도거리, 활성 상태, 중복 획득과 효과
UI버튼 입력요청 가능 상태

4. 단계별 실습​

파일 경로: Source/CaptureArena/Game/CaptureArenaGameMode.h

CaptureArenaGameMode.h
#pragma once

#include "CoreMinimal.h"
#include "GameFramework/GameModeBase.h"
#include "CaptureArenaGameMode.generated.h"

UCLASS()
class CAPTUREARENA_API ACaptureArenaGameMode : public AGameModeBase
{
GENERATED_BODY()

public:
void AwardCaptureScore(int32 TeamId, int32 Amount);
};
CaptureArenaGameMode.cpp
#include "Game/CaptureArenaGameMode.h"

#include "Game/CaptureArenaGameState.h"

void ACaptureArenaGameMode::AwardCaptureScore(int32 TeamId, int32 Amount)
{
if (!HasAuthority() || Amount <= 0 || !FMath::IsWithinInclusive(TeamId, 0, 1))
{
UE_LOG(LogTemp, Warning,
TEXT("AwardCaptureScore rejected Team=%d Amount=%d Authority=%d"),
TeamId, Amount, HasAuthority());
return;
}

ACaptureArenaGameState* CaptureState = GetGameState<ACaptureArenaGameState>();
if (!IsValid(CaptureState))
{
return;
}

CaptureState->AddTeamScore(TeamId, Amount);
}

AddTeamScore는 다음 강의들에서 서버 전용 함수와 Replicated 상태로 완성합니다. 지금은 GameMode의 함수가 클라이언트에 존재하지 않는다는 경계를 먼저 확인합니다. 클라이언트 코드에서 GetWorld()->GetAuthGameMode()를 호출하면 일반 클라이언트에서는 nullptr입니다.

PIE 검증

  1. 플레이어 2, 리슨 서버로 실행합니다.
  2. 서버 콘솔 또는 서버가 소유한 Actor에서 AwardCaptureScore를 호출합니다.
  3. 클라이언트에서 GetAuthGameMode() 결과가 null인지 로그로 확인합니다.
  4. 리슨 호스트 창에서는 화면을 가진 로컬 플레이어이면서 서버 프로세스이므로 권한 코드가 실행될 수 있음을 기록합니다.

5. 코드가 동작하는 이유​

GameMode는 규칙과 접속 흐름을 조정하는 서버 전용 Actor입니다. 점수 결과를 모든 클라이언트가 읽어야 하므로 실제 값은 복제되는 GameState에 둡니다. GameMode는 “누가, 언제, 얼마나 점수를 얻는지”를 결정하고 GameState는 그 결과를 전달합니다. 이 분리는 클라이언트가 GameMode 포인터를 요구하는 잘못된 UI 구조도 막습니다.

6. 자주 하는 실수와 해결법​

7. 직접 실습​

8. 이해 점검 질문 3개​

9. 핵심 요약​

MINI QUIZ

서버 권한 구조와 클라이언트의 역할 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“서버 권한 구조와 클라이언트의 역할”의 위험한 선택을 피하려면 어떤 원칙을 적용해야 하나요?
  2. 문제 2“서버 권한 구조와 클라이언트의 역할”에서 ‘HasAuthority만 있으면 보안 완료라고 생각’ 문제가 생겼습니다. 가장 알맞은 진단 또는 대응은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

2강. 서버 권한 구조와 클라이언트의 역할 미완료 상태