익스플로러 5.5(?) 이후 부터는 스크립트로 server1.abc.com 과 live.abc.com 간의 상호 도메인이 다른 프레임이나 윈도우의 document에 관련된 작업을 시도하면 보안에러가 발생한다.

Cross-Frame Scripting 에 대한 MS의 말..
http://msdn2.microsoft.com/en-us/library/ms533028.aspx

넷스케이프 같은 경우에는 스크립트(Signed scripts)에서 브라우져자체에 포함(?)된 클래스(netscape.security.PrivilegeManager)를 호출하여 이를 해결할 수 있다고 한다.

Signed Scripts 에 대한 Mozilla의 말..
http://www.mozilla.org/projects/security/components/signed-scripts.html

그럼에도 불구하고 다른 도메인에 대한 opener 나 parent 접근이 필요할 경우에는 JavaScript 를 통해 document.domain 을 설정해 주면된다.
<script language="javascript">
    document.domain = "공통도메인명";
</script>
상호 연결 시켜야 하는 웹 페이지에 자신들의 공통된 도메인을 지정해 주면 컨트롤이 가능해진다.

만약, server1.abc.com의 open.htm이 window.open 으로 live.abc.com을 호출하고 live.abe.com 의 child.htm이 opener 로 server1.abc.com 을 접근해야 한다면
다음 스크립트를 두 페이지에 정의해 주면 되고, 스크립트는 페이지 어디에 위치해 있든지 특별한 상관은 없다.

<script language="javascript">
    document.domain = "abc.com";
</script>

※ 주의, 도메인 명을 잘못 입력한 경우에는 "잘못된 인수입니다." 라는 JavaScript 오류가 발생한다.

=========================================================================================
cross frame scripting 을 해결하는 다른 방법으로는 HTA가 있다.
html페이지가 아닌 hta(html application)페이지를 만들어야 한다.

http://msdn.microsoft.com/workshop/author/hta/hta_node_entry.asp

※ 다음은 HTA에서 javascript로 iframe의 document를 참조한 예

확장자를 hta로 저장하시고 브라우저로 실행.

<html>
<head>
  <title>hta cross scripting</title>
  <script>
    function window.onload() {
       alert(myframe.document);
    }
  </script>
</head>
<body scroll="no">
  <iframe id=myframe src="http://kin.naver.com/"></iframe>
</body>
</html>

다음에, 예를 하나 들면..
kin.naver.com을 iframe에 넣고 검색어에 "스크립트"라는 단어를 넣은 후 검색버튼을 누르게 한 HTA소스이다.

<html>
<head>
  <title>hta cross scripting</title>
  <script>
    function window.onload() {
       myframe.document.search.query.value="스크립트";
       myframe.check_query();
    }
  </script>
</head>
<body scroll="no">
  <iframe id=myframe src="http://kin.naver.com/" width=100% height=100%></iframe>
</body>
</html>
ajax 테스트를 위한 코드(IE6 확인필요)

테스트 URL : http://db.garada.co.cc/ajaxtest.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
 <HEAD>
  <TITLE> New Document </TITLE>
  <META NAME="Generator" CONTENT="EditPlus">
  <META NAME="Author" CONTENT="">
  <META NAME="Keywords" CONTENT="">
  <META NAME="Description" CONTENT="">
  <SCRIPT LANGUAGE="JavaScript">
  <!--

function ajaxload(divid, url){
    var page_request = false
    if (window.ActiveXObject){ //Test for support for ActiveXObject in IE first (as XMLHttpRequest in IE7 is broken)
        try {
        page_request = new ActiveXObject("Msxml2.XMLHTTP")
        }
        catch (e){
            try{
            page_request = new ActiveXObject("Microsoft.XMLHTTP")
            }
            catch (e){}
        }
    }
    else if (window.XMLHttpRequest) // if Mozilla, Safari etc
        page_request = new XMLHttpRequest()
    else
        return false

    var ajaxfriendlyurl=url.replace(/^http:\/\/[^\/]+\//i, "http://"+window.location.hostname+"/")
    page_request.onreadystatechange=function(){
       if(page_request.readyState==4 && page_request.status == 200 && page_request.statusText=='OK') {
       //로딩되면 할일을 여기에 적는다. 긴 내용이 필요하다면 callback 함수를 외부에 정의해서 사용
       //alert(page_request.responseText);
       document.getElementById(divid).innerHTML=page_request.responseText;
       }
    }

    //변경된 페이지를 받기위한 더미값
    var bustcache=(ajaxfriendlyurl.indexOf("?")!=-1)? "&"+new Date().getTime() : "?"+new Date().getTime()
    page_request.open('GET', ajaxfriendlyurl+bustcache, true)
    page_request.send(null)
}

setInterval("ajaxload(\"result\",\"http://db.garada.co.cc/rand.php\")", 1000); //1000(1초간격으로 실행: 주기적)

  //-->
  </SCRIPT>
 </HEAD>

 <BODY>
  <div id="result"></div>
  <input type='button' onclick='ajaxload("result", "http://db.garada.co.cc/rand.php")' value='Change Text'/>
 </BODY>
</HTML>


XMLHTTPRequest 객체에 대한 더많은 설명을 보려면

http://www.w3.org/TR/XMLHttpRequest/
https://developer.mozilla.org/ko/XMLHttpRequest

참고.

'개발도 하냐?' 카테고리의 다른 글

HTML vs XHTML?  (0) 2009.12.01
웹표준 가입폼  (0) 2009.11.30
FLEX AIR - 케이웨더 날씨 모듈  (0) 2009.11.18
FLEX AIR 시스템트레이에 프로그램 넣기  (0) 2009.11.18
The value for the useBean class attribute...  (0) 2009.11.16

+ Recent posts