훈스닷넷의 스터디 모임에서 크로스 도메인 접근에 대한 라이브 데모를 하다가 황당한 상황을 겪었는데요, 올바른 것으로 보이는 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이 있는데도 불구하고 크로스 도메인 접근이 되지 않는다면 위의 조건에 맞는지 점검해 보세요. 그리고 제대로 되어 있지 않다면 해당 서비스 제공 업체에 수정을 요청할 수도 있겠죠. 저도 당장 티스토리에 요청해야겠어요!

Posted by gongdo

Submit comment.

  1. 꼬기얌얌얌 2009.02.27 09:40  comment URL  Edit/Remove  Submit comment.

    스터디 첫날이라서 머가 먼지 어리둥절 했는데....이제 이해가 좀 되는거 같네용...ㅎㅎ;;
    좋은 정보 감사합니당...^^

  2. Favicon of http://nuney.tistory.com/ BlogIcon nuney 2009.03.20 14:01  comment URL  Edit/Remove  Submit comment.

    제 티스토리블로그의 crossdomain.xml 은 공도님께서 말씀해 주신것처럼

    <allow-access-from domain="*" to-ports="*" secure="true" />

    잘되었습니다. 경로도 잘맞고요..전 웹호스팅에 올리고 그걸 가지고 왔습니다.

    그런데왜 하얀화면만 나올까요? 경로는 맞는거같은데요...

    어찌어찌여기까지왔는데...더이상은...흠....하얀이유는 뭘까요?

    • Favicon of http://gongdosoft.com BlogIcon gongdo 2009.03.21 02:44  comment URL  Modify/Remove

      본문에도 있는 것처럼 allow-access-from 엘리먼트에 domain="*" secure="true"외의 어떤 어트리뷰트도 인식하지 못해요.
      to-ports="*"라는 어트리뷰트가 문제인거죠. to-ports 어트리뷰트를 삭제해야 해요.

  3. lee sangmin 2010.08.22 17:10  comment URL  Edit/Remove  Submit comment.

    좋은글 잘 읽었습니다. 초보라 이해가 안가는 부분이 많은데요.. ^^ 죄송하지만 크로스 도메인이 왜 필요한건지좀 간단하게나마 설명해주심 안될까요??

경험있는 개발자라면 절대로 해서는 안될 말 중에 ‘어? 제 PC에서는 되던데요…’가 있죠. 저도 평소에 절대로 이런 말을 하지 않으려고 노력하지만 이번에 또 저질러 버렸네요.

아마 실버라이트 개발 해봤다면 localhost에서는 잘 되었던 애플리케이션이 웹 서버에만 올리면 잘 안되었던 경험이 있을 거에요. 99.9% 이상의 확률로 명백하게 개발자의 실수인데요, 보통은 하드 코딩된 URI나 크로스 도메인, 혹은 웹 서버의 세팅 문제 등이죠.

하지만 이번에 제가 겪었던 것은 절대로 그런 문제가 아니었어요. 모든 URI는 세팅 파일을 통해 완전하게 컨트롤 되고 있고 크로스 도메인에 있는 리소스는 clientaccesspolicy.xml 파일을 통해 올바로 가져올 수 있으며 웹 서버의 세팅도 완벽했죠. 그런데 이상하게 제 PC에서는 되고 고객사의 PC에서는 안되는 거였어요.

기억을 더듬어 가능성이 있는 모든 설정이나 세팅, 코드를 수 차례 확인 했지만 역시 찾을 수 없었는데 한 가지 특이한 사항이라면 심지어 깨끗하게 새로 설치한 시스템에서도 해당 애플리케이션이 잘 돌아가는 걸 확인 했는데 유독 고객사의 PC에서만 그런 현상이 일어난거죠.

바로 이런 경우라면 십중 팔구 고객사의 네트워크 환경이나 특정 설정 등에 문제가 있다고 봐도 좋아요.

