본문 바로가기
[ Design ]/Flash

플래시 크로스 도메인

by 관이119 2012. 9. 13.
[june] | 쥬니
http://blog.naver.com/serios77/110012972834

September 30, 2003

플래시 7 보안(1) : 크로스도메인 데이터 로딩

플래시 7에서 강화된 크로스도메인 보안에 대한 내용.

 

 


플래시 7 플레이어가 설치된 후에 위와 같은 보안 경고 창을 볼 수가 있다.

이 것은 플래시 6 이전 버전의 크로스도메인(도메인이 다른 데이터를 불러오는 경우) 규칙에 따라 다음과 같은 액션으로 데이터를

가져오는 경우에 나오는 보안 경고 창이다.

- loadVariables, loadVariablesNum, MovieClip.loadVariables, LoadVars.load, LoadVars.sendAndLoad
- XML.load, XML.sendAndLoad
- XMLSocket.connect
- Symbol importing from runtime shared libraries
- Flash Remoting (NetServices.createGatewayConnection)


플래시 6 이전 버전의 크로스도메인에 대한 보안 규칙

1. 토큰 수가 같은 도메인, 즉 점(.)으로 구분되어 있는 단어의 갯수가 같은 경우.

ex) 토큰의 갯수 => a.b.c.d (4개) / a.b.c (3개)

2. 가장 앞자리의 토큰을 제외한 나머지 토큰이 일치하는 경우

ex) abc.flashartwork.com 와 efg.flashartwork.com 는 성립함.

위의 두가지를 모두 만족하는 경우에만 데이터 로딩을 허용하도록 되어 있었다.

그래서 서로 다른 도메인 네임을 가진 서버에서는 loadVariable, loadVars, XMLSocket 등을 통하여 데이터를 불러오는 것이 불가능했었다.

플래시 7 플레이어가 발표되면서 몇가지 보안 규칙이 바뀌게 되었는데 그 중, 플래시 6의 크로스도메인에 대한 규칙이 없어지면서 다른 도메인의 데이터를 로딩하는 것이 좀 더 유용하게 바뀌었다.

일단, 완전히 다른 도메인 상에서도 데이터를 불러올 수 있는 것이 가능하게 되었다.

그리고 이러한 유용한 기능을 보안상의 문제 없이 사용하기 위하여 새로운 "크로스도메인 정책파일" 규칙이 생겼다.

크로스도메인 정책파일(cross-domain policy file)이란 크로스도메인을 통해 데이터를 로딩하는 경우에, 해당 서버의 데이터에 접근하는 것이 허용된 외부 도메인을 명시한 문서를 말한다.

이 문서에는 접근을 허용하는 외부 도메인이 명시되어 있고 플래시 무비는 해당 문서에 명시된 서버에서 접근시에만 데이터 로딩이 허용된다.

플래시 6 이전의 제작환경에서 만들어진 플래시 무비는 이러한 정책파일이 없었기 때문에 보안 경고창을 띄워 이러한 접근을 사용자의 허락하에 허용하고 있다.

보안 경고창은 플래시 6 이전의 제작환경에서 만들어진 플래시 무비가 정책파일 없는 서버에서 이전 크로스도메인 규칙에 따라 데이터 로딩을 시도한 경우에 나타난다.

따라서, 플래시 6 이전에 제작한 플래시 무비에서 크로스도메인으로 데이터를 불러오는 경우, 새롭게 정책파일을 만든다면 이러한 경고창이 나타나지 않도록 할 수 있다.

만약 플래시 7 제작환경에서 만들어진 플래시 무비가 정책 파일이 허용하지 않는 접근을 시도한다면 경고창을 보여주지 않고 접근을 무시한다.

따라서 플래시 7에서 크로스도메인을 시도한다면 반드시 정책파일을 설정해 주어야 한다.

크로스도메인 정책 파일은 항상 crossdomain.xml 이름을 가져야 하며, 서버의 HTML 루트에 위치하여야 한다.

