EOS × Unreal 연동 가이드
Online Subsystem EOS · UE 5.x
Unreal Engine 5 · Epic Online Services

EOS × Unreal
연동 가이드

크로스플랫폼 멀티플레이를 위한 무료 백엔드, Epic Online Services를 언리얼 프로젝트에 붙이는 전 과정을 — 포털 설정부터 인증, 세션, 패키징까지 순서대로 정리했습니다.

대상 UE 5.x 권장 SDK UE 5.8+ 무료 · 크로스플랫폼 C++ / Blueprint
플레이어 · 어느 플랫폼에서든
PC · Steam Mobile Console Epic Games
Epic Online Services
unified backend
Epic Account Services
계정 로그인 · 친구 · 프레즌스
Game Services
세션 · 매치메이킹 · 업적 · P2P · 보이스
내 게임 · Unreal Engine 5
// architectureplatforms → EOS → your game
01

EOS란 무엇인가

Epic Online Services는 에픽게임즈가 제공하는 무료 크로스플랫폼 게임 백엔드입니다. 자체 서버를 구축하지 않고도 로그인, 친구, 세션, 매치메이킹, 업적, 보이스챗 같은 온라인 기능을 붙일 수 있습니다.

EOS는 크게 두 갈래의 서비스로 나뉩니다. 이 구분을 이해하면 이후 플러그인과 설정이 훨씬 명확해집니다.

Epic Account Services (EAS)

에픽 계정 기반의 로그인, 친구 목록, 프레즌스(접속 상태) 등 플레이어 신원을 다루는 서비스입니다.

Game Services (EOSGS)

세션·로비·매치메이킹·업적·통계·리더보드·P2P·보이스챗 등 게임 플레이 기능을 담당합니다.

routes언리얼에서 EOS를 붙이는 두 가지 길

언리얼 엔진에서 EOS에 접근하는 방법은 크게 두 가지입니다. 프로젝트 성격에 맞는 길을 먼저 정하세요.

권장 · 안정

Online Subsystem EOS

엔진에 내장된 OnlineSubsystem(OSSv1) 인터페이스. 자료와 예제가 가장 많고 검증되어 있어 처음 도입하기 좋습니다.

차세대

Online Services EOS

UE5의 새 통합 인터페이스(OSSv2). EOSGS + EOS 플러그인 조합으로 더 현대적이지만 자료가 적습니다.

이 가이드의 기준

본문은 자료가 가장 풍부하고 안정적인 Online Subsystem EOS(OSSv1)를 기준으로 설명합니다. 차세대 방식(Online Services)의 설정 차이도 함께 짚어 드립니다.

02

사전 준비물

코드를 만지기 전에 환경부터 갖춰 둡니다. 빠진 항목이 있으면 뒤에서 빌드가 막히는 경우가 많습니다.

  • Unreal Engine 5.x C++ 프로젝트 — EOS 플러그인은 C++ 컴파일이 필요합니다. 블루프린트 전용 프로젝트라면 C++ 클래스를 하나라도 추가해 C++ 프로젝트로 전환하세요.
  • 최신 엔진 버전 권장 (5.8 이상) — 함께 배포되는 EOS SDK가 최신이며, 구버전 엔진의 SDK에는 알려진 WebRTC 취약점(Chromium M102 이전)이 있습니다. P2P를 쓴다면 EOS SDK를 1.16 이상으로 갱신하거나 최신 엔진을 쓰는 것이 안전합니다.
  • Visual Studio (Windows) 또는 Xcode (macOS) — C++ 모듈 빌드 도구.
  • Epic Games 계정Epic Developer Portal 접근 권한.
Note

플랫폼 콘솔(Xbox·PlayStation·Switch)을 대상으로 한다면 각 플랫폼의 NDA 및 별도 SDK 권한이 추가로 필요합니다. PC·모바일·Epic 계정 연동은 별도 승인 없이 바로 시작할 수 있습니다.

03

개발자 포털 설정

EOS와 통신하려면 포털에서 제품을 등록하고, 엔진에 넣을 자격 증명(credentials)을 발급받아야 합니다. 이 값들이 5단계 설정의 핵심 재료가 됩니다.

