Flash Socket Policy 설정
Adobe Flash의 소켓 정책(socket flash or flash policy or cross-domain (socket) policy)은 Flash Player 의 소켓 연결과 관련된 보안 정책을 처리하는 방법을 기술한다. 특히 이종 도메인간의 연결은 이 것 없인 불가능하다.
이런걸 기술하는 파일의 정식 명칭은 corss-domain policy file 이며, 여러개의 도메인에 걸쳐 데이터를 가져올 수 있게1 — 어떤 의미론 통신할 수 있게 — 해주는 기능을 한다. 물론 이 기능 때문에, 예전에 Flash 소켓 정책이 돌아가는 구조를 몰랐을 때 삽질했던 적이 있다.
Terminology
즉 web.upnl.org 에 서비스되고 있는 플래쉬 파일이 app1.upnl.org에 접속하려는 경우 web.upnl.org 가 현재 도메인(source domain)이 되며, 이 서버에서 다운로드 받은 some.swf 파일이 접근하는 (데이터/응용서버) app1.upnl.org 가 remote domain이 된다.
이 때 some.swf 파일을 app1.upnl.org 에 도메인간 정책 파일을 요구하고, 이 파일이
“web.upnl.org"로 부터의 접속을 나의 이런이런 포트로 허용한다
같은 형식인 경우에만 Flash Player가 실제로 접속을 허가한다.
Historical notes
Flash 9의 일정 버젼까지는 http://app1.upnl.org/crossdomain.xml 처럼 루트 디렉토리의 crossdomain.xml 파일로 지정되는 파일에 정의되었다. 그리고 1024번 보다 상위 포트로는 (즉 non-priviliged ports로는) 접속이 가능했었다. 그러나 이게 9.0.124.0 이후로 변경됨 (모든 포트에 정책 파일이 필요)
그리고 현재(Flash 9)엔 IANA와의 협의에 의해 843 번 포트를 사용하기 시작하였다.
실제로 동작할 때의 접속 순서
- some.swf 파일이 로드되면, 843 번 포트로
<policy-file-request/>\0
라는 메시지를 보낸다.2 이게 실패하거나, 성공했는데도 site-control이 all인 경우, 다음으로 간다. - Security.loadPolicyFile() 명령이 들어있고, 이게 어떤 검사할 위치를 주는 경우 그 파일을 가져온다. 다만 1이 실패한 경우에만임에 주의
- 접속한 소켓에, 접속한 순간에 \0 를 전송하고 응답을 기다린다. 첫 응답은 text/xml 의 정책 파일이어야 함.
Terminology에 따른 설정
일단 3을 막아야 서버는 독립적으로 짤 수 있다. 즉 XML Socket을 일반적인 TCP 소켓처럼 쓰는 걸 짜야했던 내 경우엔 정말 그렇게 해야한다. 물론 XML 기반의 처리라면 그냥 받아서 처리해도 편하겠지만.
다음은 위의 용어 설명에서 썼던 관계에서 정의될 만한 것.
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<site-control permitted-cross-domain-policies="master-only"/>
<allow-access-from domain='web.upnl.org' to-ports="4000,4001,4002,4020-4060"/>
</cross-domain-policy>
같은 식으로 하면 web.upnl.org 에서 다운로드된 some.swf 가 app1.upnl.org 의 40004002, 40204060에 접속할 수 있게 된다.
저기서 도메인을 *.upnl.org
같은 꼴을 할 수도 있지만, 그건 비권고 사항 중 하나. *
도 가능하지만 권장되진 않는다.3
물론 이 policy file이 서비스되어야 하는 위치는 app1.upnl.org 라는 사실엔 두말할 여지가 없는듯… 4
덤으로 소켓이 HTTPS 일지 여부(SSL사용)도 지정할 수 있지만 내가 신경쓸 범위가 아닌 (개발이 아닌 publish-issue) 거라 그냥 생략.
site-control
site-control 은 플래쉬 정책 파일이 허용되는 위치 — 즉 casecade되어 허용될지/말지 등등 — 에 관한 사항을 설명한다
allowed-access-from
개인적으로 헷갈리는 태그 명인데 “저기서 언급된 도메인에서 다운로드된 플래쉬 파일을 저 파일이 있는 서버의 특정 포트에 접근하게 해준다” 는 의미다.
즉 저 위에선, web.upnl.org 에서 온 파일이면 to-ports 밑에 언급된 포트로 접근가능하다는 의미.5
그림으로 따지면 adobe.com에서 가져온 다음 그림의 프로세스를 따라간다고 생각하면 쉽다.
이 이미지의 저작권은 Adobe Systems Inc.에 있습니다.
Reference
- http://www.adobe.com/devnet/flashplayer/articles/socket_policy_files.html 소켓 정책에 관련된 내용 + 소켓(플래쉬) 정책 서버 예제(in python/perl)
- http://www.adobe.com/devnet/articles/crossdomain_policy_file_spec.html (서로다른) 도메인간 정책에 관한 명세서
-
예를 들어 예전에 포스팅했던 UNIQLO의 광고 같은 경우 전체 데이터를 다 가지고 있는 건 좀 말이 안된다. 네트웍 대역폭을 잡아먹긴 하겠지만, 일종의 플레이어가 다운로드 되고, 그 플레이어가 해당 플래쉬 파일이 있던 서버가 아닌 다른 서버에 접속해서, 스트리밍 동영상을 가져오는게 말이 될 것이다. ↩︎
-
XMLSocket의 관례인지 뒤에 NULL이 붙는다. 위에서 나오는
<policy-file-request/>\0
는 문서에 따르면, 더 늘어나거나 줄지 않는다. 다만 이걸 수정해서 보내게 만들 수도 없다. ↩︎ -
한단계 걸러줄 수 있는걸 뚫어놓은 결과니 + 나중에 처리는 해야겠지만 개발단계라면 모를까 굳이 막을 수 있는걸 안 막을 이유는 없는듯. ↩︎
-
방법이야 위에서 쓴 843 포트에 XMLHTTPRequest를 처리한다거나, 소켓의 첫 응답을 처리한다거나. ↩︎
-
물론 이 포트는 app1.upnl.org에 열린다. ↩︎