2026-07-13 TIL (96์ผ์ฐจ)
๐ TIL โ 2026.07.13 (์ผ) : EOS ํด๋ผ์ด์ธํธ ๋ก๊ทธ์ธ ๋ฐฉ์ ํ์ ๊ธฐ
ํ ์ค ์์ฝ
DeviceID ์ต๋ช
๋ก๊ทธ์ธ์ ์๋ํ๋ค ์ธ๋ฆฌ์ผ ์์ง ์คํก ํ๋ฌ๊ทธ์ธ์ ํ๊ณ๋ฅผ ํ์ธํ๊ณ , EAS(์ํฝ ๊ณ์ ์๋น์ค) ์ ํ๋ฆฌ์ผ์ด์
์ด ๋๋ฉ์ธ ์ธ์ฆ ์์ด๋ ์ด์(Draft) ๋ชจ๋๋ก ๋์ํจ์ ๋ฐ๊ฒฌํ์ฌ accountportal(๋ธ๋ผ์ฐ์ ๋ก๊ทธ์ธ) ๋ฐฉ์์ผ๋ก ์ต์ข
ํ์ ํจ. ์ค์ฝํ(Scope) ๋ถ์ผ์น ๋ฌธ์ ๊น์ง ์ก์๋ด์ด ๋ก๊ทธ์ธ ํ๋ก์ฐ ์์ฑ.
์ค๋์ ๋ชฉํ
- ํ์์๊ฒ
.exe๋ง ๋ฐฐํฌํ๋ฉด ๋ณ๋ ๋๊ตฌ(DevAuthTool) ์์ด ์์์ ๋ก๊ทธ์ธ๋๊ณ ๋ฐฉ ์์ฑ/์ฐธ๊ฐ๊ฐ ๋๋ ๊ตฌ์กฐ ๋ง๋ค๊ธฐ. - ๋ก๊ทธ์ธ ๋ฐฉ์ ํ๋ณด: DeviceID(์ต๋ช , ์ฐฝ ์์) vs accountportal(์ํฝ ๊ณ์ , ๋ธ๋ผ์ฐ์ ์ฐฝ)
์งํ ๋ด์ฉ (์๊ฐ์)
1. INI ์๋ฆฌํ์์ ์ฌ๊ณ โ EOS ์ด๊ธฐํ ์คํจ ๋๋ฒ๊น
- ํ์: ์ฒซ ์คํ์์
ClientCredentials.ClientId must be an ANSI string between 1 and 64 in length+EOS_NotConfigured์๋ฌ ๋ฐ์. - ์์ธ:
DefaultEngine.ini์Artifacts์ ์ค์ ์๊ฒฉ์ฆ๋ช ๋์ ํ๊ธ ์๋ฆฌํ์์(โํด๋ผ์ฉ_ClientIdโ)๊ฐ ๊ทธ๋๋ก ๋ค์ด์์์. - ๋ถ์: EOS ์ด๊ธฐํ๊ฐ ์คํจํ๋ฉด ์ธ๋ฆฌ์ผ ์์ง์ด ์กฐ์ฉํ
Null(LAN)์๋ธ์์คํ ์ผ๋ก ํด๋ฐฑ(Fallback)ํ๋ค๋ ๊ฒ์ ๋ก๊ทธ๋ก ํ์ธ. (FindSessions ์์ (LAN=1)์ด ๊ทธ ์ฆ๊ฑฐ) - ๊ตํ:
LAN=0/1๋ก๊ทธ ํ ์ค์ด ํ์ฌ ์ด๋ค ์๋ธ์์คํ ์ผ๋ก ๋๊ณ ์๋์ง ์๋ ค์ฃผ๋ ๊ฐ์ฅ ๋น ๋ฅด๊ณ ํ์คํ ์งํ๋ค.
2. DeviceID ๋ก๊ทธ์ธ ์๋์ ์ข์ด
๋ชฉํ๋ โ์ฐฝ ์๋ ์์ ์๋ ๋ก๊ทธ์ธโ์ด์์ผ๋ ํ๋ฌ๊ทธ์ธ ํ๊ณ๋ก ๋ฐฉํฅ์ ์ ํํจ.
- ์๋ ๋ด์ญ:
- Dev Portal: GameClient ์ ์ฑ ์ Custom์ผ๋ก ์ ํ, Sessions ๊ถํ ์๋ ๊ตฌ์ฑ.
- INI:
bUseEAS=false,bUseEOSConnect=true - ์ฝ๋:
FOnlineAccountCredentials์deviceid,externalauth๋ฑ ์ฌ๋ฌ ํ์ ๋ฌธ์์ด ์๋ โ ์ ๋ถExternal Auth Token Type not specified์คํจ.
- ์์ง ์์ค ์ง์ ๋ถ์ (
UserManagerEOS.cpp) ๊ฒฐ๊ณผ:Login()์ ์กฐ๊ฑด์ ๋ฐ๋ผCallEOSConnectLogin()๊ฒฝ๋ก๋ก ์ ์ ๋ถ๊ธฐํ๊ณ ์์์.- ํ์ง๋ง
CallEOSConnectLogin()์ Type ๋ฌธ์์ด์ ์ฝ๋ก ์ผ๋ก ํ์ฑํ๋externalauth:<์ธ๋ถํ์ >ํ์์ ๊ฐ์ ์๊ตฌํจ. - ๊ฒฐ์ ์ ์์ธ: ํ์ผ ์ ์ฒด์
deviceid๊ด๋ จ ์ฝ๋๊ฐ 0๊ฑด. ์ฆ, ์คํก(๊ธฐ๋ณธ) ํ๋ฌ๊ทธ์ธ์๋ DeviceID๋ฅผ ์์ฑํด์ฃผ๋ ์ง์ ์ ์์ฒด๊ฐ ๊ตฌํ๋์ด ์์ง ์์.
- ์ฐํ ์๋ ๋ฐ ํฌ๊ธฐ: SDK ์ง์ ํธ์ถ(
EOS_Connect_CreateDeviceId)์ ์ํดIOnlineSubsystemEOS::GetEOSPlatformHandle()์ ์ฐ๋ ค ํ์ผ๋, ํ๋ฌ๊ทธ์ธ ๊ตฌํ๋ถ๊ฐ Private์ผ๋ก ์จ๊ฒจ์ ธ ์์ด ์์ ๋ ๋๋น ๋ฆฌ์คํฌ๊ฐ ํฌ๋ค๊ณ ํ๋จ. - ๊ตํ & ๋ณด์ถฉ: ์คํก OSS EOS ํ๋ฌ๊ทธ์ธ์ Connect(NoEAS) ๊ฒฝ๋ก๋ Steam ๋ฑ โํ ํ๋ซํผ์ ๋ค์ดํฐ๋ธ ํ ํฐโ ์ฐ๋์ ์ ์ ๋ก ์ค๊ณ๋์ด ์์ต๋๋ค. ์์ DeviceID ๋ก๊ทธ์ธ์ ์ํ๋ค๋ฉด ์ปค์คํ C++ ๋ํผ๋ฅผ ์์ฑํ๊ฑฐ๋, Redpoint Games์ EOS ํ๋ฌ๊ทธ์ธ(๋ฌด๋ฃ) ๊ฐ์ ์๋ํํฐ ํ์ฅ์ ์ฐ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ ๋๋ค.
3. ๋ฐฉํฅ ์ ํ: EAS ์ ํ๋ฆฌ์ผ์ด์ ์์ฑ ์ฑ๊ณต (๋๋ฉ์ธ ์์ด!)
- ํ์: ์ด์ ์๋ ๋๋ฉ์ธ ์ธ์ฆ(DNS TXT ๋ ์ฝ๋)์์ ๋งํ๋ค๊ณ ํ๋จํ์.
- ํด๊ฒฐ: ๋ธ๋๋ ์ค์ ์ โ๋ฏธ์์ฑโ์ผ๋ก ๋๊ณ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ฑ + ๊ถํ + ์ฐ๋ ํด๋ผ์ด์ธํธ ๊ตฌ์ฑ์ด ๊ฐ๋ฅํจ์ ํ์ธ.
- ์ต์ข ์ํ: ๊ถํ โ (Basic Profile๋ง) / ์ฐ๋๋ ํด๋ผ์ด์ธํธ โ (GameClient๋ง) / ๋ธ๋๋ ์ค์ ๋ฏธ๊ตฌ์ฑ(์ด์)
- ๊ฒฐ๊ณผ: โ์ด์(Draft) ๋ชจ๋โ์์๋ ๋๋ฉ์ธ ์ธ์ฆ์ด๋ ๋ธ๋๋ ๋ฆฌ๋ทฐ ์์ด๋ ๋ก๊ทธ์ธ ๋์์ด ๊ฐ๋ฅํฉ๋๋ค. ๋๊ฐ๋ก ์ ์ ์๊ฒ โํ์ธ๋์ง ์์ ์ฑโ ๋ ธ๋์ ๊ฒฝ๊ณ ํ์ด์ง๊ฐ ํ๋ ๋จ์ง๋ง(๊ณ์ ์งํ ๊ฐ๋ฅ), ๊ฐ๋ฐ ๋จ๊ณ์์๋ ์ ํ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค. (์ถ์ ์ ์๋ง ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ์ผ๋ฉด ๋จ)
4. ์ค์ฝํ ๋ถ์ผ์น โ friends_list 403 ์๋ฌ
- ํ์:
accountportal๋ก๊ทธ์ธ ์ฐฝ๊น์ง ๋๋ฌํ์ผ๋ โํด๋ผ์ด์ธํธ์ ๋ค์์ ๋ฒ์ฃผ๋ฅผ ์์ฒญํ ์ ์๋ ๊ถํ์ด ์์ต๋๋ค: friends_listโ ์๋ฌ ๋ฐ์. - ์์ธ: ์๋ํฐ GUI(Project Settings)๋ก ์ค์ ์ ์ ์ฅํ๋ฉด์
AuthScopeFlags์BasicProfile,FriendsList,Presence3๊ฐ๊ฐ ์๋ ๊ธฐ๋ก๋จ. EAS ์ฑ ์ค์ ์์๋BasicProfile๋ง ํ์ฉํ์ผ๋ฏ๋ก ์์ฒญ > ํ์ฉ ์ํ๊ฐ ๋์ด ํ๊น. ํด๊ฒฐ: INI ํ์ผ์์ ๋ฐฐ์ด์ ๋น์ฐ๊ณ ํ๋๋ง ๋ช ์์ ์ผ๋ก ๋ฑ๋ก.
1 2
!AuthScopeFlags=ClearArray +AuthScopeFlags=BasicProfile
๊ตํ: ๊ฒ์์ด ์์ฒญํ๋ ์ค์ฝํ์ EAS ์ฑ์ด ํ์ฉํ๋ ์ค์ฝํ๋ 100% ์ผ์นํด์ผ ํฉ๋๋ค. (๋ก๊ทธ์ธ ํ SDK๊ฐ ์๋์ผ๋ก ์น๊ตฌ ๋ชฉ๋ก์ ์กฐํํ๋ค ๋ฐ์ํ๋
insufficient_scopes403 Warning์ ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ ์ํ์ด๋ฏ๋ก ๋ฌด์ํด๋ ๋ฌด๋ฐฉํฉ๋๋ค.)
5. ๋ก๊ทธ์ธ ์ฑ๊ณต & ๋์ ํ๋ก์ฐ ์ ๋ฆฌ
| ํ๋ก์ธ์ค | ์ธ์ฆ ๋ฐฉ์ | ์ฐฝ ํ์ | ๋น๊ณ |
|---|---|---|---|
| ๋ฐ๋์๋ฒ | TrustedServer ์๊ฒฉ์ฆ๋ช | ์์ | ์๋ฒ๋ ๋ก๊ทธ์ธ ๊ฐ๋ ์์ฒด๊ฐ ์์. (User required ํด์ ) |
| ํด๋ผ ์ต์ด ์คํ | accountportal (๋ธ๋ผ์ฐ์ ) | 1ํ ๋ธ | ์ํฝ ๊ณ์ ๋ก๊ทธ์ธ |
| ํด๋ผ ์ฌ์คํ | persistentauth (์ ์ฅ ํ ํฐ) | ์์ | ํ ์คํธ ํ์ค์ฑ์ ์ํด ์ดํ ์ ์ฑ ๋ณ๊ฒฝ์ผ๋ก ์ ๊ฑฐํจ |
6. ์ ๋ น ์ธ์ ๋ฌธ์ (Ghost Sessions)
- ํ์: ๋ฐฉ ๋ชฉ๋ก์ โCrazyRoo Room 4/4 0msโ๊ฐ 2๊ฐ์ฉ ๋จ์์๋ ํ์ ๋ฐ์.
- ์์ธ: ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ ์ข
๋ฃํ๋ฉด
DestroySession์ด ์คํ๋์ง ์์ EOS ๋ฐฑ์๋์ ์ธ์ /์ฐธ๊ฐ ์ฌ๋กฏ์ด ๊ทธ๋๋ก ๋จ์. - ํด๊ฒฐ:
- ์์ฌ UnrealEditor ํ๋ก์ธ์ค ํ์ธ ๋ฐ ์ข ๋ฃ ํ ๋๊ธฐ.
Deinitialize()๋ฑ ์ ์ ์ข ๋ฃ ๊ฒฝ๋ก์DestroySession(NAME_GameSession)์ถ๊ฐ.
๋ณด์ถฉ: EOS ๋ฐฑ์๋๋ ํํธ๋นํธ(Heartbeat) ํต์ ์ด ๋๊ธฐ๋ฉด ์๋์ผ๋ก ์ธ์ ์ ์ฒญ์ํ์ง๋ง, ํ์์์๊น์ง ๋ณดํต ์ ๋ถ(2~3๋ถ)์ด ๊ฑธ๋ฆฝ๋๋ค. ๊ฐ๋ฐ ์ค ํฌ๋์๋ก ์ธํ ์ ๋ น ์ธ์ ์ ์ด ํ์์์์ ๊ธฐ๋ค๋ฆฌ๋ ์๋ฐ์ ์์ต๋๋ค.
7. ๋ก๊ทธ์ธ UX ๋ณ๊ฒฝ: ํญ์ ๋ฌผ์ด๋ณด๊ธฐ
- ํ์:
persistentauth์๋ ๋ก๊ทธ์ธ์ ์ ๊ฑฐํ๊ณ ๋งค ์คํ๋ง๋คaccountportal์ ๋์ฐ๋๋ก ํ๋ฆ ๋ณ๊ฒฝ. - ๋น๊ณ : ๋จ, ๋ธ๋ผ์ฐ์ ์ ์ํฝ ์น ๋ก๊ทธ์ธ ์ฟ ํค๊ฐ ์ด์์์ผ๋ฉด ๋น๋ฐ๋ฒํธ ์ ๋ ฅ ์์ด โ๋์โ ํ๋ฉด๋ง ์ง๋๊ฐ๊ฒ ๋จ. ์ด๋ ๊ฒ์์ด ์ ์ดํ ์ ์๋ ์น ๋ธ๋ผ์ฐ์ ๋จ์ ์บ์ ์์ญ์.
์ค๋ ๋ฐฐ์ด ๊ฒ ํต์ฌ
- OSS ์ถ์ํ์ ๊ฒฝ๊ณ:
IOnlineIdentity::Login()์ ์๊ฒฉ์ฆ๋ช ๋ฌธ์์ด ํด์์ ํ๋ฌ๊ทธ์ธ๋ง๋ค ๊ท์น์ด ๋ค๋ฅด๋ค. ๋งํ๋ฉด ์ถ์ธกํ์ง ๋ง๊ณ ์์ง ์์ค์์ ์๋ฌ ๋ฌธ์์ด์ ์ง์ ๊ฒ์ํ๋ผ. - EAS ์ด์(Draft) ๋ชจ๋์ ์ ์ฉ์ฑ: ๋๋ฉ์ธ ์ธ์ฆ์ด๋ ๋ธ๋๋ ๋ฆฌ๋ทฐ๊ฐ ์์ด๋ ๊ถํ๊ณผ ์ฐ๋ ํด๋ผ์ด์ธํธ๋ง ๊ตฌ์ฑํ๋ฉด ๊ฐ๋ฐ/ํ ์คํธ์ฉ ๋ก๊ทธ์ธ์ด ์๋ฒฝํ๊ฒ ๋์ํ๋ค.
- ๋ช
์์ ์ธ ์ธ์
์ ๋ฆฌ: EOS ์ธ์
์ ํ๋ก์ธ์ค ๊ฐ์ ์ข
๋ฃ ์ ๋ฐฑ์๋์ ์ ๋ น์ผ๋ก ๋จ๋๋ค. ์ ์ ์ข
๋ฃ ์๋ช
์ฃผ๊ธฐ์ ๋ฐ๋์
DestroySession์ ์ฌ์ด๋์.
๋ค์ ํ ์ผ
- ์ ๋ น ๋ฐฉ ์๋ฉธ ํ์ธ ํ, ๋ก์ปฌ ์๋ฒ + ํด๋ผ์ด์ธํธ๋ก ๋ฐฉ ์์ฑ/์ฐธ๊ฐ ํ๊ท ํ ์คํธ ์งํ.
- ํ์ฌ ์ฝ๋/INI ๊ธฐ์ค์ผ๋ก ์๋ฒ ์ฌํจํค์ง โ AWS EC2 ์
๋ก๋ โ
CreateSession์ฑ๊ณต ์ฌ๋ถ ํ์ธ. - [์ค์] ํด๋ผ [๋ฐฉ ์์ฑ] โ AWS ์ ์ ์ ClientTravel ์ฃผ์๊ฐ EC2์ โํผ๋ธ๋ฆญ IPโ์ธ์ง ๊ฒ์ฆ. (NAT ํ๊ฒฝ์ธ EC2 ํน์ฑ์ ์ฌ์ค IP๊ฐ ์ฐํ๋ค๋ฉด ๋ฉํ๋ฐ์ดํฐ ์ค๋ฒ๋ผ์ด๋ ์ฝ๋ ์ถ๊ฐ ํ์)
Game Default Map = TitleMap์ค์ ํ ํด๋ผ ํจํค์ง โ ์ธ์ ์์ด exe ์คํ ๊ฒ์ฆ โ ํ์ ๋ฐฐํฌ.- Secret์ด ํฌํจ๋
DefaultEngine.ini์ Git ์ปค๋ฐ ์ ์ฑ ๊ฒฐ์ (๋ถ๋ฆฌ/ignore ์ฒ๋ฆฌ ํ ํ์์ Secret ์ฌ๋ฐ๊ธ). - ๋ก๋น ์ด๋ฆ ํ์:
PlayerState->GetPlayerName()์ผ๋ก ์ํฝ ๋๋ค์์ด ์ ์์ ์ผ๋ก ๋ถ๋ฌ์์ง๋์ง ํ์ธ.