브라우저에는 same origin policy 라는 것이 있습니다.
악의적인 자바스크립트 코드로 부터 보호하기 위하여 어떤 영향을 받는 문서(document)와 다른 도메인을 가지고 있을경우 메시징 자체를 막아버리는 정책입니다. 보안상 제약이기 때문에 필요악이긴 합니다만, 실제 개발을 해 나가게 될때는 여간 불편한게 아닙니다. 예를들어 가젯들이 한페이지 내에 iframe으로 여러개 존재하고 이 가젯들끼리 통신을 하고자 한다면 어떻게 해야 할까요. 이럴 경우 same origin policy때문에 문서간 스트립트 메시징(cross document messaging)이 불가능 합니다(IE에서는 브라우저 옵션 설정을 통해 이 제약을 해제할 수는 있습니다만, 위험합니다). 그래서 서버단으로 콜을 날리는 식으로 다소 비효율적으로 사용해 왔던게 사실입니다.
HTML5에서는 이에 대한 대안이 포함되어 있습니다.
현재 working draft로 진행되고 있는 HTML5 스팩의 7.4 Cross-document messaging 부분에 설명이 잘 나와 있으며, 저 스팩에 나온 예제 소스코드를 보면 단번에 알 수 있습니다.
주의할 점이 하나 있습니다.
IE8과 Firefox3에서 이 메소드를 지원합니다만, 두번째 아규먼트인
- IE8 postMessage
- Firefox3 postMessage
악의적인 자바스크립트 코드로 부터 보호하기 위하여 어떤 영향을 받는 문서(document)와 다른 도메인을 가지고 있을경우 메시징 자체를 막아버리는 정책입니다. 보안상 제약이기 때문에 필요악이긴 합니다만, 실제 개발을 해 나가게 될때는 여간 불편한게 아닙니다. 예를들어 가젯들이 한페이지 내에 iframe으로 여러개 존재하고 이 가젯들끼리 통신을 하고자 한다면 어떻게 해야 할까요. 이럴 경우 same origin policy때문에 문서간 스트립트 메시징(cross document messaging)이 불가능 합니다(IE에서는 브라우저 옵션 설정을 통해 이 제약을 해제할 수는 있습니다만, 위험합니다). 그래서 서버단으로 콜을 날리는 식으로 다소 비효율적으로 사용해 왔던게 사실입니다.
HTML5에서는 이에 대한 대안이 포함되어 있습니다.
postMessage(message, targetOrigin)예를 들어, 문서 A가 문서 B를 포함하는
object엘러먼트를 포함하고 있고, 문서 A에 있는 스크립트는 문서 B에postMessage()를 호출하면, 엘러먼트에서 메시지 이벤트가 발생한다. 문서 A의 스크립트 코드는 다음과 같을 것이다.var o = document.getElementsByTagName('object')[0];
o.contentWindow.postMessage('Hello world', 'http://b.example.org/');들어오는 이벤트들을 위한 이벤트 핸들러를 구현하기 위해, 스크립트는 addEventListener()(혹은 비슷한 메커니즘으로..)을 사용한다. 예를들어 문서 B에 잇는 스크립트는 다음과 같을 것이다.
document.addEventListener('message', receiver, false);
function receiver(e) {
if (e.origin == 'http://example.com') {
if (e.data == 'Hello world') {
e.source.postMessage('Hello', e.origin);
} else {
alert(e.data);
}
}
}이 스크립트는 도메인이 받아들이고자 하는 게 맞는지 먼저 검사하고, 메시지를 보고, 사용자에게 보여주거나, 처음 메시지를 보낸 곳으로 다시 메시지를 되돌려 보낸다.
주의할 점이 하나 있습니다.
IE8과 Firefox3에서 이 메소드를 지원합니다만, 두번째 아규먼트인
targetOrigin 가 IE8에서는Optional이고 Firefox3에서는 Required입니다. 다음 링크를 참고 하세요. - IE8 postMessage
- Firefox3 postMessage





댓글을 달아 주세요