클라이언트에 표시되는 정보와 자산을 이해하는 것은 게임의 보안과 기밀성을 유지하는 데 매우 중요합니다. 개발자들은 종종 악용자에게 얼마나 많은 정보가 표시되고 클라이언트에 복제되는지를 과소평가합니다. 악용자는 단일 장소에 참여할 수 있다면 자신의 우주 내 "제한된" 장소에 접근할 수 있는 능력을 가지고 있습니다. 그들은 현재 사용 중인지 여부와 관계없이 클라이언트에 복제된 모든 콘텐츠를 볼 수 있습니다. 또한, 악용자는 클라이언트에서 실행되지 않더라도 복제된 모든 로컬 스크립트와 ModuleScript를 디컴파일할 수 있습니다.
우주 내 클라이언트 측 텔레포트
우주에 들어가면 클라이언트는 해당 우주 내의 모든 장소로 텔레포트할 수 있으며, 이는 의도된 접근 제한이나 진행 게이트를 우회할 수 있습니다. 이는 개발 또는 스테이징 게임에서 미공개 콘텐츠가 의도치 않게 유출되는 결과를 초래할 수 있습니다. 다음 사항을 이해하는 것이 중요합니다:
- "직접 접근"을 비활성화하면 웹사이트의 하위 장소에서 참여 버튼만 제거됩니다. 클라이언트가 시작한 텔레포트를 방지하지는 않습니다.
- 악용자가 귀하의 우주 내 모든 하위 장소의 존재를 발견할 것이라고 가정하십시오.
- 클라이언트는 루트 장소와 같은 단일 장소에 접근할 수 있다면 어떤 하위 장소로도 텔레포트할 수 있습니다. 이는 귀하의 의도된 설계 흐름과 관계없이 가능합니다.
많은 개발자들이 무단 사용자를 하위 장소에서 퇴장시켜 접근을 방지하려고 합니다. 이는 게임 플레이를 차단하는 데는 효과적일 수 있지만, 플레이어가 참여하는 즉시 복제가 시작되므로 클라이언트에 콘텐츠가 복제되는 것을 방지하지는 않습니다.
안전한 텔레포트 사용
무단 접근을 방지하는 가장 효과적인 방법은 Creator Dashboard에서 장소에 대한 접근 제어를 우주 내에서만 안전하게 설정하는 것입니다. 이는 모든 비시작 장소를 서버 시작 텔레포트로만 제한하여, 플레이어가 하위 장소에 참여하기 전에 플랫폼 수준에서 클라이언트 시작 텔레포트를 차단합니다. 플레이어가 참여하지 않기 때문에 어떤 콘텐츠도 그들에게 복제되지 않습니다.
클라이언트 시작 텔레포트를 사용하는 기존 게임에 대한 구성 단계 및 마이그레이션 가이드는 장소 간 텔레포트를 참조하세요.
제한된 장소에 대한 심층 방어
안전한 텔레포트를 사용할 수 없는 우주에 대해, 또는 그와 함께 추가적인 보호 계층으로 다음 조치를 결합하십시오:
- 개발 및 테스트 장소를 별도의 비공식 우주에 보관 — 이는 미공개 콘텐츠의 기밀성을 보장하는 유일한 신뢰할 수 있는 방법입니다. 기밀 이벤트 자산, 스크립트 또는 UI 요소를 활성화될 예정인 프로덕션 환경에 배포하지 마십시오.
- 가능하다면 스트리밍을 사용하여 새로운 플레이어에게 복제되는 세계의 양을 제한하십시오.
- 서버 측 그룹 역할 또는 배지 검증을 추가하고 플레이어 상태 또는 진행 요구 사항을 확인하십시오.
- 기본적으로 들어오는 플레이어를 허용하지 마십시오. 이는 검증 프로세스가 결론에 도달하지 못하더라도 어떤 플레이어도 허용되지 않도록 보장합니다. 예를 들어 엔진에서 예외가 발생하는 경우입니다.
- 실용적이라면 검증에 실패한 플레이어에 대해 Ban API를 사용하십시오. 이는 플레이어가 동일한 계정으로 계속 참여하려고 시도하는 것을 방지합니다.
복제
복제는 엔진의 인스턴스 간에 상태가 네트워크를 통해 전송되는 방식을 설명합니다. Roblox의 복제 모델은 일반적으로 몇 가지 주요 방식으로 단순화됩니다:
- 인스턴스는 서버 권한이 있으며, 이는 인스턴스가 모든 참가자(서버 및 모든 연결된 클라이언트) 간에 복제되기 위해서는 서버에서 생성되어야 함을 의미합니다.
- 인스턴스 속성도 서버 권한이 있으며, 이는 대부분의 속성이 모든 클라이언트에서 변경 사항이 보이도록 하려면 서버에서 변경되어야 함을 의미합니다.
- 일반적으로 인스턴스는 모든 연결된 클라이언트에 복제되거나 복제되지 않습니다. 스트리밍과 같은 몇 가지 예외가 있습니다.
복제 컨테이너는 클라이언트에 복제되는 최상위 인스턴스(DataModel 아래에 부모로 설정됨)입니다. 인스턴스가 생애 동안 복제 컨테이너의 자손이 되는 경우, 그 상태의 대부분이 모든 클라이언트에 복제될 것으로 예상해야 합니다. 일반적인 복제 컨테이너에 대한 자세한 내용은 데이터 모델 가이드를 참조하십시오. 의심스러운 경우, Play Solo와 같은 테스트 환경에서 인스턴스나 속성이 어떻게 복제되는지 항상 확인할 수 있습니다. 테스트 모드에 대한 자세한 내용은 Studio 테스트 모드를 참조하십시오.
복제의 보안적 의미
클라이언트에 복제되는 모든 콘텐츠는 악용자에 의해 추출되고 데이터 마이닝될 수 있습니다. 일반적으로 기밀 콘텐츠를 라이브 프로덕션 환경에 게시하거나 배포하는 것을 피하십시오. 사용자가 이를 볼 준비가 되어 있지 않다면 더욱 그렇습니다. 콘텐츠의 출시 또는 접근을 게임 내에서 나중 날짜(또는 다른 조건)까지 차단하는 로직이 있더라도, 악용자가 콘텐츠가 게시되는 즉시 이를 발견하고 유출할 방법을 찾을 것이라고 가정하십시오.
민감한 인스턴스에 대해 지나치게 설명적이거나 예측 가능한 이름을 피하십시오. 여기에는 스크립트, 원격 및 모델이 포함되지만 이에 국한되지 않습니다. 예측 가능한 DataModel 계층 구조는 악용을 개발하기 쉽게 만듭니다.
스크립트 디컴파일
LocalScript, Script (RunContext::Client 포함) 또는 ModuleScript는 클라이언트에 복제된 후 악용자에 의해 디컴파일될 수 있습니다. 이러한 스크립트가 비활성화되거나 필요하지 않거나 클라이언트에서 실행되지 않더라도 마찬가지입니다. ServerStorage 또는 ServerScriptService에 저장된 서버 전용 스크립트와 ModuleScript는 클라이언트에 복제되지 않기 때문에 디컴파일될 수 없습니다.
서버 전용 및 클라이언트 전용 코드를 동일한 스크립트에 포함하는 ModuleScript를 작성하는 것은 바람직하지 않습니다. 서버 측 로직이 디컴파일에서 노출되며, 악용될 수 있는 버그를 더 쉽게 분석할 수 있기 때문입니다.
local module = {}
local Remote = script:WaitForChild("RemoteEvent")
-- 피해야 할 패러다임의 예입니다.
-- 서버 코드는 Script 인스턴스 또는 ServerStorage/ServerScriptStorage에 보관하세요!
if game:GetService("RunService"):IsServer() then
function module:DoServerThing(password)
if password == "SecretPassword" then
print("민감한 서버 코드")
end
end
Remote.OnServerEvent:Connect(function(player, password)
module:DoServerThing(password)
end)
else
function module:DoServerThing(password)
Remote:FireServer(password)
end
end
return modulelocal table1 = {};
local RemoteEvent = script:WaitForChild("RemoteEvent");
if game:GetService("RunService"):IsServer() then
function table1.DoServerThing(_, p2) -- Line: 9
if p2 == "SecretPassword" then
print("민감한 서버 코드");
end
end
RemoteEvent.OnServerEvent:Connect(function(player: Player, p3) -- Line: 15
--[[
Upvalues:
[1] = table1
--]]
table1:DoServerThing(p3);
end);
return table1;
end
function table1.DoServerThing(_, p1) -- Line: 19
--[[
Upvalues:
[1] = RemoteEvent
--]]
RemoteEvent:FireServer(p1);
end
return table1;위에서 보듯이, 디컴파일은 하드코딩된 비밀번호, 비즈니스 규칙 및 악용자가 취약점을 분석할 수 있는 구현 세부정보를 포함한 서버 측 로직을 드러냅니다.
기밀성 위반의 영향
기밀성 위반은 다음과 같은 중대한 결과를 초래할 수 있습니다:
- 콘텐츠 유출: 미공개 아이템, 맵 또는 기능이 공식 발표 전에 발견되어 공개될 수 있습니다.
- 경쟁적 불리: 메커니즘, 알고리즘 또는 다가오는 기능이 경쟁자에 의해 리버스 엔지니어링될 수 있습니다.
- 악용 개발: 노출된 서버 로직은 악용자가 취약점을 식별하고 표적 공격을 개발하는 데 더 빠르고 쉽게 만듭니다.