programming/actionscript2009. 7. 16. 13:06
보안정책이 하도 수시로 바뀌어서 검색을 해봐도 뭐가 최신버전인지 당최 모르겠다...
심지어 Adobe나 Silverlight 레퍼런스 사이트에 가도 해당 설명에 대한 명쾌한 해답이 없어서 걍 내가 직쩝 짜서 정리해봤다...



Flash(Flex) Socket 보안 정책

Flash로 소켓통신 이용시 보안 sandbox문제 해결방법을 검색해보니 참으로 많은 아티클이 있었다. Security.loadPolicy("http://IP/crossdomain.xml"); 을 선언하라던지 
swf파일이 있는 웹경로 루트에 crossdomain.xml파일을 두라던지 
843port로 인증용 소켓서버를 만들라던지... 

결론은 걍 해당 소켓서버가 클라이언트swf에서 보낸 <policy-file-request/>를 받으면 crossdomain.xml의 내용을 send해주고 소켓을 끊으면 되는거였다. 그러면 클라이언트swf가 자동으로 다시 connect를 요청하며 정상동작이 된다. 
Security.loadPolicy를 이용하거나 웹경로 루트에 crossdomain.xml 파일을 두는것은 소켓 보안은 해결되지 않았다. 843 port에 인증서버를 두는것은 아직 안해봤지만 이건 될것같다. (실버라이트가 같은방식으로 943포트를 이용하므로 분명 flash의 보안방식을 베꼈을것 같으므로..)




Silverlight의 보안 정책

위에서 말했지만 Sliverlight의 소켓보안정책 해결법은 한가지 뿐이다. 943port에 인증용 소켓서버를 만들어야 하는것이다. flash와 마찬가지로 클라이언트xap이 메인서버에 접속하기 전에 같은 도메인(혹은 IP)의 943port에 접속을 시도한다. 접속되면 서버에게 <policy-file-request/>를 보내고 서버는 클라이언트에 clientaccesspolicy.xml 의 내용(MSDN에선 clientaccesspolicy.xml이 없으면 crossdomain.xml의 내용을 전송해도 된다고 하는데 실제로 해보진 않았다. 믿을 수가 있어야지!!!)을 전송하면 클라이언트xap이 자동으로 연결을 끊고 메인서버에 재접속을 시도한다.

그리고 또 한가지는 Silverlight에서 소켓통신으로 사용할 수 있는 port 범위가 제한되어 있다는거다. 일부 사이트에서는 4530-4532 port 라고 설명되었던데 아마도 구스리의 소켓통신 예제에서 사용된 소켓범위가 와전된것 같다. 실제로는 4502-4534 범위의 포트만 사용할 수 있다.






지금이야 많은 관련글들이 있어서 비교적 쉽게 해결할 수 있지만 처음 Flash가 socket통신에 보안 sandbox를 구현했을때는 아무런 설명이나 공지가 없어서 정상동작 하던 어플리케이션들이 에러발생도 안했는데 접속이 안되는 문제가 발생해서 꽤 애를 먹었던 것이 기억난다.
지금도 Flash나 Siverlight나 보안문제로 인한 미동작에 아무런 에러표시를 하지 않아서 원인 찾기가 매우 어려운 실정이다. 






※ 어쨌든 보안문제로 인해 동작을 못한 싸이월드 채팅을 이번 글도 정리할겸 소스를 수정해서 다시 오픈하게 되었네요.. 다음엔 Flex로 만든 싸이월드 채팅을 Siverlight3로 포팅해서 오픈해볼까 생각중입니다..






Posted by 귀뫄뉘

댓글을 달아 주세요