step조직과 제품 만들기

  1. Epic Developer Portal에 로그인하고 Organization을 생성합니다(없을 경우).
  2. 조직 안에서 Product를 새로 만듭니다. 이것이 곧 여러분의 게임 한 개에 해당합니다.
  3. 제품의 Product Settings 페이지로 들어가면 아래 표의 식별자들을 확인할 수 있습니다.
Epic Developer Portal 조직 대시보드에서 제품 생성
조직 대시보드 > '제품 생성'으로 게임 한 개에 해당하는 Product를 만든다
제품 카드의 톱니바퀴에서 제품 설정 진입
생성된 제품의 톱니바퀴(제품 설정)에서 스토어·게임 서비스·에픽 계정 서비스로 진입한다
설명 비고
Product ID제품 고유 식별자포털에서 확인
Sandbox ID개발/스테이징/라이브 환경 구분환경별로 다름
Deployment ID샌드박스 내 배포 단위샌드박스에 종속
Client ID클라이언트 자격 증명Client 생성 시 발급
Client Secret클라이언트 비밀 키외부 노출 금지
Encryption Key업로드 데이터 암호화용 64자리 16진수직접 생성·보관, 에픽도 모름
제품 설정의 EOS SDK 크리덴셜 화면
제품 설정 > EOS SDK 크리덴셜 — Product · Sandbox · Deployment · Client ID가 한 화면에. 엔진 ini에 넣을 값을 여기서 복사한다

stepClient와 Client Policy 설정

제품 설정에서 Clients 탭으로 이동해 새 Client를 만들고, 권한을 정의하는 Client Policy를 연결합니다. 정책에는 이 클라이언트가 어떤 기능(세션, 로비, 친구 등)을 호출할 수 있는지가 담깁니다. 개발 단계에서는 Peer2Peer나 광범위한 권한이 포함된 정책을 쓰고, 출시 전에 최소 권한으로 좁히는 방식이 일반적입니다.

제품의 Clients 탭 — 클라이언트와 클라이언트 정책 목록
제품 > Clients 탭 — 클라이언트와 클라이언트 정책을 각각 추가한다
새 클라이언트 정책 추가 — Peer2Peer 유형과 기능 권한
새 클라이언트 정책 — 개발 단계는 Peer2Peer 등 넓은 유형으로, User required·기능별 권한을 켠다
새 클라이언트 추가 — 클라이언트 정책 연결
새 클라이언트 추가 — 위에서 만든 Client Policy를 연결한다(신뢰 서버 IP는 선택)

stepEpic Account Services 활성화

에픽 계정 로그인·친구·프레즌스를 쓰려면 Epic Account Services(EAS)를 별도로 설정해야 합니다. Brand 설정과 권한(Scopes)을 구성하고, 가능하면 도메인 인증을 마쳐 두세요. 도메인 인증이 없으면 플레이어 로그인 시 경고 화면이 노출됩니다.

에픽 계정 서비스 — EAS 애플리케이션 생성
에픽 계정 서비스 — 제품에 EAS 애플리케이션을 생성한다(브랜드·권한·연동 클라이언트 구성)
EAS 애플리케이션 권한(Scopes) 설정
EAS 권한(Scopes) — Basic Profile은 항상 필수, Online Presence·Friends를 필요에 맞게 켠다
애플리케이션에 클라이언트 연결
애플리케이션에 클라이언트를 연결 — 한 애플리케이션에는 한 클라이언트만 동시 연결된다
Warning

Client Secret과 Encryption Key는 절대 공개 저장소나 빌드 산출물에 평문으로 노출하지 마세요. 유출되면 제품 자격 증명을 재발급해야 합니다. 버전 관리에서 DefaultEngine.ini의 민감 값은 분리하거나 무시 처리하는 것을 권장합니다.

04

플러그인 활성화

에픽 포털 준비가 끝났으면 엔진 쪽에서 플러그인을 켭니다. 에디터 메뉴 Edit → Plugins에서 검색해 활성화한 뒤 에디터를 재시작합니다.

OSSv1Online Subsystem EOS 경로

  • Online Subsystem EOS — EOS용 OSS 구현체(필수).
  • EOS Shared — EOS SDK 공유 모듈(필수).
  • Online Subsystem EOS Plus — Steam·콘솔 등 네이티브 플랫폼과 EOS를 함께 쓰는 크로스플레이용. 세션 미러링 등을 제공하지만 베타·기능 제한적입니다(선택).
  • EOS Voice Chat / EOS RTC IVoiceChat — 보이스챗이 필요할 때(선택).