정책 파일은 간단한 XML 형식을 취하고 있으며 신택스는 다음과 같다.

<fieldset style="width: 734px; height: 200px;">
<legend>crossdomain.xml - 크로스도메인 정책 파일의 예</legend>
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<!-- Policy file for http://www.mysite.com -->
<cross-domain-policy>
<allow-access-from domain="*.mysite.com" />
<allow-access-from domain="www.myothersite.com" />
</cross-domain-policy>

</fieldset>

1. <!-- comment --> : 주석 태그의 허용

2. <cross-domain-policy> : 크로스도메인 정책에 대한 내용이 들어가는 태그로 항상 하나의 태그가 존재하며 하위에 <allow-access-from> 태그를 가질 수 있다.(경우에 따라 이 태그가 없어도 무방하다.)

<allow-access-from> 태그는 접근을 허용한 외부 도메인 네임을 domain 이라는 속성에 명시한다.

domain 속성의 값으로 명시할 수 있는 것은 다음과 같다.

- 도메인 네임 : www.mysite.com 와 같은 특정 도메인 네임.

- IP 주소 : 65.57.83.12 와 같은 특정 IP 주소. http://65.57.83.12/test.swf 와 같이 해당 IP 주소가 정확히 명시된 플래시 무비에만 접근을

허용한다. 해당 IP를 가리키는 도메인 네임이라 할지라도 도메인 네임이 정책파일에 명시되어 있지 않다면 접근을 허용하지는 않는다.

- 와일드카드 문자를 이용한 도메인 네임 : 가장 앞자리의 도메인 토큰 대신 와일드카드 문자(*)를 사용할 수 있다. 가장 앞자리를 제외한

토큰은 정확히 명시되어야 한다. *.mysite.com 과 같이 사용가능하며, 이 경우 www.mysite.com, store.mysite.com, longer.subdomain.mysite.com(토큰4개) 등을 모두 포함되며 가장 앞자리 토큰이 생략된 mysite.com 도 포함한다.

- 와일드카드 문자 : 모든 사이트에 대하여 접근을 허용하고 싶은 경우 사용한다.만약 <cross-domain-policy> 태그가 <allow-access-from> 태그를 하나도 포함하지 않는다면 모든 도메인에 대하여 접근을 막는 정책이된다.모든 <allow-access-from> 태그는 domain 속성외에 secure라는 속성을 true/false 라는 값으로 가질 수 있는데, 이 속성은 HTTPS(HTTP 보안 프로토콜) 서버에서 HTTPS 서버가 아닌 다른 프로토콜 서버의 플래시 무비에 대한 데이터 접근을 허용할 것인가에 대한 속성이다. 만약 이 속성이 true로 되어있다면 HTTPS 서버끼리만 허용을 할 것이고, false로 되어있다면 다른 프로토콜 서버에서의 접근도 허용하게 된다. 이는 HTTPS 서버의 정책 파일에만 해당되는 내용이다. 생략할 경우 기본적으로 true의 값을 갖는다.한번 정책 파일을 생성하면 대부분의 액션스크립트를 통해 쉽게 도메인 간의 데이터 로딩을 사용할 수 있지만, 몇가지 예외는 있다. 일단, XMLSocket.connect 액션의 경우는 조금 다르다. XMLSocket으로 다른 도메인 네임의 서버에 소켓을 연결하는 경우에도 마찬가지로 접속하고자 하는 서버에서 정책파일을 요청하지만, 보통 소켓서버에서는 80 포트를 이용한 HTML 웹서버는 사용하지 않기 때문에 정책파일 문서를 제공할 수 없다. 따라서 XMLSocket을 이용하여 다른 도메인 네임을 가진 서버에 접속을 하려면 소켓 서버 쪽에 80 포트에서 별도의 웹 서버를 가동하여 crossdomain.xml 파일을 제공해 주어야 한다. 80 포트에 crossdomain.xml에 대한 요청만 처리해 주는 서버를 제공하는 방법도 가능할 것이다.

