Post

2026-07-10 TIL (95일차)

2026-07-10 TIL (95일차)

[TIL] CrazyRoo 멀티플레이어: Null(LAN)에서 EOS + AWS 데디케이티드 서버 전환 작업

현재 작업 개요

성공적으로 구축된 Null(LAN) 기반의 세션 시스템(FindRooms → JoinRoomByIndex → ClientTravel) 코드 골격을 그대로 유지하면서, 본격적인 인터넷 멀티플레이를 위해 EOS(Epic Online Services)AWS 데디케이티드 서버를 연동하는 마이그레이션 작업을 진행 중입니다.

EOS는 게임의 실질적인 통신을 중계하는 것이 아니라 “방 목록 게시판(매치메이킹)” 역할을 수행하며, 실제 게임 접속은 기존과 동일하게 AWS 서버의 공인 IP:Port로 직결(IpNetDriver 사용)하는 하이브리드 구조를 채택했습니다.


주요 작업 내역 및 기능 정리

1. Epic Dev Portal 세팅 및 권한 분리

EOS 백엔드 연동을 위한 식별자(ProductId, SandboxId, DeploymentId, ClientId, ClientSecret)를 확보하고, 역할에 맞게 권한 정책(Policy)을 분리하여 보안과 구조를 탄탄하게 잡습니다.

  • GameClient 정책: 클라이언트용 (세션 검색 findSessions, 참가 joinSession 권한)
  • TrustedServer 정책: 데디케이티드 서버용 (세션 생성 createSession 권한, 자동 인증)

2. 엔진 플러그인 및 환경 설정 (INI)

  • 플러그인 활성화: Online Subsystem EOS (Shared, Socket 자동 포함)
  • DefaultEngine.ini 설정:
    • DefaultPlatformService=EOS로 변경.
    • [OnlineSubsystemEOS] 세션에 확보한 Artifact 값(키 5개 + 64자리 EncryptionKey) 등록.
  • 네트워크 드라이버: 리슨 서버용인 EOS P2P 소켓을 쓰지 않고, AWS 서버 직결을 위해 기본 IpNetDriver를 그대로 유지합니다.

3. 세션 서브시스템 코드 리팩토링 (C++)

LAN 환경과 EOS 환경의 결정적인 차이를 반영하기 위해 세션 생성 및 검색 플래그를 수정합니다.

[Server] 세션 생성 (CreateDedicatedSession)

데디케이티드 서버 세션이 EOS 백엔드에 정상적으로 노출되도록 플래그를 조정합니다.

  • bIsLANMatch = false; (인터넷 검색용)
  • bUsesPresence = false; (데디서버는 Presence를 가질 수 없음)
  • bUseLobbiesIfAvailable = false; (Lobby API 대신 Session API 사용)
  • 커스텀 방 이름 설정 시 EOnlineDataAdvertisementType::ViaOnlineService를 사용하여 EOS 서버에 명시적으로 게시합니다.

[Client] 세션 검색 (FindRooms)

  • bIsLanQuery = false;
  • 데디서버 검색이므로 SEARCH_PRESENCE 쿼리는 절대 사용하지 않습니다.
  • 빈 쿼리 오류를 막기 위해, 서버에서 게시한 방 이름 키(RoomNameKey)를 검색 조건으로 반드시 포함합니다.

4. 클라이언트 EOS 자동 로그인 구현 (신규 기능)

EOS는 로그인된 유저가 없으면 세션 검색/참가가 전면 차단됩니다. 이를 해결하기 위해 로그인 파이프라인을 추가했습니다.

  • 서브시스템 추가: LoginToEOS() 함수와 성공 콜백 OnLoginComplete 델리게이트 구현.
  • UI 연동: WBP_Title에서 로그인 성공 콜백을 받기 전까지 [방 생성], [방 참가] 버튼을 비활성화하여 예외를 차단.
  • 개발 테스트 환경: Epic DevAuthTool을 이용해 로컬 자격 증명(Cred1, Cred2)을 만들고, 에디터 실행 인자(-AUTH_LOGIN=localhost:6547 -AUTH_PASSWORD=Cred1 -AUTH_TYPE=developer)를 통해 멀티 클라이언트 로그인을 테스트합니다.

5. AWS 데디케이티드 서버 배포 및 IP 트러블슈팅

  • 방화벽(보안 그룹): 게임 통신용 UDP 7777 (인바운드) 및 EOS API 통신용 TCP 443 (아웃바운드) 개방.
  • EC2 공인 IP 트러블슈팅 포인트 (핵심 함정): AWS EC2 인스턴스는 자신의 공인 IP를 직접 알지 못하므로, EOS 세션에 사설 IP(172.x.x.x)를 등록할 위험이 있습니다. 클라이언트가 연결 주소를 해석(GetResolvedConnectString)했을 때 사설 IP가 나온다면, EC2 메타데이터를 활용해 세션 호스트 주소를 공인 IP로 명시적으로 오버라이드(Override) 하는 작업이 필수적입니다.
This post is licensed under CC BY 4.0 by the author.