OSSv2Online Services EOS 경로

차세대 방식을 쓴다면 Edit → Plugins에서 Online Platform 카테고리를 열어 다음을 켭니다. 기본 Online Services 베이스 플러그인은 보통 이미 활성화되어 있습니다.

  • Online Services EOSGS — EOS 게임 서비스 기능.
  • Online Services EOS — EAS(에픽 계정 서비스) 기능을 보강. 두 개를 함께 켜면 게임 서비스와 계정 서비스를 모두 사용할 수 있습니다.
언리얼 에디터 Plugins 창에서 EOS 플러그인 활성화
Edit > Plugins에서 'EOS' 검색 — Online Subsystem EOS(베타)·EOS Shared 등을 켜고 에디터를 재시작한다
05

프로젝트 구성

코드 모듈 의존성과 DefaultEngine.ini 설정을 채워 EOS를 기본 온라인 플랫폼으로 지정합니다.

cppBuild.cs 모듈 의존성

C++에서 OSS API를 호출하려면 게임 모듈의 Build.cs에 의존성을 추가합니다.

MyProject.Build.cs
PublicDependencyModuleNames.AddRange(new string[]{
    "Core", "CoreUObject", "Engine", "InputCore",
    "OnlineSubsystem",          // OSS 코어
    "OnlineSubsystemEOS",       // EOS 구현체
    "OnlineSubsystemUtils"      // 세션/넷드라이버 유틸
});

iniDefaultEngine.ini — OSSv1 설정

03단계에서 발급받은 값들을 채워 넣습니다. 아래는 EOS를 기본 플랫폼으로 쓰는 표준 구성입니다.

Config/DefaultEngine.ini
; --- EOS를 기본 온라인 플랫폼으로 지정 ---
[OnlineSubsystem]
DefaultPlatformService=EOS

[OnlineSubsystemEOS]
bEnabled=true

; --- 넷드라이버: 접속을 EOS 소켓 위로 ---
[/Script/Engine.GameEngine]
+NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="OnlineSubsystemEOS.NetDriverEOSBase",DriverClassNameFallback="OnlineSubsystemUtils.IpNetDriver")

; --- 포털에서 받은 제품 자격 증명 ---
[/Script/OnlineSubsystemEOS.EOSSettings]
ProductId=<PRODUCT_ID>
SandboxId=<SANDBOX_ID>
DeploymentId=<DEPLOYMENT_ID>
ClientId=<CLIENT_ID>
ClientSecret=<CLIENT_SECRET>
EncryptionKey=<64자리 16진수 키>

; --- 사용할 기능 토글 ---
bUseEAS=true          ; 에픽 계정 로그인/친구
bUseEOSConnect=true   ; 익명/플랫폼 연결
bUseEOSSessions=true  ; 세션·매치메이킹
bMirrorStatsToEOS=true
bMirrorAchievementsToEOS=true

iniDefaultEngine.ini — OSSv2(Online Services) 설정

차세대 방식을 쓴다면 자격 증명 블록의 형식이 다릅니다.

Config/DefaultEngine.ini (OSSv2)
[OnlineServices.EOS]
ProductId=<PRODUCT_ID>
SandboxId=<SANDBOX_ID>
DeploymentId=<DEPLOYMENT_ID>
ClientId=<CLIENT_ID>
ClientSecret=<CLIENT_SECRET>
ClientEncryptionKey=<ENCRYPTION_KEY>

guiProject Settings로 채우기

ini를 직접 편집하는 대신 Edit → Project Settings → Plugins → Online Subsystem EOS에서 같은 값을 GUI로 채울 수도 있습니다. 포털에서 받은 크리덴셜을 Artifacts 배열의 첫 항목에 매핑하면 됩니다. 저장하면 같은 DefaultEngine.ini에 기록됩니다.

Project Settings의 Online Subsystem EOS 설정과 포털 크리덴셜 매핑
Project Settings > Plugins > Online Subsystem EOS — Artifacts[0]의 각 칸에 포털의 Product/Sandbox/Deployment/Client 크리덴셜을 매핑한다
06

