접근 제어 및 기밀성

*이 콘텐츠는 AI(베타)를 사용해 번역되었으며, 오류가 있을 수 있습니다. 이 페이지를 영어로 보려면 여기를 클릭하세요.

클라이언트에 보이는 정보와 자산을 이해하는 것은 경험의 보안과 기밀성을 유지하는 데 매우 중요합니다. 개발자들은 종종 악용자에게 얼마나 많은 내용이 보이고 클라이언트에 복제되는지 과소평가합니다. 악용자는 단일 장소에 입장할 수 있다면 자신의 세계 내 "제한된" 장소에 접근할 수 있습니다. 그들은 현재 보이거나 사용 중인지에 관계없이 클라이언트에 복제된 모든 콘텐츠를 볼 수 있습니다. 또한, 악용자는 클라이언트에서 실행되지 않는 경우에도 복제된 모든 로컬 스크립트 및 모듈 스크립트를 디컴파일할 수 있습니다.

우주 내 클라이언트 측 텔레포트

일단 우주에 들어가면 클라이언트는 해당 우주 내의 모든 장소로 텔레포트할 수 있으며, 이는 의도된 접근 제한이나 진행 게이트를 우회할 수 있습니다. 이렇게 하면 개발 환경이나 스테이징 경험에서 비공식 콘텐츠가 유출될 수 있습니다. 다음 사항을 이해하는 것이 중요합니다:

  • "직접 접근"을 비활성화하면 웹사이트에서 하위 장소의 참여 버튼만 제거됩니다. 클라이언트가 시작하는 텔레포트를 방지하지 않습니다.
  • 악용자는 귀하의 우주 내에 있는 모든 하위 장소의 존재를 발견할 것이라고 가정하십시오.
  • 클라이언트는 루트 장소와 같은 단일 장소에 접근할 수 있다면 어떤 하위 장소로도 텔레포트할 수 있습니다. 이는 귀하의 의도된 디자인 흐름과는 관계없이 발생합니다.

많은 개발자들이 하위 장소에서 무단 사용자를 퇴출시켜 접근을 차단하려고 합니다. 이것은 게임 플레이를 차단하는 데는 효과적일 수 있지만, 콘텐츠가 클라이언트에 복제되는 것을 막지 못합니다. 복제는 플레이어가 들어오자마자 시작되며 서버 측 퇴출 로직이 실행되기 전에 발생하기 때문입니다.

보안 텔레포트 사용

무단 접근을 방지하는 가장 효과적인 방법은 Creator Dashboard에서 우주 내에서만 안전으로 장소 접근 제어를 설정하는 것입니다. 이렇게 하면 모든 비시작 장소가 서버에서 시작된 텔레포트만 사용할 수 있게 되어 플레이어가 하위 장소에 입장하기도 전에 클라이언트에서 시작된 텔레포트를 플랫폼 수준에서 차단합니다. 플레이어가 입장하지 않기 때문에 어떤 콘텐츠도 그들에게 복제되지 않습니다.

클라이언트가 시작한 텔레포트를 사용하는 기존 경험을 위한 구성 단계 및 마이그레이션 가이드는 장소 간 텔레포트를 참조하세요.

제한된 장소에 대한 심층 방어

보안 텔레포트를 사용할 수 없는 우주에 대해, 또는 이를 보완하기 위한 추가 보호 조치를 결합해 다음과 같은 조치를 취하십시오:

  • 개발 및 테스트 장소를 별도의 비공식 우주에 유지 — 이것은 비공식 콘텐츠의 기밀성을 보장하는 가장 확실한 방법입니다. 기밀 이벤트 자산, 스크립트 또는 UI 요소를 활성화될 의도가 있는 이전에 프로덕션 환경에 배포하지 마십시오.
  • 가능하다면 스트리밍을 이용해 새로운 플레이어에게 복제되는 세계의 양을 제한하십시오.
  • 서버 측 그룹 역할 또는 배지 확인을 추가하고 플레이어 상태나 진행 요구 사항을 확인하십시오.
  • 기본적으로 들어오는 플레이어를 차단하십시오. 이렇게 하면 검증 과정이 불확실할 경우(예를 들어 엔진에서 예외가 발생한 경우) 아무 플레이어도 들어올 수 없도록 보장됩니다.
  • 실용적이라면, 검증에 실패한 플레이어에 대해 Ban API를 사용하십시오. 이렇게 하면 플레이어가 동일한 계정으로 지속적으로 입장 시도를 하지 못하게 됩니다.

