본문 바로가기
웹프로그램

크로스 도메인 : SWF 파일 사이에서의 데이터 액세스

by 세이박스 2008. 10. 8.
반응형

SWF파일이 A라는 도메인에 있고 그 SWF파일이 A라는 도메인의 파일을 이용하여 변수를 호출할 때
도메인이 정확하게 일치해야 두 파일이 데이터를 공유할 수 있다.
하지만 만약 웹사이트가 2개의 도메인을 가지고 있다면 어떡해야 할까??
이 문제로 30분간 검색해서 찾은 결과..
Macromedia.com은 바보가 아니라 이런 경우에 대한 해답으로 crossdomain.xml을 제공한다.
즉, 웹사이트 루트에 crossdomain.xml을 만들어 액세스를 허용해주면 간단히 해결된다는 말씀!!


less..

1. 크로스 도메인 SWF 파일 사이에서의 데이터 액세스 허용
한 SWF는 인터넷 상의 모든 위치에서 다른 SWF를 로드할 수 있습니다. 그러나, 두 SWF가 변수 및 객체와 같은 서로의 데이터에 액세스할 수 있도록 하려면 두 파일은 반드시 동일한 도메인에서 시작해야 합니다. Flash Player 7 이상에서는 두 도메인이 정확하게 일치해야 두 파일이 데이터를 공유할 수 있습니다. 그러나, SWF 파일은 LocalConnection.allowDomain 또는 System.security.allowDomain()을 호출하여 특정 도메인에서 제공된 SWF 파일에 대한 액세스를 허용할 수 있습니다.
예를 들어, main.swf가 www.macromedia.com에서 제공되는 경우, 이 SWF는 data.macromedia.com으로부터 무비 클립 인스턴스(target_mc)로 다른 SWF(data.swf)를 로드합니다.

// In macromedia.swf
target_mc.loadMovie("http://data.macromedia.com/data.swf");

또한, data.swf가 자신의 기본 타임라인에 getData()라는 메서드를 정의한다고 가정해 보십시오. 기본적으로 main.swf는 data.swf가 일단 로드되고 나면 data.swf에 정의된 getData() 메서드를 호출할 수 없습니다. 그 이유는 두 SWF 파일이 동일한 도메인에 존재하고 있지 않기 때문입니다. 예를 들어, 이미 data.swf가 로드되었다면 main.swf의 다음 메서드 호출은 실패합니다.

// In macromedia.swf, after data.swf has loaded:
target_mc.getData(); // This method call will fail

그러나, data.swf는 요청된 액세스 유형에 따라 LocalConnection.allowDomain 핸들러 또는 System.security.allowDomain() 메서드를 사용하여 www.macromedia.com에서 제공된 SWF 파일에 대한 액세스를 허용할 수도 있습니다. 다음 코드를 data.swf에 추가하면 www.macromedia.com에서 제공된 SWF 파일은 자신의 변수와 메서드에 대한 액세스를 허용합니다.

// Within data.swf
System.security.allowDomain("www.macromedia.com");
my_lc.allowDomain = function(sendingDomain) {
return(sendingDomain=="www.macromedia.com");
}

액세스되는 SWF 파일이 보안 프로토콜(HTTPS)을 사용하는 사이트에서 호스트되지만 않으면, allowDomain은 허용된 도메인의 SWF 파일이 액세스를 허용하는 도메인에 있는 다른 SWF 파일의 스크립트를 작성하는 것을 허용합니다. 이 경우, allowDomain 대신 allowInsecureDomain을 사용해야 합니다. 자세한 내용은 SWF 파일 사이의 HTTP에서 HTTPS 프로토콜 액세스 허용을 참조하십시오.

도메인 이름 일치에 대한 자세한 내용은 Flash Player 보안 기능을 참조하십시오.



2. 도메인간 데이터 액세스 허용

Flash 문서는 다음 데이터 로드 호출 중 하나를 사용해 외부 소스에서 데이터를 로드할 수 있습니다. XML.load(), XML.sendAndLoad(), LoadVars.load(), LoadVars.sendAndLoad(), loadVariables(), loadVariablesNum(). 또한, SWF 파일은 런타임 공유 라이브러리나 다른 SWF 파일에 정의된 자원을 런타임에 가져올 수 있습니다. 기본적으로, 런타임 공유 라이브러리의 경우 데이터나 SWF 미디어는 해당 외부 데이터나 미디어를 로드할 SWF와 같은 도메인에 존재해야 합니다.