인증과 로그인

EOS의 첫 관문은 로그인입니다. IOnlineIdentity 인터페이스의 Login(또는 AutoLogin)을 호출하며, 어떤 자격 증명 타입을 쓰느냐로 동작이 갈립니다.

types자격 증명 타입

Type 용도 언제
accountportal브라우저 창으로 에픽 계정 로그인에디터·데스크톱 개발
developerDev Auth Tool 경유 로그인반복 테스트(권장)
exchangecodeEpic Launcher가 넘겨주는 코드출시 빌드
persistentauth저장된 토큰으로 자동 재로그인재실행 시
deviceid계정 없는 익명 로그인모바일/게스트

toolDev Auth Tool 사용 가이드

Developer Authentication Tool(EOS_DevAuthTool)은 Epic Online Services SDK에 포함된 개발용 인증 도구입니다. 에디터에서 게임을 반복 실행할 때 브라우저로 에픽 계정 로그인을 매번 거치지 않고, 미리 인증해 둔 자격증명으로 자동 로그인하게 해줍니다. 개발 중 로그인 반복 작업과 멀티플레이 로컬 테스트를 빠르게 만드는 것이 목적입니다.

whatDev Auth Tool이란

EOS 인증(EOS_Auth)으로 로그인하려면 에픽 계정 인증이 필요합니다. 기본 흐름에서는 매 실행마다 브라우저가 떠서 계정 로그인을 거쳐야 하는데, 실행을 수십 번 반복하는 개발 단계에서는 비효율적입니다.

EOS_DevAuthTool은 에픽 계정 인증을 한 번만 수행해 자격증명을 로컬에 보관하고, 에디터/게임이 로컬 포트로 그 자격증명을 받아 AUTH_TYPE=Developer 방식으로 자동 로그인하게 합니다. 결과적으로 실행할 때마다 브라우저 인증을 건너뜁니다.

  • 로그인 자동화: 실행 시 브라우저 인증 생략
  • 멀티 계정: 하나의 툴에 여러 자격증명을 등록해 로컬 멀티플레이 테스트
  • 개발 전용: 출시 빌드에는 사용하지 않음(아래 가이드라인 참조)

find어디서 받나

툴은 EOS SDK(C SDK)에 동봉되어 있습니다. Epic Dev Portal에서 SDK를 받아야 얻을 수 있습니다.

다운로드

· EOS SDK (C SDK) 다운로드 — dev.epicgames.com/en-US/sdk
· Developer Portal(로그인 후 SDK·콘솔) — dev.epicgames.com/portal
· Dev Auth Tool 공식 문서 — dev.epicgames.com/docs/…/developer-authentication-tool

  1. Epic Dev Portal에서 다운로드: dev.epicgames.com에서 EOS SDK(C SDK)를 받아 압축을 풀면 SDK/Tools 폴더에 도구가 들어 있습니다.
  2. 엔진 번들 SDK에는 보통 없음: 언리얼 엔진에 번들된 EOS SDK에는 일반적으로 Tools 폴더(=DevAuthTool)가 포함되지 않습니다. 엔진은 런타임 라이브러리/헤더만 번들하므로, DevAuthTool은 위처럼 Dev Portal에서 별도로 받아야 합니다.

SDK/Tools 폴더 안에는 바로 실행되는 파일이 아니라 플랫폼별 버전 zip이 들어 있어, 이를 한 번 더 풀어야 실행 파일이 나옵니다.

SDK Tools 폴더 (버전마다 파일명 다름)
# dev.epicgames.com에서 받은 EOS SDK 압축 해제 후
<EOS-SDK>/SDK/Tools/
  EOS_DevAuthTool-win32-x64-X.X.X.zip    # Windows
  EOS_DevAuthTool-darwin-x64-X.X.X.zip   # macOS

# 위 zip을 한 번 더 풀면 실행 파일이 나온다
EOS_DevAuthTool.exe    # Windows
EOS_DevAuthTool.app    # macOS
플랫폼 주의

Tools 폴더에는 Windows(win32-x64)와 macOS(darwin)용 빌드만 들어 있습니다. Linux용 DevAuthTool 빌드는 제공되지 않습니다(EOS SDK 런타임 자체는 Linux를 지원하지만, DevAuthTool 도구는 별개입니다). 파일명의 버전 숫자는 SDK 버전에 따라 다릅니다.

