Unity는 Adobe Flash player™에서 사용되는 것과 유사한 보안 모델을 구현합니다. 이 보안 제한사항은 SamsungTV에 적용되며 보안 모델은 몇 가지로 나눌 수 있습니다.
현재는 보안 모델의 처음 두 부분만 Unity 에디터에서 에뮬레이트합니다.
Unity에 빌트인된 멀티플레이어 네트워킹 기능(UnityEngine.Network
, UnityEngine.NetworkView
클래스 등)은 영향을 받지 않습니다.
WWW 클래스와 소켓은 동일한 정책 스키마를 사용하지만 이를 제외하면 둘은 완전히 별개의 시스템입니다. WWW 정책은 호스트된 웹 서비스에 대한 허용만 정의하지만 소켓 정책은 모든 TCP/UDP 소켓 연결에 적용됩니다.
Unity 에디터에는 보안 모델을 시행하는 “Emulate Web Security” 기능이 포함되어 있습니다. 이는 Unity 에디터에서 손쉽게 문제를 감지할 수 있게 해줍니다. 이 설정은 Edit->Project Settings->Editor에서 찾을 수 있습니다. 에디터 설정도 참조하십시오.
Unity는 특정 호스트에 연결하기 위해 소켓 지원 정책이 필요합니다. 이 정책은 기본적으로 포트 843의 대상 호스트에 의해 호스팅되지만 다른 포트에서도 호스팅할 수 있습니다. 기본값이 아닌 포트와의 기능상 차이는 Security.PrefetchSocketPolicy() API 호출로 수동으로 가져와야 한다는 것입니다. 또한 1024보다 큰 포트에서 호스팅되면 정책은 1024보다 큰 다른 포트에만 액세스를 부여할 수 있습니다.
기본 포트를 사용하면 Unity는 호스트에 TCP 소켓 연결을 시도하며 우선 호스트 서버가 연결을 허용하는지 확인합니다. 이 작업은 포트 843의 TCP 소켓을 열어 요청을 발급하고 새로운 연결을 통해 소켓 정책을 수신하는 방식으로 이뤄집니다. 그러면 Unity는 호스트의 정책이 연결을 진행하도록 허용하는지 확인하여 허용하는 경우 오류 없이 진행합니다. 이 프로세스는 사용자의 코드에 투명하게 발생하며, 이 보안 모델을 사용하기 위해 코드를 수정할 필요는 없습니다. 소켓 정책의 예제는 다음과 같습니다.
<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="*" to-ports="1200-1220"/>
</cross-domain-policy>"
이 정책은 사실상 “모든 도메인의 콘텐츠가 포트 12001220에서 자유롭게 소켓을 연결할 수 있다”고 하는 것입니다. Unity는 이를 존중하고 해당 범위 바깥의 포트로 소켓 연결을 시도하면 거부합니다(SecurityException 발생).
UDP 연결 사용 시 TCP와 유사한 방식으로 적용해야 할 때 정책을 자동으로 가져올 수 있습니다. 차이점이 있다면 TCP에서 자동으로 가져오기 기능은 무언가에 연결했을 때 발생하는(서버 연결이 허용되는지 확인) 반면 UDP는 비연결형이기 때문에 데이터를 송수신하는 어떤 API 호출 지점에서라도 발생한다는 것입니다(서버에서/서버로 트래픽을 송수신할 수 있는지 확인).
소켓 정책은 TCP와 UDP 연결 타입에 모두 적용되므로 UDP와 TCP 트래픽을 하나의 정책 서버에서 제어할 수 있습니다.
편의를 위해 843 포트에서 대기하는 간단한 프로그램이 제공됩니다. 연결되면 요청 문자열을 받고 유효한 소켓 정책으로 응답합니다. 서버 코드는 Unity 설치 폴더에 있습니다. Windows에서는 Data/Tools/SocketPolicyServer에서, OS X에서는 /Unity.app/Contents/Tools/SocketPolicyServer에서 찾을 수 있습니다. 사전에 빌드된 실행 파일은 Mono로 실행 가능하기 때문에 Mac에서만 실행될 수 있으니 참고하십시오. “mono sockpol.exe”만 입력하면 실행됩니다. 이 예제 코드는 소켓 정책 서버의 올바른 동작을 보여줍니다. 구체적으로 서버는 <policy-file-request/> 를 포함한 zero-terminated 문자열의 수신을 기다립니다. 정확하게 이 문자열을 수신할 때만 클라이언트에 소켓 정책 xml 문서를 전송합니다. 또한 xml 헤더와 xml 바디는 단일 소켓 쓰기로 전송해야만 합니다. 헤더와 바디를 별도 소켓 쓰기 작업으로 분리하면 Unity가 불완전한 정책을 받는 것이므로 보안 예외를 일으킬 수 있습니다. 서버에서 문제가 발생하면 제공된 예제를 사용해 보시기 바랍니다. 서버의 문제인지 네트워크의 문제인지 진단하는 데 도움됩니다.
일반적으로 멀티 플레이어 게임 네트워킹에 사용되는 서드파티 네트워킹 라이브러리는 P2P 기능(아래 참조)에만 종속하지 않고 전용 서버를 사용하는 한 이러한 요구 사항을 처리할 수 있어야 합니다. 때로는 호스팅 정책의 지원으로 즉시 가능하기도 합니다.
소켓 정책 서버에 연결하기 위해 텔넷
을 사용할 수 있습니다. 세션의 예제는 아래와 같습니다.
host$ telnet localhost 843
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
<policy-file-request/>
<?xml version='1.0'?>
<cross-domain-policy>
<allow-access-from domain="*" to-ports="*" />
</cross-domain-policy>Connection closed by foreign host.
host$
이 예제에서 텔넷은 포트 843의 localhost에 연결하는 데 사용됐습니다. 텔넷은 첫 번째 세 줄로 응답하며 사용자가 입력하기까지 대기합니다. 사용자가 정책 요청 문자열 <policy-file-request/> 를 입력하면 소켓 정책 서버가 받아서 소켓 정책으로 응답합니다. 그런 다음 서버는 연결을 해제하고 텔넷은 연결이 종료되었음을 보고합니다.
TCP 소켓을 사용할 때는 소켓 정책 시스템이 허용되는 경우에 한해 원격 엔드포인트에만 연결할 수 있습니다. UDP도 동일하게 작동하지만 비연결형 프로토콜이기 때문에 개념이 다소 다릅니다. 따라서 패킷의 송수신을 위해 연결 또는 대기할 필요가 없습니다. 먼저 allow-access-from domain
태그가 포함된 유효한 정책으로 응답한 경우에만 서버에서 패킷을 수신할 수 있습니다.
소켓과 WWW의 보안 기능은 SamsungTV 플레이어를 설치하는 사람들을 보호하기 위해 존재합니다. 이런 제약이 없다면 다음과 같은 공격이 벌어질 수 있습니다.
이런 공격은 WWW와 소켓 보안 기능 덕분에 실패로 돌아갑니다. Unity에서 pdf를 다운로드하기 전에 http://internal.whitehouse.gov/crossdomain.xml 서버에 “서버에 보유한 데이터는 공개적으로 사용할 수 있습니까?”라고 묻기 때문입니다. crossdomain.xml을 웹 서버에 두는 것은 이런 질문에 대한 응답으로 볼 수 있습니다. 이 예제의 경우 internal.whitehouse.gov의 시스템 운영자는 서버에 crossdomain.xml을 배치하지 않으므로 Unity는 pdf를 다운로드하지 않습니다.