경험있는 개발자라면 절대로 해서는 안될 말 중에 ‘어? 제 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

2008/03/07 - [프로그래밍/Silverlight] - [Silverlight/MSDN] URL Access Policy
와 관련하여, 크로스 도메인 문제를 해결하기 위해 해당 서버에 접근 정책을 설정하는 방법에 대해 설명한 글이에요. 자세한 것은 원문을 보시고 여기에서는 HOW TO 부분만 가져왔습니다.

원문 : How to: Make a Service Available Across Domain Boundaries


실버라이트는 크로스 도메인 접근에 두 가지 매커니즘을 지원합니다.

  • clientaccesspolicy.xml
    ; 크로스 도메인 접근cross-domain-access하기 위한 서비스를 설정하기 위해 도메인의 루트에 놓는 파일.
  • crossdomain.xml
    ; 서비스가 호스트된 도메인의 루트에 놓는 파일. 파일은 반드시 공개할 도메인을 기록해야 합니다. 플래시에서 사용했던 방식으로 실버라이트도 이 스키마의 서브셋을 지원합니다.

clientaccesspolicy.xml 파일을 사용하여 크로스 도메인 접근하기

1. 실버라이트 클라이언트가 접근 가능한 서비스를 만듭니다. 자세한 정보는 실버라이트 클라이언트를 위한 서비스 만들기를 보세요.

2. 서비스에 접근을 허용하기 위해 clientaccesspolicy.xml 파일을 생성합니다. 다음 설정은 다른 어떤 도메인에서도 현재 도메인에 있는 모든 리소스를 접근하도록 허용합니다.

<?xml version="1.0" encoding="utf-8"?>
<access-policy>
    <cross-domain-access>
        <policy>
            <allow-from>
                <domain uri="*"/>
            </allow-from>
            <grant-to>
                <resource path="/" include-subpaths="true"/>
            </grant-to>
        </policy>
    </cross-domain-access>
</access-policy>

3. clientaccesspolicy.xml 파일을 서비스가 호스트되고 있는 도메인의 루트에 저장합니다. 예를 들어, http://fabrikam.com 에서 호스트되고 있는 서비스라면 반드시 http://fabrikam.com/clientaccesspolicy.xml에 위치해야 합니다.

4. 반면, http://contoso.com과 같은 딱 하나의 도메인에서만 접근을 허용하길 원한다면 clientaccesspolicy.xml은 다음과 같은 설정을 포함해야 합니다.

<access-policy>
    <cross-domain-access>
        <policy>
            <allow-from>
                <domain uri="http://contoso.com" />
            </allow-from>
            <grant-to>
                <resource path="/" include-subpaths="true"/>
            </grant-to>
        </policy>
    </cross-domain-access>
</access-policy>

5. 다른 도메인에서 서비스를 호출했을 때 접근이 가능한지 테스트합니다.


crossdomain.xml 파일을 사용하여 크로스 도메인 접근하기

1. 실버라이트 클라이언트에서 접근이 가능한 서비스를 만듭니다.

2. 다음 설정을 포함하는 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="*" />
</cross-domain-policy>

3. 서비스가 호스트된 도메인의 루트에 crossdomain.xml 파일을 서비스가 호스트되고 있는 도메인의 루트에 저장합니다. 예를 들어, http://fabrikam.com 에서 호스트되고 있는 서비스라면 반드시 http://fabrikam.com/crossdomain.xml에 위치해야 합니다.

4. 다른 도메인에서 서비스를 호출했을 때 접근이 가능한지 테스트합니다.

신고
Posted by gongdo

※ 이 문서는 실버라이트 2 Beta 1에만 해당하는 내용으로 Beta 2에서는 다음의 글로 대체 되었습니다. 이용에 착오 없으시길.

2008/06/28 - [프로그래밍/Silverlight] - [MSDN] URL 접근 제약

