영상을 불러오지 못했습니다

Steam 인증 티켓과 EOS Private Sandbox 권한 확인

702 단어
4 분
Steam 인증 티켓과 EOS Private Sandbox 권한 확인

Steam 계정으로 Epic Online Services 로그인을 시도하면 Private Sandbox에서만 실패했다. 티켓은 아래 코드로 요청했다.

SteamAPICall_t Call = SteamUser()->GetAuthTicketForWebApi("epiconlineservices");

문제 현상#

개발 환경에서는 Steam Web API ticket 발급까지 성공했다. 그러나 EOS 인증에 넘기면 특정 private sandbox에 로그인하지 못했다. 처음에는 GetAuthTicketForWebApi가 반환한 handle이나 ticket 생성 자체를 원인으로 의심했다.

적용 범위#

Steam external credential을 EOS Connect 또는 Auth 흐름에 연결하는 경우다. Epic Developer Portal에서 공개되지 않은 sandbox와 deployment를 운영할 때 적용된다.

원인#

Epic Developer Portal에서 해당 계정은 Player Group에 속해 있었고 target sandbox도 허용된 상태였다. 하지만 그 안에서 실제로 사용하는 deployment가 빠져 있었다. Private Sandbox는 sandbox 이름만 맞춰서는 접근하지 못하며 계정 그룹이 필요한 deployment까지 사용할 수 있어야 했다.

Player Group에 등록된 테스트 계정과 제품 접근 설정
Player Group에 등록된 테스트 계정과 제품 접근 설정

Player Group에 Sandbox와 Deployment를 함께 허용한 설정
Player Group에 Sandbox와 Deployment를 함께 허용한 설정

재현 및 진단#

  1. Steam API call handle과 GetTicketForWebApiResponse_t callback을 구분해 기록한다.
  2. callback의 result, ticket byte length와 service identity 문자열을 점검한다.
  3. EOS 로그를 보고 credential 검증 실패인지 sandbox/deployment 접근 거부인지 구분한다.
  4. Product Settings의 Player Group에 테스트 계정이 포함됐는지 살핀다.
  5. 그룹의 sandbox뿐 아니라 실제 deployment 권한도 대조한다.

해결 방법#

target sandbox와 deployment를 테스트 계정의 Player Group에 모두 추가했다. 권한 반영을 기다린 다음 새 ticket으로 로그인 흐름을 다시 시작하자 인증이 완료됐다.

Steam의 GetAuthTicketForWebApi는 비동기 요청 handle을 반환한다. 이 값만으로 ticket 유효성을 판정하지 않는다. callback 결과와 실제 ticket payload까지 확인해야 한다. 이번 사례는 Steam ticket 생성 코드가 아니라 EOS 접근 제어 설정을 고쳐 해결했다.

검증 방법#

  • 권한이 있는 계정과 없는 계정으로 각각 로그인해 접근 제어가 의도대로 동작하는지 확인한다.
  • 다른 sandbox/deployment 조합으로 바꿔 교차 시험한다.
  • ticket 재사용이나 만료를 피하려면 매 시도에서 새 ticket을 발급한다.
  • client 로그에는 ticket 본문, Steam ID, product secret을 남기지 않는다.

주의점#

Player Group에 모든 사용자를 넣으면 문제는 가려지지만 production 접근 범위가 넓어진다. 테스트 그룹에는 최소 권한만 부여한다. 스크린샷과 로그를 공유하기 전에는 계정·제품명·식별자를 제거한다.

참고 자료#

글 공유하기

이 글이 도움이 되셨다면 다른 사람과 공유해 주세요!

Steam 인증 티켓과 EOS Private Sandbox 권한 확인
https://hon454.github.io/posts/steam-eos-private-sandbox-web-api-auth-ticket/
작성자
Jihoon Jeon
게시일
2023-11-13
라이선스
CC BY-NC-SA 4.0
관련 게시글스마트
1
면접 오답노트: 말하지 못한 주요 개념, Net Relevancy
Unreal Engine면접에서 제대로 답하지 못한 Net Relevancy를 다시 정리한다. AActor::IsNetRelevantFor의 판정 순서와 문서와 다른 부분, Owner가 판정을 바꾸는 방식, 연관성을 잃고 되찾을 때 RelevantTimeout과 액터 파괴, BeginPlay, OnRep, RPC에 생기는 일, ForceNetRelevant와 Replication Graph, Iris에서의 주의점, Dormancy, Priority와의 차이를 다룬다.
2
언리얼 엔진의 리플리케이션 및 RPC 순서 보장
Unreal Engine프로퍼티 복제와 OnRep, RPC의 순서 보장 범위를 살펴보고, 일시적인 상태 불일치와 액터 간 준비 순서를 처리하는 방법을 예시로 정리한다.
3
[노트] Unreal Engine Skills for Claude Code
Unreal EngineEpic Games가 공개한 Claude Code 플러그인 Unreal Engine Skills for Claude Code의 스킬 3개와 SessionStart 훅을 읽고, 스킬의 트리거 설계와 문서화 규칙, 엔진 쪽 Agent Skill, 보안 경고의 범위, MCP와 스킬의 역할 분담, Claude Code용만 나온 점에 대한 생각을 정리한다.
4
언리얼 엔진 5.8 MCP로 본 게임 개발과 에이전틱 코딩의 거리
Unreal Engine언리얼 엔진 5.8 MCP를 Claude Code와 Codex로 써 보고 Epic 세션을 보며, All Toolsets에 이미 포함된 Editor Toolset, 일괄 작업과 비용, 에디터 의존성, 프로젝트 구조 지식의 필요성에 대해 생각한 점을 정리한다.
5
Night of the Dead 멀티플레이를 지금 다시 설계한다면
Unreal EngineNight of the Dead의 멀티플레이 최적화를 새 프로젝트에서 처음부터 설계한다면 바꿀 부분을 좀비의 Mass 전환, Push Model과 Fast Array와 연결별 서브오브젝트 필터를 쓰는 복제, 애플리케이션 계층의 전송 흐름 제어로 나눠 기존 코드와 비교한다.
무작위 게시글무작위

댓글

Profile Image of the Author
Jihoon Jeon
안녕하세요! 서브컬처와 자전거를 사랑하는 개발자 전지훈입니다.
공지사항
제 블로그에 오신 것을 환영합니다! 예시 공지입니다.
카테고리
태그
최신 일상
사이트 통계
게시글
73
카테고리
10
태그
143
총 단어 수
133,527
운영 일수
0일
최근 활동
0일 전
사이트 정보
빌드 플랫폼
GitHub Actions
블로그 버전
Firefly v6.16.9
라이선스
CC BY-NC-SA 4.0
목차