본문 바로가기
SNS | SNG

Flash crossdomain.xml 웹 사이트 컨트롤(정책 파일)

by 두루물 2011. 6. 8.
swf 로 빼낸 리소스 라이브러리 파일을 로드하기 위해, 다른 swf 파일을 로드하던 중..

SecurityError: Error #2000: 활성화된 보안 컨텍스트가 없습니다.

보안 샌드박스가 뜬다..

호출자는 로컬에 있는 swf , 호출되는 swf 는 타 도메인에 있다.

플래시 보안정책으로 타 도메인(크로스 도메인) 사이의 리소스,swf 로드가 기본적으로 불가능 하다.

crossdomain.xml 파일을 통해 권한 제어가 가능하다.(권한 허용)
아래 내용을 도메인 루트에 등록..

<?xml version="1.0"?>
<cross-domain-policy>
    <!--<site-control permitted-cross-domain-policies="all"/>-->
    <allow-access-from domain="*" />
</cross-domain-policy>

아무 문제가 없으려면 같은 도메인에 넣으면 된다.



http://2design.tistory.com/96



관련 포스팅


http://help.adobe.com/ko_KR/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7e08.html

웹 사이트 컨트롤(정책 파일)



웹 서버의 데이터를 다른 도메인의 SWF 파일에서 사용할 수 있도록 하기 위해 사용자 서버에 정책 파일을 작성할 수 있습니다. 정책 파일은 사용자 서버의 특정 위치에 배치되는 XML 파일입니다.

정책 파일은 다음을 포함하여 많은 에셋에 대한 액세스에 영향을 줍니다.

  • 비트맵, 사운드 및 비디오 데이터

  • XML 및 텍스트 파일 로드

  • 다른 보안 도메인의 SWF 파일을 로드하는 SWF 파일의 보안 도메인으로 가져오기

  • 소켓 및 XML 소켓 연결에 대한 액세스

ActionScript 객체는 문서 기반 서버 연결 및 소켓 연결의 서로 다른 두 종류의 서버 연결을 인스턴스화합니다. Loader, Sound, URLLoader 및 URLStream과 같은 ActionScript 객체는 문서 기반 연결을 인스턴스화하며 이러한 객체는 URL에서 파일을 로드합니다. ActionScript Socket 및 XMLSocket 객체는 소켓 연결을 만들어 로드된 문서가 아니라 스트리밍 데이터로 작업합니다.

Flash Player에서는 두 종류의 서버 연결을 지원하기 때문에 URL 정책 파일과 소켓 정책 파일의 두 가지 정책 파일 유형이 있습니다.
  • 문서 기반 연결에는 URL 정책 파일이 필요합니다. 이러한 파일을 통해 서버는 특정 도메인이나 모든 도메인에서 제공된 SWF 파일에 해당 데이터와 문서를 사용할 수 있음을 나타낼 수 있습니다.

  • 소켓 연결에는 Socket 및 XMLSocket 클래스를 사용하여 하위 TCP 소켓 수준에서 직접 네트워킹을 가능하게 하는 소켓 정책 파일이 필요합니다.

Flash Player에서는 정책 파일을 전송할 때 연결 시도에서 사용하려는 프로토콜과 동일한 프로토콜을 사용해야 합니다. 예를 들어, 정책 파일이 HTTP 서버에 있는 경우 다른 도메인의 SWF 파일은 HTTP 서버로 데이터를 로드할 수 있습니다. 하지만 동일한 서버에 소켓 파일을 제공하지 않으면 다른 도메인의 SWF 파일에서 소켓 수준의 서버에 연결할 수 없게 됩니다. 즉, 정책 파일을 가져올 때는 연결할 때와 같은 방법을 사용해야 합니다.

정책 파일 사용 및 구문은 Flash Player 10용으로 제작된 SWF 파일에 적용되기 때문에 이 단원의 나머지 부분에서 간략하게 설명합니다. 연속 릴리스에서 Flash Player 보안이 강화되었으므로 정책 파일 구현은 이전 버전의 Flash Player와 약간 다릅니다. 정책 파일에 대한 자세한 내용은 www.adobe.com/go/devnet_security_kr에서 Flash Player 개발자 센터 항목 "Flash Player 9의 정책 파일 변경 내용"을 참조하십시오.

마스터 정책 파일

기본적으로 Flash Player와 AIR 응용 프로그램 샌드박스에 있지 않은 AIR 내용은 먼저 서버의 루트 디렉토리에서 crossdomain.xml이라는 URL 정책 파일을 찾고 포트 843에서 소켓 정책 파일을 찾습니다. 이러한 위치 중 하나에 있는 파일을 마스터 정책 파일이라고 합니다. 소켓 연결의 경우 Flash Player는 기본 연결과 동일한 포트에서 소켓 정책 파일을 찾습니다. 그러나 해당 포트에 있는 정책 파일은 마스터 정책 파일로 간주되지 않습니다.