실버라이트 2에서 가장 크게 바뀐 점 중 하나는 URL 접근에 대한 정책이 기본적인 보안에 대해 안전하면서도 보다 구체적이고 융통성있도록 구성되었다는 점이죠. 특히 실버라이트를 테스트할 때에는 잘 되다가 게시했을 때 안되는 문제의 많은 부분이 바로 URL 접근과 관련하여 일어나는데요, MSDN에 명확하게 정리된 문서가 있어서 번역해봤어요.

원본 : http://msdn2.microsoft.com/en-us/library/cc189008(vs.95).aspx


보안 문제 때문에 마이크로소프트 실버라이트는 쿠키 전달이나 재전송redirection 허용과 같은 보안에 위협이 될만한 것들에 대한 크로스 존Cross-zone, 크로스 도메인, 크로스 스키마 URL 접근을 제한합니다. 예를 들어, 한 웹 도메인에 호스팅된 실버라이트 기반의 애플리케이션을 가지고 있고 WebClient 개체를 사용하여 다른 도메인에 저장되어 있는 파일에 접근을 시도한다면 그 요청은 실패할 것입니다. 다음 테이블에서 이러한 룰을 정리합니다.

Note:
실버라이트로 다른 도메인의 파일을 접근할 수도 있습니다. 그렇게 하기 위해서는 이 기능을 명시적으로 활성화할 필요가 있습니다. 보다 자세한 정보는 여기를 클릭하세요.

  WebClient object Media, images, ASX XAML files, Font files Streaming media
허용된 스키마 HTTP, HTTPS HTTP, HTTPS, FILE HTTP, HTTPS, FILE HTTP
크로스 스키마 접근 No No No HTTPS로부터는 안됨
크로스 웹 도메인 접근 No HTTPS가 아닐 경우 Yes No Yes
크로스 존 접근(Windows에서) No No No No
크로스 존 접근(Macintosh에서) No Yes No Yes
재전송 허용 같은 도메인에서 Yes 같은 도메인에서 No

Note:
이러한 접근 정책의 위반으로 인한 결과로 발생한 에러가 있을 때 그 에러는 아마도 정확한 이유를 가리키지 않을 것입니다.

앞에서 본 표에서 사용된 몇몇 용어의 정의는 다음과 같습니다.

  • 크로스 스키마Cross-scheme : 어떤 스키마(예를 들어 HTTP, HTTPS)에서 다른 스키마를 접근하는 것.
  • 크로스 웹 도메인Cross-Web domain : 어떤 웹 도메인과 다른 웹 도메인 사이의 접근(예를 들어 www.contoso.com에 호스팅된 애플리케이션이 www.fabrikam.com에 있는 콘텐트에 대한 접근을 시도).
  • 크로스 존Cross-zone : 보안 영역간의 접근. 예를 들어 인터넷 서버에서 인트라넷 리소스에 접근을 시도하는 것.

예를 들어, 애플리케이션을 호스트하고 이미지를 다른 서버에서 가져오고 싶다면 앞에서 본 표에 있는 "Media, images, ASX" 항목을 체크해볼 수 있습니다.

  • 만약 애플리케이션이 HTTP 사이트에 호스팅된다면 HTTPS 스키마를 사용한 사이트에서 이미지를 가져올 수 없습니다.
  • 그 도메인의 스키마가 HTTPS가 아닌 한 다른 도메인에서 이미지를 가져올 수 있습니다.
  • 만약 애플리케이션이 인터넷에 있고 사용자가 Mac을 사용하지 않는다면 이미지를 인트라넷에서 가져올 수 없습니다.
  • URL이 같은 도메인에 있는 한 다른 이미지 URL로 재전송할 수 있습니다.

참고

컨셉
미디어 포맷 및 프로토콜 지원(실버라이트 2)
코어 프리젠테이션 프레임워크 / UI

신고
Posted by gongdo


티스토리 툴바