실버라이트는 클라이언트에 다운로드되어 실행되지만, 실버라이트 런타임 샌드박스 안에서 실행이 된다.
그 말은 실버라이트는 사용하는 사용자의 PC에 프로그램이 다운은 되지만,
사용자 PC의 운영체제 권한으로 실행되는것이 아닌, 실버라이트 런타임의 제어를 받는 영역에서 실행이 된다는 이야기다.
또, 실버라이트 런타임은 실버라이트가 실행된 URL에 종속적이 된다.
이 말은 실버라이트 런타임은 호출 URL마다 각각의 영역이 갈린다는 이야기가 된다.
A사이트에서 실행된 실버라이트는 런타임 A영역에서, B사이트는 런타임 B영역에서 각자의 영역이 생긴다.
이 때 실버라이트가 실행된 URL이 아닌 다른 URL의 서비스를 호출하려고 하면, 크로스도메인 문제가 발생된다.
크로스도메인은 간단히 얘기하면 다른 URL의 리소스를 건드는 짓을 막는 보안규칙같은 것이다.
친절한 실버라이트께서는 다른 URL에 서비스를 호출하려고 하면 해당 서버에 '나 접속해도 돼??' 라고 물어 본다.
이때 이 물음에 답이 서버 루트에 clientaccesspolicy.xml 파일이다.
이곳에 설정되어있는 정보에 따라 접속을 하고 안하고를 결정한다.
<?xml version="1.0" encoding="utf-8"?> <access-policy> <cross-domain-access> <policy> <allow-from http-request-headers="*"> <domain uri="http://*"/> <domain uri="https://*"/> </allow-from> <grant-to> <resource path="/" include-subpaths="true"/> </grant-to> </policy> </cross-domain-access> </access-policy> |
참조 : http://www.sqler.com/401814
기본적으로 실버라이트의 모든 네트워크 API는 실버라이트 .xap 파일이 게시되어 있는 도메인만 접근할 수 있습니다. 즉, 기본적으로 크로스 도메인이 지원 안된다는 것이죠.
다른 도메인에 있는 웹 서비스를 호출한다던지, 아니면 WebClient를 이용하여 다른 도메인에 있는 파일을 다운로드하는 경우에는 해당 도메인 쪽에 크로스도메인 정책 파일이 있어야 작동합니다. 이건 실버라이트가 원래 그렇게 만들어졌기 때문에 어쩔 수 없습니다.
크로스 도메인 접근을 허용하려면 다음과 같이 clientaccesspolicy.xml 을 만들어서 해당 도메인의 웹 루트 폴더에 넣어줘야 합니다.
<?xml version="1.0" encoding="utf-8"?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="*">
<domain uri="*"/>
</allow-from>
<grant-to>
<resource path="/" include-subpaths="true"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
위 파일의 내용을 설명한다면… “모든 http request에 대해서 현재 서버의 모든 도메인과 하위 경로에 대해서 다 접근해도 된다.” 라는 뜻이 됩니다.
만약, 어떤 서버에 여러 개의 웹사이트가 호스팅되고 있고, 각각이 도메인이 다르게 설정되어 있을 때, 일부 도메인만 허용하려면 다음과 같이 하면 됩니다.
<?xml version="1.0" encoding="utf-8"?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="*">
<domain uri="http://www.mydomain1.com" />
<domain uri="http://www.mydomain2.com" />
</allow-from>
<grant-to>
<resource path="/" include-subpaths="true"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
다음과 같이 특정 서비스 폴더 아래쪽만 접근하게 할 수도 있습니다.
<?xml version="1.0" encoding="utf-8"?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="*">
<domain uri="*"/>
</allow-from>
<grant-to>
<resource path="/services/" include-subpaths="true"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
clientaccesspolicy.xml 을 잘 사용하면 웹 서버의 보안성을 보다 높일 수 있겠죠?
한 가지 더 있습니다.
플래시에서도 이와 유사하게 crossdomain.xml 이라는 것을 사용합니다. 고맙게도 실버라이트는 clientaccesspolicy.xml 뿐만 아니라 crossdomain.xml도 지원하기 때문에 이미 플래시를 잘 지원하는 웹 서비스 사이트에 별도로 clientaccesspolicy.xml 를 넣지 않아도 실버라이트가 접근할 수 있도록 해줍니다.
예로 유튜브와 같은 서비스는 clientaccesspolicy.xml 가 없어도 crossdomain.xml가 있기 때문에 실버라이트에서 접근할 수 있지요.
한번 다음 링크를 열어보세요^^
http://www.youtube.com/crossdomain.xml
http://www.youtube.com/clientaccesspolicy.xml
참고로, crossdomain.xml은 다음과 같이 생겼습니다.
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM
"http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-http-request-headers-from domain="* " headers="*" />
</cross-domain-policy>