한가지 더 유의할 점은 데이터 요청을 받은 서버가 다른 도메인 네임의 서버로 리다이렉팅 할 경우 현재 서버의 정책파일을 무시하고

새로 리다이렉팅 된 서버의 정책파일을 따른다는 것이다. 따라서, 다른 도메인의 서버로 리다이렉팅 시키는 경우 경유하는 서버와

목적지 서버에 정책파일이 모두 존재해야 된다.

그리고 크로스도메인 정책파일이 생기므로써 나타난 문제점은 이 파일이 존재해야 모든 데이터 통신이 가능하다는

이유 때문에(플래시 리모팅 포함) 기존 인터넷상의 수많은 웹서비스들을 사용할 수 없다는 것이다. 플래시 MX에서 플래시 리모팅의

강력한 기능을 역설하였던 것을 상기하면 이러한 문제점은 아쉬울수밖에 없다.

그러나 웹서비스의 기능에 제한이 생기는 문제점과 정책파일 생성의 번거로움을 감안하고라도 크로스도메인 정책파일을 통한

확장된 외부 도메인의 데이터 로딩으로 인하여 플래시 7에서는 좀 더 융통성있고 편리한 서버간 데이터 통신 환경이 지원되었다고

생각한다.

플래시 7.2와 플레이어 7.0.19.0에서 System.security.loadPolicyFile() 메소드 추가

loadPolicyFile()는 서버의 루트가 아닌 특정 폴더에서 크로스도메인 정책 파일을 불러올 수 있다.

System.security.loadPolicyFile("http://www.B.co.kr/allowed/cdpf.xml");

이렇게 하면 플래시 플레이어는 B 서버의 allowed 폴더 및 그 하위 폴더의 모든 자원에 접근이 가능하다

그러나 상위 폴더나 다른 폴더의 자원에는 접근할 수 없게 된다

덧붙여서 XMLSocket을 사용하는 경우 7.0.14.0 이전 버전은 1024번 이상의 포트만 사용할 수 있다.

또한 크로스도메인 파일은 XMLSocket을 사용하는 서버의 80포트에서만 찾기 때문에 항상 XMLSocket 서버의 80포트에 웹서버 열어두어야 하는 문제가 있다.

그러나 7.0.19.0 이후 버전에서는 이런 문제가 해결되었다.

XMLSocket을 사용할 때 1024 이상의 포트뿐 아니라 다른 모든 포트를 사용할 수 있으며, loadPolicyFile()에서 특정 포트에서 정책 파일을 불러올 수 있게 되었다.

그러므로 항상 80포트를 열어두어야 하는 문제가 없어진다.

서버의 루트폴더에 xml을 crossdomain.xml 이름으로 생성

만약 루트에 만들지 않을경우는 System.security.loadPolicyFile("http://www.B.co.kr/allowed/cdpf.xml");로 명시

xml에 포함되어야 할 코드

<cross-domain-policy>
<allow-access-from domain="testowner.hyundai-motor.com" />
<allow-access-from domain="testcyber.hyundai-motor.com" />
</cross-domain-policy>

도메인간 데이터 액세스 허용

이것때문에 한참 헤맸습니다. 도메인 정책을 2004에서는 공식적인 방법으로 지원하고있다는것을 찾아보고나서야 알게되었습니다.

한동안 손떼고 있다가 열심히 다시 해서 밥이라도 먹고살려나 싶어 다시 손을 뎃는데 많은부분이 바뀌어있군요.

Flash 문서는 다음 데이터 로드 호출 중 하나를 사용해 외부 소스에서 데이터를 로드할 수 있습니다.

XML.load(), XML.sendAndLoad(), LoadVars.load(), LoadVars.sendAndLoad(), loadVariables(), loadVariablesNum().