액세스 권한을 지정하는 것 외에도 마스터 정책 파일에는 메타 정책 문이 포함될 수 있습니다. 메타 정책은 정책 파일이 포함될 수 있는 위치를 지정합니다. URL 정책 파일에 대한 기본 메타 정책은 "master-only"이므로 서버에서 허용되는 정책 파일은 /crossdomain.xml뿐입니다. 소켓 정책 파일에 대한 기본 메타 정책은 "all"이므로 호스트의 모든 소켓에서 소켓 정책 파일을 제공할 수 있습니다.

참고: Flash Player 9 이전 버전에서 URL 정책 파일에 대한 기본 메타 정책은 "all"이었으므로 모든 디렉토리에 정책 파일이 포함될 수 있습니다. 기본 /crossdomain.xml 파일이 아닌 위치에서 정책 파일을 로드하는 응용 프로그램을 배포했으며 해당 응용 프로그램이 현재 Flash Player 10에서 실행 중일 수 있는 경우 사용자(또는 서버 관리자)가 추가 정책 파일을 허용하도록 마스터 정책 파일을 수정해야 합니다. 다른 메타 정책을 지정하는 방법에 대한 자세한 내용은 www.adobe.com/go/devnet_security_kr에서 Flash Player 개발자 센터 항목 "Flash Player 9의 정책 파일 변경 내용"을 참조하십시오.

SWF 파일에서 Security.loadPolicyFile() 메서드를 호출하여 다른 정책 파일 이름이나 다른 디렉토리 위치를 확인할 수 있습니다. 그러나 대상 위치에서 정책 파일을 제공할 수 있도록 마스터 정책 파일에 지정되어 있지 않으면 해당 위치에 정책 파일이 있는 경우에도 loadPolicyFile() 호출 시 아무 영향도 주지 않습니다. 정책 파일이 필요한 네트워크 작업을 시도하기 전에 loadPolicyFile()을 호출합니다. Flash Player는 자동으로 네트워킹 요청을 해당 정책 파일 시도 뒤에 대기열에 보관합니다. 따라서 예를 들어 네트워킹 작업을 시작하기 직전에 Security.loadPolicyFile()을 호출할 수 있습니다.

마스터 정책 파일을 확인할 때 Flash Player는 3초 동안 서버 응답을 기다립니다. 응답이 수신되지 않으면 Flash Player는 마스터 정책 파일이 없다고 가정합니다. 그러나 loadPolicyFile() 호출에 대한 기본 제한 시간 값은 없습니다. Flash Player는 호출되는 파일이 있다고 가정하고 파일을 로드하는 데 필요한 시간 동안 기다립니다. 따라서 마스터 정책 파일이 로드되도록 하려면 loadPolicyFile()을 사용하여 명시적으로 파일을 호출합니다.

메서드에 Security.loadPolicyFile()이란 이름이 지정된 경우에도 정책 파일이 필요한 네트워크 호출을 실행해야 정책 파일이 로드됩니다. loadPolicyFile() 호출은 단순히 정책 파일이 필요할 때 찾을 위치를 Flash Player에 알리는 기능만 합니다.

정책 파일 요청이 시작 또는 완료된 시기에 대한 알림은 받을 수 없으며 알림을 받을 이유도 없습니다. Flash Player는 비동기적으로 정책을 확인하며, 정책 파일 확인이 성공한 후 자동으로 연결을 시작합니다.

다음 단원에는 URL 정책 파일에만 적용되는 정보가 포함되어 있습니다. 소켓 정책 파일에 대한 자세한 내용은 소켓 연결을 참조하십시오.

URL 정책 파일 범위

URL 정책 파일은 정책 파일이 로드되어 있는 디렉토리와 해당 하위 디렉토리에만 적용됩니다. 루트 디렉토리에 있는 정책 파일은 전체 서버에 적용되고, 임의의 하위 디렉토리에서 로드된 정책 파일은 해당 디렉토리와 하위 디렉토리에만 적용됩니다.

정책 파일은 해당 파일이 상주하는 특정 서버에 대한 액세스에만 영향을 줍니다. 예를 들어, https://www.adobe.com:8080/crossdomain.xml에 있는 정책 파일은 HTTPS를 통해 www.adobe.com의 8080 포트에 대한 데이터 로드 호출에만 적용됩니다.

URL 정책 파일에 액세스 권한 지정

정책 파일에는 하나의 <cross-domain-policy> 태그가 있습니다. 그리고 이 태그에는 0개 이상의 <allow-access-from> 태그가 포함됩니다. 각 <allow-access-from> 태그에는 domain이라는 속성이 있습니다. 이 속성은 정확한 IP 주소, 정확한 도메인 또는 와일드카드 도메인(임의의 도메인)을 지정합니다. 와일드카드 도메인은 다음 두 가지 방법 중 하나로 표시됩니다.
  • 모든 도메인과 IP 주소를 나타내는 경우 단일 별표(*)

  • 특정 접미어로 끝나는 도메인을 나타내는 경우 접미어가 뒤에 붙은 별표

