본문 바로가기

Silverlight

실버라이트에서 사용 가능한 crossdomain.xml의 조건


훈스닷넷
의 스터디 모임에서 크로스 도메인 접근에 대한 라이브 데모를 하다가 황당한 상황을 겪었는데요, 올바른 것으로 보이는 crossdomain.xml 파일이 있어도 실버라이트가 접근에 실패하는 경우가 있어서 포스팅합니다. 그나저나 라이브 데모는 항상 자제해야 해요. 역시 –_-;

여러 차례 블로깅했던 것 같지만, 실버라이트에서 크로스 도메인에 있는 리소스에 접근하기 위해서는 해당 서버가 실버라이트를 위한 clientaccesspolicy.xml 또는 플래시에서 사용하는 crossdomain.xml을 제공해야 하죠. MSDN의 도메인 영역을 넘을 수 있는 서비스 만들기 문서에 잘 설명이 되어 있어요.

그러나 실버라이트는 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-access-from domain="*" secure="true" />
</cross-domain-policy>

여기서 가장 중요한 부분은 allow-access-from 엘리먼트에 domain="*" 설정이 반드시 존재해야 하고 secure 어트리뷰트가 true이어야 한다는 점이죠. secure 어트리뷰트는 옵셔널이고 없을 경우 true이기 때문에 없어도 무방해요. 또한 다음과 같이 다른 allow-access-from 엘리먼트와 함께 있는 것도 상관 없어요. 예를 들어, openapi.naver.com/crossdomain.xml을 보면…

<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
    <allow-access-from domain="static.campaign.naver.com" secure="false" />
    <allow-access-from domain="flashdev.naver.com" secure="false" />
    <allow-access-from domain="*" secure="true" />
</cross-domain-policy>

allow-access-from 엘리먼트가 여러 개 있는 걸 볼 수있죠. 그렇지만 여전히 domain 어트리뷰트와 secure 어트리뷰트가 적절하게 설정되어 있어서 실버라이트에서 접근할 수 있어요.

문제는, MSDN에서는 정확히 문서화되어 있지 않지만 아무리 allow-access-from 엘리먼트에 domain 어트리뷰트와 secure 어트리뷰트가 적절하게 설정되어 있다고 해도 그 외에 다른 어트리뷰트가 정의되어 있을 경우 해당 설정은 실버라이트에서 접근할 수 없는 것으로 판단해버려요. 예를 들어, gongdosoft.tistory.com/crossdomain.xml을 보면…

<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
    <allow-access-from domain="*" to-ports="*" />
</cross-domain-policy>

언뜻보면 될 것 같지만 to-ports라는 실버라이트가 인식할 수 없는 어트리뷰트가 붙어 있어서 여기에 대한 요청은 실패해요.

여러 가지로 테스트 해 봤는데 결국 실버라이트가 허용하는 crossdomain.xml의 조건은 다음과 같이 정리할 수 있어요.

  • allow-access-from 엘리먼트에 반드시 domain="*" 어트리뷰트가 있어야 한다.
  • secure 어트리뷰트는 반드시 true이어야 하고 생략해도 된다.
  • 위의 두 어트리뷰트 외에 어떠한 어트리뷰트도 들어가서는 안된다.

아직까지 실버라이트를 위한 clientaccesspolicy.xml을 지원하는 웹사이트는 그리 많지 않아요. 그래서 crossdomain.xml과의 공생은 당분간 필요하죠. 혹시 crossdomain.xml이 있는데도 불구하고 크로스 도메인 접근이 되지 않는다면 위의 조건에 맞는지 점검해 보세요. 그리고 제대로 되어 있지 않다면 해당 서비스 제공 업체에 수정을 요청할 수도 있겠죠. 저도 당장 티스토리에 요청해야겠어요!


[출처] 유령회사 공도소프트