또한, SWF 파일은 런타임 공유 라이브러리나 다른 SWF 파일에 정의된 자원을 런타임에 가져올 수 있습니다.

기본적으로, 런타임 공유 라이브러리의 경우 데이터나 SWF 미디어는 해당 외부 데이터나 미디어를 로드할 SWF와 같은 도메인에 존재해야 합니다.

런타임 공유 라이브러리의 데이터와 자원을 서로 다른 도메인의 SWF가 사용할 수 있도록 하려면 크로스 도메인 정책 파일을 사용합니다.

크로스 도메인 정책 파일은 서버가 자신의 데이터와 문서를 특정 도메인 또는 모든 도메인에서 제공되는 SWF에 사용할 수 있다는 것을 나타내는 방법을 제공하는 XML 파일입니다.

서버의 정책 파일에 의해 지정된 도메인에서 제공되는 모든 SWF 파일은 그 서버의 데이터나 자원에 액세스하도록 허용됩니다.

Flash 문서가 다른 도메인의 데이터에 액세스하려고 시도하면 Flash Player는 자동적으로 그 도메인에서 정책 파일을 로드합니다.

액세스하려는 Flash 문서의 도메인이 정책 파일에 포함되어 있으면 자동적으로 데이터에 액세스할 수 있게됩니다.

정책 파일의 이름은 반드시 crossdomain.xml이어야 하며 데이터를 제공할 서버의 루트 디렉토리에 존재해야 합니다.

정책 파일은 HTTP, HTTPS 또는 FTP 상에서 통신하는 서버에서만 동작합니다.

정책 파일은 파일이 저장된 서버의 포트와 프로토콜에만 해당됩니다.

예를 들어, https://www.macromedia.com:8080/crossdomain.xml에 있는 정책 파일은 HTTPS를 통하여 www.macromedia.com

8080 포트에 대한 데이터 로드 호출에만 적용됩니다.

XMLSocket 객체를 사용하여 다른 도메인의 소켓 서버에 연결하는 경우에는 이 규칙이 적용되지 않습니다. 이 경우, 소켓 서버와 같은

도메인의 80번 포트에서 실행 중인 HTTP 서버는 메서드 호출을 위한 정책 파일을 제공해야 합니다.

XML 정책 파일은 하나의 <cross-domain-policy> 태그를 가집니다.

그리고, 이 태그에는 0개 이상의 <allow-access-from> 태그가 포함됩니다. 각 <allow-access-from> 태그는 한 개의 속성 domain을 가집니다.

이 속성에 정확한 IP 주소, 정확한 도메인 또는 와일드카드 도메인(모든 도메인)을 지정합니다.

와일드카드 도메인은 모든 도메인과 IP를 대표하는 단일 별표 문자(*) 또는 접미어로 끝나는 도메인을 대표하는 접미어를 가진 별표 문자로 표현됩니다.

접미어는 점으로 시작해야 합니다.

그러나, 접미어를 가진 별표 문자는 앞의 점을 제외한 접미어 만으로 구성되는 도메인과 일치할 수 있습니다.

예를 들어, foo.com은 *.foo.com에 속한 것으로 생각할 수 있습니다. 와일드카드는 IP 도메인 형식에 사용할 수 없습니다.

IP 주소를 지정하면 IP 구문(예: http://65.57.83.12/flashmovie.swf)을 사용하여 해당 IP 주소에서 로드된 SWF에만 액세스 권한이

부여됩니다. 이 경우, 도메인 이름 구문을 사용하여 로드된 SWF에는 액세스 권한이 부여되지 않습니다.

Flash Player는 DSN 이름 해결을 수행하지 않습니다.

다음은 foo.com의 Flash 문서에 대해 foo.com, friendOfFoo.com, *.foo.com 및 105.216.0.40에서 온 Flash 문서에 액세스를 허용하는 정책 파일의 예입니다.

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

정책 파일에 <allow-access-from> 태그가 없으면 서버에 정책이 없는 것과 동일합니다.

 

댓글