Program/C & C++

Flex3 Socket 통신시 Policy Request 처리하기 ( 소켓 인증 권한 획득하기 )

너구리V 2012. 9. 17. 14:47

출처 : http://ummae.tistory.com/210


얼마전 재미로 만들기 시작한 것이 있다. 웹과 연동된 온라인 한자 인식기를 만드는 것이였다.
인식기엔진을 만드는 것은 이미 전에도 만들어 본 경험이 있기 때문에 그리 어렵지 않고 빠르게 만들 수 있었다. 

웹과(Client) 통신을 위해 소켓통신을 하기로 했는데 서버는 책을 참조해가며 IOCP로 후딱 만들고, Client는 Flex3로 디자인하였다.

그런데 여기서 문제가 발생했다. Localhost 테스트에서는 아무런 문제 없이 동작을 했는데, 정작 서버에 올리고 Client (swf)폐이지에 접속하니 "<policy-file-request/>\0"문자열이 서버로 날아가고 Client는 일정시간 대기하다가 죽는 것이였다. 

Adobe FlexDoc을 조금 뒤져보니 Socket 통신을 할 때는 보안을 위해 일련의 인증 과정이 필요하다고 한다. 그 과정은 다음과 같다.

0. Client -> connecting -> accept -> sever
1. Client -> Send("<policy-file-request/>\0") -> server
2. Server -> Send(crossdomain.xml) -> client
3. Server closesocket(client);

대략 이러하다.

인증방식은 위와 같은 
1.Flex의 XMLSocket 혹은 Socket 을 사용해 서버에 접속해서 인증 권한을 획득하는 방법이 있고,
2.웹서버에 접속해서 인증권한을 획득하는 방법이 있다.

애초에 플래쉬 도큐먼트레퍼런스에는 저렇게 언급이 되어있었으나 최근들어 플레쉬 플레이어의 버전이 업데이트 되면서 2번과 같은 인증 방법은 더이상 '유효' 하지 않은 방법이 되 이제는 1번 방법만 사용이 가능해졌다.
( 2번 방법으로 코피나게 시도하다가 좌절했었는데, 알고보니 최신 버전의 Flex3와 Flash player를 용하는 개발환경에서 될리가 없었더라.... )

아무튼.. 위에서 보면 서버측에서 클라이언트가 <policy-file-request/>라는 문자열을 보내 올때, 서버가 crossdomain.xml이라는 파일을 전송하는걸 볼 수 있는데( 편의상 이렇게 표현했지만 엄밀히 애기하자면 crossdomain.xml의 내용을 전송하는 것이다. ) 이 파일은 소켓통신을위한 보안 정책이 기록된 파일이라고 볼수 있다. (자세한 작성 방법은 여기를 참조하자.) 이렇게 작성이 완료된 파일을 클라이언트가 요청할시 간단히 '보내' 주기만 하면 끝이다. 

팁으로 아주(?) 쉽게 이 문제를 해결하는 방법을 적어본다.
여기에서 Policy file server를 따로 구축해서 인증 권한을 획득하는 예제 소스코드를 받을 수 잇다. 작성된 언어는 Perl과 Python인데, 이 소스 코드중에 Standalon 형식으로 돌아가는 Python 예제가 있다. 이 예를 따로 수정할 필요없이 그대로 사용해도 된다. 사용법은 flashpolicyd.py --port=9001 --file=crossdomain.xml,이다. 여기서 당연히 아시겠지만 --port는 policy 파일 서버가 리스닝할 포트번호고 --file은 클라이언의 인증권한 요청시 보낼 인증 파일의 이름이다.

이 예제를 서버가 동작하고 있는 곳에 실행을 하고, Client(Flex3)에서 

.....
Security.loadPolicyFile("xmlsocket://127.0.0.1:9001") // Standalon으로 돌아가고 있는 corssdomain.xml 파일 서버(바로 위에 언급한 Python 예제)
m_socket.connect("127.0.0.1",9000); // 실제 작업을 하게될 서버
.....


위와 같이 해주면 Client는 인증권한을 서버가 설치된 컴퓨터의 9001번 포트에서 얻고, 소켓 접속은 최종적으로 9000번 포트에 요청하게 된다.(인증권한을 얻은뒤 접속은 해제되므로)

반응형