엔진 번들 위치

엔진에 번들된 EOS SDK는 보통 Engine/Source/ThirdParty/EOSSDK에 있고, EOS 기능을 노출하는 플러그인은 EOSShared(Engine/Plugins/Online/EOSShared)입니다. 다만 이 번들 위치에는 Tools/EOS_DevAuthTool이 들어 있지 않으므로, 엔진 폴더 검색으로 툴이 나오지 않는 것이 정상입니다. 경로는 엔진 버전에 따라 다를 수 있습니다.

run실행과 로그인 절차

  1. EOS_DevAuthTool 실행.
  2. 상단 Port 입력란에 사용할 로컬 포트를 입력(예: 6300, 7777, 8081).
  3. Login 버튼 클릭. 이 동작이 입력한 포트에서 로컬 서버 리스닝을 시작하는 동시에 기본 브라우저로 에픽 계정 인증 페이지를 엽니다.
  4. 에픽 계정으로 로그인/승인.
  5. 인증이 끝나면 해당 항목에 credential name(이름표)을 지정합니다. 예: dev1. 이 이름이 에디터 연결 시 핵심 키가 됩니다.
참고

툴 버전에 따라 UI 배치가 다를 수 있으나, 동작은 '포트 입력 → Login 클릭'의 한 단계입니다. 별도의 Start 버튼을 먼저 누르는 2단계 흐름이 아니며, Login 한 번이 포트 리스닝과 브라우저 인증을 함께 시작합니다.

Tip

credential name은 임의로 정하는 식별자입니다. 짧고 명확하게(dev1, dev2, tester) 지으면 멀티플레이 테스트 시 헷갈리지 않습니다.

connectUE 에디터 연결

에디터가 게임 실행 시 위 자격증명을 쓰도록 런치 파라미터를 지정합니다. Editor Preferences → Level Editor → Play → Play in Standalone Game 섹션의 Additional Launch Parameters에 아래를 입력합니다.

Additional Launch Parameters
-AUTH_TYPE=Developer -AUTH_LOGIN=localhost:6300 -AUTH_PASSWORD=dev1
  • -AUTH_TYPE=Developer: Dev Auth Tool 방식 사용 선언
  • -AUTH_LOGIN=localhost:<port>: 툴에서 입력한 포트와 정확히 일치해야 함
  • -AUTH_PASSWORD=<credentialName>: 툴에서 지은 이름표(예 dev1)
실행 모드 주의

이 파라미터는 'Play in Standalone Game' 섹션 소속이라, 별도 프로세스로 뜨는 Standalone 실행에 커맨드라인 인자로 전달됩니다. 에디터 프로세스 안에서 도는 in-process PIE(Selected Viewport 등)는 이 인자를 읽지 않으므로, 자동 로그인을 확인하려면 Standalone(New Editor Window를 Standalone로 띄우는 경우 포함) 모드로 실행하세요.

오해 주의

-AUTH_PASSWORD실제 비밀번호가 아닙니다. Dev Auth Tool에서 지정한 credential name(이름표)을 그대로 넣습니다. 에픽 계정 비밀번호를 여기에 적지 마세요.

multi멀티플레이 로컬 테스트

한 PC에서 서로 다른 플레이어로 동시에 로그인하려면 툴에 자격증명을 여러 개 등록합니다. 같은 툴 인스턴스에서 Login을 반복해 dev1, dev2 등 서로 다른 에픽 계정을 각각 이름표로 추가합니다.

그다음 Number of Players를 늘리고, 클라이언트마다 다른 -AUTH_PASSWORD를 쓰게 하면 각 창이 다른 플레이어로 로그인합니다. 멀티 클라이언트는 보통 별도 프로세스(Standalone)로 띄워 테스트합니다.

  1. 툴에 dev1, dev2 등 자격증명 등록(서로 다른 에픽 계정)
  2. Play 설정에서 Number of Players 2 이상으로 설정
  3. 각 클라이언트가 다른 credential을 쓰도록 파라미터 분기(또는 인스턴스별로 Standalone 실행 시 커맨드라인에 각각 전달)
  4. split-screen 대신 Standalone/별도 프로세스 모드로 실제 네트워크 경로 검증