복제

복제는 엔진의 인스턴스 간에 네트워크를 통해 상태가 전송되는 방식입니다. Roblox의 복제 모델은 몇 가지 주요 방식으로 일반적으로 단순화됩니다:

  • 인스턴스는 서버 권한을 가지며, 모든 참가자(서버와 연결된 모든 클라이언트) 간에 인스턴스가 복제되려면 서버에서 생성되어야 합니다.
  • 인스턴스 속성 또한 서버 권한을 가지므로 대부분의 속성은 모든 클라이언트에서 변경 사항이 보이도록 하려면 서버에서 변경해야 합니다.
  • 일반적으로, 인스턴스는 모든 연결된 클라이언트에 복제되거나 복제되지 않습니다. 스트리밍과 같은 일부 예외가 있습니다.

복제 컨테이너는 클라이언트에 복제되는 최상위 인스턴스(DataModel 아래에 상위로 두어 지칭)입니다. 특정 인스턴스가 그 수명 동안 복제 컨테이너의 하위 항목이 된다면, 그 상태의 많은 부분이 모든 클라이언트에 복제될 것이라고 예상해야 합니다. 공통 복제 컨테이너에 대한 더 많은 정보는 데이터 모델 가이드에서 확인할 수 있습니다. 의심이 갈 경우, Play Solo와 같은 테스트 환경에서 인스턴스 또는 속성이 어떻게 복제되는지 항상 확인할 수 있습니다. 스튜디오 테스트 모드에서 테스트 모드에 대한 더 많은 정보를 읽을 수 있습니다.

복제의 보안적 의미

클라이언트로 복제되는 모든 콘텐츠는 악용자가 추출하고 데이터 마이닝할 수 있습니다. 일반적으로, 사용자에게 즉시 보일 준비가 되어 있지 않은 기밀 콘텐츠를 라이브 프로덕션 환경에 게시하거나 배포하지 마십시오. 콘텐츠가 나중에 공개되거나 접근할 수 있도록 하는 논리가 있어도(또는 다른 조건이 있더라도) 악용자는 콘텐츠가 게시되자마자 발견하고 유출할 방법을 찾아낼 것이라고 가정하십시오.

스크립트, 원격, 모델을 포함한 민감한 인스턴스에 대해 너무 설명적이거나 예측 가능한 이름을 피하십시오. 예측 가능한 데이터 모델 계층 구조는 악용 개발을 쉽게 만듭니다.

스크립트 디컴파일

LocalScript, ScriptRunContext::Client가 설정된 스크립트, 또는 ModuleScript는 클라이언트에 복제되면 악용자에게 디컴파일될 수 있습니다. 이는 해당 스크립트가 비활성화되어 있거나 클라이언트에서 요구되지 않더라도 마찬가지입니다. ServerStorage 또는 ServerScriptService에 저장된 서버 전용 스크립트와 모듈 스크립트는 클라이언트에 복제되지 않기 때문에 디컴파일할 수 없습니다.

서버 전용 및 클라이언트 전용 코드를 동일한 모듈 스크립트에 포함시키는 것은 권장되지 않습니다. 서버 측 로직이 디컴파일에서 노출되어 악용될 수 있는 버그를 더 쉽게 분석할 수 있게 됩니다.

원본 모듈 스크립트 (ReplicatedStorage에)
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 module
디컴파일된 결과
local 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;

위에서 보듯이, 디컴파일은 하드코딩된 패스워드, 비즈니스 규칙 및 악용자가 취약점을 분석할 수 있는 구현 세부 사항을 포함한 서버 측 로직을 드러냅니다.

기밀성 침해의 영향

기밀성 침해는 다음과 같은 중대한 결과를 초래할 수 있습니다:

  • 콘텐츠 유출: 출시되지 않은 항목, 맵 또는 기능이 공식 발표 전에 발견되고 공개될 수 있습니다.
  • 경쟁적 불이익: 메커니즘, 알고리즘 또는 예정된 기능이 경쟁자에 의해 역공학될 수 있습니다.
  • 악용 개발: 노출된 서버 로직은 악용자가 취약점을 식별하고 목표 공격을 개발하는 데 더욱 빠르고 쉬워집니다.
©2026 Roblox Corporation. Roblox 및 Roblox 로고, 'Powering Imagination'은 미국 및 기타 국가 내 당사의 등록 및 미등록 상표입니다.