여튼 문제 해결을 위해 삽질도 좀 하고 다른 개발자들과 수다를 떨면서토의을 하면서 알아낸 것은!

 

 

바로 고객사의 PC에서는 해당 크로스 도메인 사이트를 ‘신뢰할 수 있는 사이트’에 등록해뒀던 거였어요. 왜 보통 자기 회사 사이트는 이것저것 보안 경고 뜨는 것도 귀찮고 해서 신뢰할 수 있는 사이트에 등록할 때도 있잖아요. 그게 문제였던 거죠.
(문제 해결에 큰 도움을 준 훈스닷넷 서동진 시삽님에게 감사^^)

그게 왜 문제나고요? 한번 다음의 애플리케이션을 통해 알아보죠.

이 애플리케이션은 Shiverlight.net에 있는 XAP파일을 받아서 실행되고 Hugeflow.com에 있는 이미지 파일을 가져오게 되어 있어요. 전형적인 크로스 도메인 시나리오죠.

아마도 휴즈플로우의 로고가 보일거에요. 자, 이제 hugeflow.com을 익스플로러의 도구->인터넷 옵션->보안->신뢰할 수 있는 사이트->사이트 버튼을 눌러 등록해 보세요. 그리고 브라우저를 새로 고침 해보세요.

아마도 이젠 이미지를 가져오는데 실패했다는 에러 메시지가 뜰거에요.

하지만 반대로 shiverlight.net만 신뢰할 수 있는 사이트로 등록할 경우는 문제 없이 되는 걸 확인할 수 있죠. 정리하자면…

[인터넷 영역] --- NOT OK ---> [신뢰할 수 있는 영역]

[신뢰할 수 있는 영역] –-- OK ---> [인터넷 영역]

[신뢰할 수 있는 영역] --- OK ---> [신뢰할 수 있는 영역]

[인트라넷 영역] --- OK ---> [신뢰할 수 있는 영역]

이러한 특성은 실제로 당하게 되면 굉장히 당황할 수 있어요. 보통 웹 디버깅 때 피들러를 많이 사용하는데요, 피들러에서 위 애플리케이션을 보면…

(hugeflow.com이 신뢰할 수 있는 사이트가 아닐 때)

(hugeflow.com이 신뢰할 수 있는 사이트일 때)

보는 것 처럼 심지어 크로스 도메인의 유효성 확인을 위한 clientaccesspolicy.xml 파일 조차 요청하지 않는 것을 알 수 있죠.

이 말은 크로스 존 접근 제약은 크로스 도메인 접근 제약에 우선한다는 걸 의미해요.

여튼 오늘도 한 건 해결. 이제 다른 일 해야지.

Posted by gongdo

Submit comment.

  1. Favicon of http://gilverlight.net BlogIcon 길버트 2008.10.23 21:27  comment URL  Edit/Remove  Submit comment.

    원인을 찾기 어려운 사안인데 찾아내시다니 대단하십니다.

  2. Favicon of http://joongs.net BlogIcon 중스 2008.10.23 22:25  comment URL  Edit/Remove  Submit comment.

    안겪어보고는 찾기힘든, 겪어봐도 길버트님 말씀대로 원인을 찾기 어려운 내용인것 같은데... 고생하셨습니다.

  3. Favicon of https://sh1r.tistory.com BlogIcon 쇼너짱 2009.04.01 15:36 신고  comment URL  Edit/Remove  Submit comment.

    그럼 해결 방법은.. 실버라이트 웹 어플리케이션도 "신뢰할 수 있는 사이트"로 사용자가 등록해야하는 거군요. ㅠㅜ 실버라이트로 윈도우 비스타 위젯을 만들었는데, 개발자 컴퓨터에서만 되서 문제 ;; (미투데이에서 xml파일을 받아오는 위젯인데, 사용자들은 미투데이 홈피를 신뢰할 수 있는
    사이트로 등록을 해 놨지만, 제가 만든 위젯은 당연히 신뢰할 수 있는 사이트로 등록이 안된 사이트;; 겠구요)