참고

에디터의 Additional Launch Parameters는 모든 클라이언트에 공통 적용됩니다. 클라이언트별로 다른 credential을 주려면 Standalone exe를 각각 커맨드라인 인자로 실행하거나, 클라이언트 인덱스에 따라 credential을 분기하는 로직을 두는 방식을 씁니다.

tips가이드라인과 주의점

  • 개발 중에만 사용: Developer 인증은 개발 편의용입니다. 출시 빌드는 런처/스토어 연동 방식(예: exchangecode, Account Portal 등 정식 로그인)을 씁니다.
  • 툴은 계속 띄워둘 것: Dev Auth Tool이 실행 중이고 포트를 리스닝 중이어야 에디터가 포트로 자격증명을 받습니다. 개발 세션 내내 켜 두세요.
  • 포트·이름 정확히 일치: -AUTH_LOGIN의 포트와 툴 포트, -AUTH_PASSWORD와 credential name이 한 글자라도 다르면 로그인 실패합니다.
  • 패키징 Standalone exe: 빌드한 개발용 exe도 동일 파라미터를 커맨드라인으로 넘기면 똑같이 동작합니다. 예: MyGame.exe -AUTH_TYPE=Developer -AUTH_LOGIN=localhost:6300 -AUTH_PASSWORD=dev1
  • 방화벽/포트 충돌: 입력한 포트가 다른 프로세스에 점유되어 있으면 리스닝이 실패하거나 연결되지 않습니다. 충돌 시 다른 포트로 바꾸고 파라미터도 함께 수정하세요.
  • 자격증명 보존: Dev Auth Tool은 자격증명을 사용 간(between uses)에 기억하고, 선택한 포트도 다음 실행 시 자동 선택되도록 보존합니다. 도구를 닫았다 다시 켜도 자격증명이 남아 있어 재로그인이 필요 없는 것이 정상 동작입니다. (단, 토큰이 만료되면 갱신이 필요할 수 있으며, 이는 '종료=휘발'과는 별개 사안입니다.)
  • 다중 보유: 하나의 툴 인스턴스가 여러 credential을 동시에 보유할 수 있습니다. 멀티 계정 테스트에 별도 인스턴스를 띄울 필요는 없습니다.
Warning

Developer 인증 파라미터(-AUTH_*)와 credential은 개발 환경 한정입니다. 배포/공유 빌드 설정에 그대로 남기지 마세요. 외부 배포 시 로그인 실패 또는 의도치 않은 동작의 원인이 됩니다.

cpp로그인 코드 예시

게임 인스턴스나 적절한 곳에서 Identity 인터페이스를 얻어 로그인을 호출하고, 완료 델리게이트로 결과를 받습니다.

MyGameInstance.cpp
void UMyGameInstance::Login()
{
    IOnlineSubsystem* OSS = IOnlineSubsystem::Get();
    if (!OSS) return;

    IOnlineIdentityPtr Identity = OSS->GetIdentityInterface();
    if (!Identity.IsValid()) return;

    // 완료 콜백 등록
    Identity->AddOnLoginCompleteDelegate_Handle(
        0, FOnLoginCompleteDelegate::CreateUObject(
            this, &UMyGameInstance::OnLoginComplete));

    // AutoLogin은 위 Launch Parameters를 사용
    Identity->AutoLogin(0);
}

void UMyGameInstance::OnLoginComplete(
    int32 LocalUserNum, bool bWasSuccessful,
    const FUniqueNetId& UserId, const FString& Error)
{
    if (bWasSuccessful)
        UE_LOG(LogTemp, Log, "EOS 로그인 성공: %s", *UserId.ToString());
    else
        UE_LOG(LogTemp, Warning, "EOS 로그인 실패: %s", *Error);
}
07

핵심 기능 구현

로그인이 되면 나머지는 각 인터페이스를 통해 호출합니다. 자주 쓰는 기능과 담당 인터페이스를 정리했습니다.