런타임 공유 라이브러리의 데이터와 자원을 서로 다른 도메인의 SWF가 사용할 수 있도록 하려면 크로스 도메인 정책 파일을 사용합니다. 크로스 도메인 정책 파일은 서버가 자신의 데이터와 문서를 특정 도메인 또는 모든 도메인에서 제공되는 SWF에 사용할 수 있다는 것을 나타내는 방법을 제공하는 XML 파일입니다. 서버의 정책 파일에 의해 지정된 도메인에서 제공되는 모든 SWF 파일은 그 서버의 데이터나 자원에 액세스하도록 허용됩니다.

Flash 문서가 다른 도메인의 데이터에 액세스하려고 시도하면 Flash Player는 자동적으로 그 도메인에서 정책 파일을 로드합니다. 액세스하려는 Flash 문서의 도메인이 정책 파일에 포함되어 있으면 자동적으로 데이터에 액세스할 수 있게됩니다.

정책 파일의 이름은 반드시 crossdomain.xml이어야 하며 데이터를 제공할 서버의 루트 디렉토리에 존재해야 합니다. 정책 파일은 HTTP, HTTPS 또는 FTP 상에서 통신하는 서버에서만 동작합니다. 정책 파일은 파일이 저장된 서버의 포트와 프로토콜에만 해당됩니다.

예를 들어, https://www.macromedia.com:8080/crossdomain.xml에 있는 정책 파일은 HTTPS를 통하여 www.macromedia.com의 8080 포트에 대한 데이터 로드 호출에만 적용됩니다.

XMLSocket 객체를 사용하여 다른 도메인의 소켓 서버에 연결하는 경우에는 이 규칙이 적용되지 않습니다. 이 경우, 소켓 서버와 같은 도메인의 80번 포트에서 실행 중인 HTTP 서버는 메서드 호출을 위한 정책 파일을 제공해야 합니다.

XML 정책 파일은 하나의 <cross-domain-policy> 태그를 가집니다. 그리고, 이 태그에는 0개 이상의 <allow-access-from> 태그가 포함됩니다. 각 <allow-access-from> 태그는 한 개의 속성 domain을 가집니다. 이 속성에 정확한 IP 주소, 정확한 도메인 또는 와일드카드 도메인(모든 도메인)을 지정합니다. 와일드카드 도메인은 모든 도메인과 IP를 대표하는 단일 별표 문자(*) 또는 접미어로 끝나는 도메인을 대표하는 접미어를 가진 별표 문자로 표현됩니다. 접미어는 점으로 시작해야 합니다. 그러나, 접미어를 가진 별표 문자는 앞의 점을 제외한 접미어 만으로 구성되는 도메인과 일치할 수 있습니다. 예를 들어, foo.com은 *.foo.com에 속한 것으로 생각할 수 있습니다. 와일드카드는 IP 도메인 형식에 사용할 수 없습니다.

IP 주소를 지정하면 IP 구문(예: http://65.57.83.12/flashmovie.swf)을 사용하여 해당 IP 주소에서 로드된 SWF에만 액세스 권한이 부여됩니다. 이 경우, 도메인 이름 구문을 사용하여 로드된 SWF에는 액세스 권한이 부여되지 않습니다. Flash Player는 DSN 이름 해결을 수행하지 않습니다.

다음은 foo.com의 Flash 문서에 대해 foo.com, friendOfFoo.com, *.foo.com 및 105.216.0.40에서 온 Flash 문서에 액세스를 허용하는 정책 파일의 예입니다.

<?xml version="1.0"?>
<!-- http://www.foo.com/crossdomain.xml -->
<cross-domain-policy>
<allow-access-from domain="www.friendOfFoo.com" />
<allow-access-from domain="*.foo.com" />
<allow-access-from domain="105.216.0.40" />
</cross-domain-policy>

정책 파일에 <allow-access-from> 태그가 없으면 서버에 정책이 없는 것과 동일합니다.

반응형