FindingAndPreventing_CrossSiteRequestForgery.pdf

Finding and Preventing Cross-Site Request

북마크릿에 대한 여러가지 테스트를 하던중, 당연히 될 것이라고 생각햇던 북마크릿에서의 AJAX 호출이 갑자기 에러를 토해냈다.
"Access Deny".....

이유를 찾아보니 브라우저의 원천서버 정책(server of origine)에 의해 타 도메인으로 요청을 보낼 수가 없다는 것이다.(Cross-Domain Ajax Insecurity)

해결책을 찾아 몇시간을 골머리 썩다가 아이러니 하게도 "Finding and Preventing Cross-Site Request" 라는 자료를 통해 해결책을 찾게 되었다.

간단히 말하면, "Ajax 요청은 막히지만 폼 전송은 가능하다" 이다.
오...맞다 트랙백도 그래서 문제가 됐었다. 전에 문제라고 생각했던 것이 절대절명의 위기에서 희망으로 떠올랐다.

자 그럼 AJAX 처럼 콜백을 받아 처리할 방법은 없는가?

여기서 갑자기 YUI 의 connection manager 를 팀원들을 위해 문서화 하면서 해석했던 기억이 났다.
그때 YUI 는 AJAX 로 파일 업로드를 하기위해 폼 전송시 XmlHttpRequest 를 사용하지 않고 IFrame 을 사용했다. 그리고 콜백을 지원했다.(YUI 의 Forms and File Upload )

YUI 를 수개월간 써오면서.. 바로 생각해 내지 못했다니...돌고 돌아 결국 가장 가까운 곳에 해답이 있었다.

허탈하고도 기쁘도다

콜백 호출은 되나...response 객체의 responseText 값을 읽을 수가 없다..역시 보안문제로..

다른 방법을 시도중...

---이하 답글에 따라 추가한 내용 ----

문제가 됏던 부분은 바로 로그인 처리문제였다.
데이타의 전송은  AJAX  를 사용하지 않고 폼 전송으로 가능하지만 북마크릿의 로그인 처리가 문제가 되었던 것이다.
할수없이 로그인 처리는 북마크릿에 아이프레임을 사용하기로 했다. 하지만 이방법도 해결해야 하는 것들이 있다.

문제1 - 아이프레임으로 로그인 폼을 보이게 하는 경우 로그인 처리를 수행하여도 도메인이 다른 사이트의 쿠키를 거부하는 것이 브라우저의 기본 설정이다. 따라서 쿠키로 로그인 인증하는 경우 쿠키가 무시되어 로그인이 안된다.

해결1 - P3P 해더를 쿠키를 읽어갈 수 있도록 보안을 설정해준다.
아이프레임 안에 들어갈 사이트에서 P3P 해더를 설정하면 쿠키가 유효하게 동작한다.

문제2 - 로그인처리후 서로 데이타에 접근할 수 없는 상태에서 parent  는 어떻게 로그인이 되었는지 알수있나? 이 부분이 가장 까다로웠다.

해결2.1 - 아이프레임의 사이즈를 보고 판단한다. 두가지가 중요하다. 하나는 ifame 내의 페이지에서 parent 안에 있는 아이프레임의 사이즈를 줄일 수 있는가? 가능하다.  resizeTo 를 이용해 줄일 수 있다. 즉 로그인이 안된상태에서는 아이프레임을 늘려서 로그인 창을 보여주고, 로그인 처리가 되엇으면 아이프레임창을 0 으로 줄여버린다. 이 창 사이즈를 체크하면 로그인이 되었는지 아닌지 알 수 있다.

해결2.2 - 다른 문제 하나는 어느시점에서 아이프레임 사이즈를 체크할 것인가 이다. 무언가 이벤트가 있어야 체크할 시점을 결정할 수 있다. onload 는 잘 동작하지 않는다. 아이프레임의 onreadystatechange 이벤트를 이용해서 아이프레임이 로드 완료된 시점에서 아이프레임을 체크한다. but, 바로체크하면 안된다. 문서가 로드되고 resizeTo 로 사이즈가 조정될 시간을 줘야한다.
setTimeout 을 이용해 약간의 딜레이를 갖고 사이즈를 체크한다.


혹시 더 좋은 해결책을 아시는 분 트랙백 바랍니다.

Trackback Address :: http://steelleg.tistory.com/trackback/38 관련글 쓰기

댓글을 달아 주세요

  1. Favicon of http://efolder.tistory.com BlogIcon 하루하루 2007/07/12 14:40 Address Modify/Delete Reply

    성공 하셨습니까?
    저도 같은 문제로 고민하다가 우연히 이곳에 들르게 되었네요. ^^
    성공하셨으면 노하우좀 부탁 드려요~ ^^;;

  2. 무쇠다리 2007/07/13 09:26 Address Modify/Delete Reply

    아 ..해결은 햇습니다.
    글을 업데이트 하도록 하지요

  3. 지나가다 2008/05/26 16:31 Address Modify/Delete Reply

    혹시 dynamic-javascript로 해보셨나여?? 꽁수입니다만.
    <script type="text/javascript">
    var returnValue = '';
    </script>
    <script type="text/javascript" src="processURL.asp(or etc..)"></script>

    * processURL.asp페이지는 서버사이드에서 처리 한 결과를 스크립트 returnValue 변수에 값을 넣어 주는 역활을 합니다.


    예전에 ajax로 작업하기전에 즐겨 사용하던 방식입니다.