기능 인터페이스 / 키워드 한 줄 설명
세션IOnlineSession방 생성·검색·참가. 데디케이티드/리슨 서버 모두 지원
로비Lobby (EOSGS)서버 없이 플레이어가 모이는 대기 공간
매치메이킹Session 검색 필터조건에 맞는 세션을 찾아 연결
친구·프레즌스IOnlineFriends / PresenceEAS 기반 친구 목록과 접속 상태
업적·통계IOnlineAchievements / Stats달성 조건과 누적 수치 기록
리더보드IOnlineLeaderboards통계 기반 순위표
P2PP2P / NetDriverEOS릴레이를 통한 피어 간 직접 통신
보이스챗IVoiceChat (EOS RTC)실시간 음성. 별도 플러그인 필요
안티치트Easy Anti-Cheat (EOS)클라이언트·서버 치트 방지. 별도 통합·부트스트랩 필요
플레이어 데이터Player Data Storage클라우드 세이브. EncryptionKey로 암호화

flow방 만들고 참가하기

로그인이 끝났다면 이제 실제로 방(세션)을 만들고 → 찾고 → 참가하는 흐름을 붙일 차례입니다. 호스트와 클라이언트 모두 IOnlineSession 인터페이스 하나로 처리하며, 각 호출은 완료 델리게이트로 결과를 돌려받습니다.

STEP 1 호스트 — 방 만들기

호스트가 세션 옵션을 채워 CreateSession을 호출하고, 완료되면 listen 옵션으로 맵을 열어 리슨 서버가 됩니다.

MyGameInstance.cpp · Host
void UMyGameInstance::HostSession()
{
    IOnlineSessionPtr Session = IOnlineSubsystem::Get()->GetSessionInterface();

    FOnlineSessionSettings S;
    S.bIsLANMatch            = false;   // EOS 릴레이로 연결
    S.NumPublicConnections   = 4;       // 최대 인원
    S.bShouldAdvertise       = true;    // 검색 목록에 노출
    S.bUsesPresence          = true;
    S.bUseLobbiesIfAvailable = true;    // EOS 로비로 생성
    S.Set(SEARCH_KEYWORDS, FString("MyGame"),
          EOnlineDataAdvertisementType::ViaOnlineService);

    Session->OnCreateSessionCompleteDelegates.AddUObject(
        this, &UMyGameInstance::OnCreateSessionComplete);
    Session->CreateSession(0, NAME_GameSession, S);
}

void UMyGameInstance::OnCreateSessionComplete(FName Name, bool bOK)
{
    if (bOK)                                  // 리슨 서버로 맵 오픈
        GetWorld()->ServerTravel("/Game/Maps/Lobby?listen");
}
STEP 2 클라이언트 — 방 검색

참가할 클라이언트는 FindSessions로 조건에 맞는 세션 목록을 받습니다. 검색 결과는 FOnlineSessionSearch에 채워집니다.

MyGameInstance.cpp · Find
TSharedPtr<FOnlineSessionSearch> Search;

void UMyGameInstance::FindGames()
{
    IOnlineSessionPtr Session = IOnlineSubsystem::Get()->GetSessionInterface();

    Search = MakeShared<FOnlineSessionSearch>();
    Search->MaxSearchResults = 20;
    Search->QuerySettings.Set(SEARCH_LOBBIES, true,
                              EOnlineComparisonOp::Equals);

    Session->OnFindSessionsCompleteDelegates.AddUObject(
        this, &UMyGameInstance::OnFindGamesComplete);
    Session->FindSessions(0, Search.ToSharedRef());
}

void UMyGameInstance::OnFindGamesComplete(bool bOK)
{
    if (bOK && Search->SearchResults.Num() > 0)
        JoinGame(Search->SearchResults[0]);   // 첫 결과에 참가
}
STEP 3 클라이언트 — 참가 & 입장

고른 결과로 JoinSession을 호출하고, 완료되면 GetResolvedConnectString으로 얻은 접속 문자열로 ClientTravel 하면 호스트의 맵으로 들어갑니다.

MyGameInstance.cpp · Join
void UMyGameInstance::JoinGame(const FOnlineSessionSearchResult& Result)
{
    IOnlineSessionPtr Session = IOnlineSubsystem::Get()->GetSessionInterface();
    Session->OnJoinSessionCompleteDelegates.AddUObject(
        this, &UMyGameInstance::OnJoinGameComplete);
    Session->JoinSession(0, NAME_GameSession, Result);
}