접미어는 점으로 시작해야 합니다. 그러나, 접미어를 가진 별표 문자는 앞의 점을 제외한 접미어만으로 구성되는 도메인과 일치할 수 있습니다. 예를 들어, xyz.com은 *.xyz.com에 속하는 것으로 간주됩니다. IP 도메인 형식에는 와일드카드를 사용할 수 없습니다.

다음 예제에서는 *.example.com, www.friendOfExample.com 및 192.0.34.166에서 시작되는 SWF 파일에 대한 액세스를 허용하는 URL 정책 파일을 보여 줍니다.

<?xml version="1.0"?> 
<cross-domain-policy> 
    <allow-access-from domain="*.example.com" /> 
    <allow-access-from domain="www.friendOfExample.com" /> 
    <allow-access-from domain="192.0.34.166" /> 
</cross-domain-policy>

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

다음 예제와 같이 모든 도메인의 문서에 액세스할 수 있도록 허용할 수 있습니다.

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

<allow-access-from> 태그에는 선택적인 secure 속성이 포함될 수 있으며 기본값은 true입니다. 정책 파일이 HTTPS 서버에 있을 경우 HTTPS가 아닌 서버의 SWF 파일이 HTTPS 서버에서 데이터를 로드할 수 있도록 허용하려면 이 속성을 false로 설정합니다.

secure 속성을 false로 설정하면 HTTPS에서 제공하는 보안 기능이 손상될 수 있습니다. 특히 이 속성을 false로 설정하면 보안 내용이 열려서 스누핑(snooping) 및 스푸핑(spoofing) 공격에 취약해집니다. 따라서 secure 속성을 false로 설정하지 않아야 합니다.

로드할 데이터가 HTTPS 서버에 있고, 해당 데이터를 로드하는 SWF 파일이 HTTP 서버에 있는 경우에는 로드하는 SWF 파일을 HTTPS 서버로 이동하여 HTTPS의 보호를 받아 보안 데이터의 모든 복사본을 보관하는 것이 좋습니다. 그러나 로드하는 SWF 파일을 HTTP 서버에 두기로 결정한 경우에는 다음 코드에 표시된 대로 secure="false" 속성을 <allow-access-from> 태그에 추가합니다.

<allow-access-from domain="www.example.com" secure="false" /> 
액세스를 허용하는 데 사용할 수 있는 다른 요소는 allow-http-request-headers-from 태그입니다. 이 요소는 다른 권한 도메인의 내용을 호스팅하는 클라이언트가 사용자 정의 머리글을 사용자 도메인으로 보낼 수 있도록 허용합니다. <allow-access-from> 태그는 사용자 도메인에서 데이터를 가져오는 권한을 다른 도메인에 부여하는 반면, allow-http-request-headers-from 태그는 사용자 도메인에 머리글 형태로 데이터를 밀어넣는 권한을 다른 도메인에 부여합니다. 다음 예제에서는 모든 도메인이 현재 도메인에 SOAPAction 머리글을 보낼 수 있습니다.
<cross-domain-policy> 
    <allow-http-request-headers-from domain="*" headers="SOAPAction"/> 
</cross-domain-policy>

allow-http-request-headers-from 문이 마스터 정책 파일에 있으면 호스트에 있는 모든 디렉토리에 적용됩니다. 그렇지 않으면 해당 문이 포함된 정책 파일의 디렉토리와 하위 디렉토리에만 적용됩니다.

정책 파일 미리 로드

서버에서 데이터를 로드하거나 소켓에 연결하는 작업은 비동기 작업입니다. Flash Player는 기본 작업을 시작하기 전에 정책 파일의 다운로드가 완료될 때까지 기다립니다. 그러나 이미지에서 픽셀 데이터를 추출하거나 사운드에서 샘플 데이터를 추출하는 작업은 동기 작업입니다. 데이터를 추출하려면 먼저 정책 파일이 로드되어야 합니다. 미디어를 로드하는 경우에는 다음과 같이 미디어에서 정책 파일을 확인하도록 지정합니다.

  • Loader.load() 메서드를 사용하는 경우에는 LoaderContext 객체인 context 매개 변수의 checkPolicyFile 속성을 설정합니다.

  • <img> 태그를 사용하여 텍스트 필드에 이미지를 포함하는 경우, 다음과 같이 <img> 태그의 checkPolicyFile 속성을 "true"로 설정합니다.

    <img checkPolicyFile = "true" src = "example.jpg">
  • Sound.load() 메서드를 사용하는 경우에는 SoundLoaderContext 객체인 context 매개 변수의 checkPolicyFile 속성을 설정합니다.

  • NetStream 클래스를 사용하는 경우, NetStream 객체의 checkPolicyFile 속성을 설정합니다.

이 매개 변수 중 하나를 설정하는 경우에는 Flash Player에서 먼저 해당 도메인에서 이미 다운로드한 모든 정책 파일을 확인합니다. 그런 다음 서버의 기본 위치에서 정책 파일을 찾고 <allow-access-from> 문과 메타 정책이 있는지 모두 확인합니다. 마지막으로, Security.loadPolicyFile() 메서드에 대해 대기 중인 모든 호출을 검토하여 해당 범위 내에 있는지 확인합니다.