void UMyGameInstance::OnJoinGameComplete(
    FName Name, EOnJoinSessionCompleteResult::Type Type)
{
    IOnlineSessionPtr Session = IOnlineSubsystem::Get()->GetSessionInterface();
    FString Connect;
    if (Session->GetResolvedConnectString(NAME_GameSession, Connect))
        GetFirstLocalPlayerController()
            ->ClientTravel(Connect, TRAVEL_Absolute);   // 호스트 맵으로 입장
}
마무리 체크

이미 다른 세션에 들어가 있다면 새로 만들거나 참가하기 전에 DestroySession으로 정리하세요. NAME_GameSession은 엔진이 제공하는 기본 세션 이름 상수입니다. 검색 결과가 비어 있다면 호스트·클라이언트의 bUseLobbiesIfAvailable 설정이 일치하는지, Client Policy에 세션/로비 권한이 포함됐는지 확인하세요.

08

빌드와 배포

개발 중 쓰던 Dev Auth Tool·Account Portal은 출시 빌드에서 쓰지 않습니다. 배포 채널에 맞는 인증으로 바꾸고 환경을 라이브로 승격합니다.

  • Epic Games Store 배포 — 런처가 실행 시 넘겨주는 코드로 자동 로그인됩니다. 인증 타입을 exchangecode로 처리하세요. 별도 Dev Auth Tool이 필요 없습니다.
  • 샌드박스 → 라이브 승격 — 개발용 Sandbox/Deployment ID로 검증을 마쳤다면 출시용 환경의 ID로 교체합니다. 환경마다 데이터가 분리됩니다.
  • Client Policy 최소화 — 개발 중 넓게 열어 둔 권한을, 출시 빌드가 실제로 호출하는 기능만 남기도록 좁힙니다.
  • 패키징 후 검증 — 에디터(PIE)와 패키징된 빌드는 인증 경로가 다릅니다. 반드시 패키징된 Standalone 빌드로 로그인·세션을 다시 확인하세요.
Warning

출시 전 자격 증명과 EncryptionKey가 빌드 산출물에 평문으로 포함되지 않는지 다시 점검하세요. 민감 값은 플랫폼별 ini 분리나 빌드 시 주입 방식으로 관리하는 것이 안전합니다.

09

자주 겪는 문제

연동 초반에 반복되는 막힘들과 점검 포인트입니다.

증상 점검할 것
로그인이 즉시 실패한다Launch Parameters의 AUTH_TYPE 철자, Dev Auth Tool 실행 여부와 포트·이름 일치 확인
IOnlineSubsystem::Get()이 nullDefaultPlatformService=EOS 설정 여부, 플러그인 활성화 후 에디터 재시작 여부
친구·프레즌스가 비어 있다bUseEAS=true와 포털의 Epic Account Services·Scopes 설정
세션 참가가 안 된다Client Policy에 세션/P2P 권한 포함 여부, 넷드라이버 정의 정확성
빌드는 되는데 패키징 후 안 됨출시용 인증(exchangecode)과 라이브 Sandbox/Deployment ID로 전환했는지
통계·업적이 기록되지 않는다EOS는 Stat 이름을 모두 대문자로 변환합니다. 포털에도 대문자로 등록했는지, bMirrorStatsToEOS 토글이 켜져 있는지 확인
컴파일 에러(헤더 누락)Build.cs 의존성 추가 여부, 필요한 헤더 include 확인
로그 읽기

EOS 관련 로그는 출력 로그에서 LogEOS, LogOnline 카테고리로 확인합니다. 실패 시 SDK가 돌려주는 EOS_EResult 코드를 함께 보면 원인 범위를 빠르게 좁힐 수 있습니다.

10

참고 자료

공식 문서와 검증된 학습 자료입니다. 엔진 버전에 따라 화면과 설정이 조금씩 다를 수 있으니 본인 버전의 문서를 확인하세요.

이 가이드는 Online Subsystem EOS(OSSv1)를 기준으로 작성되었으며, 차세대 Online Services 경로의 설정 차이도 함께 다룹니다. 정확한 API 시그니처와 최신 변경 사항은 사용 중인 엔진 버전의 공식 문서를 기준으로 확인하시기 바랍니다.