Window.postMessage()
Baseline
Widely available
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since 2015ë 7ì.
window.postMessage() ë©ìëë Window ì¤ë¸ì í¸ ì¬ì´ìì ìì íê² cross-origin íµì ì í ì ìê² í©ëë¤. ììë¡, íì´ì§ì ìì±ë íì
ê°ì íµì ì´ë, íì´ì§ì íì´ì§ ìì iframe ê°ì íµì ì ì¬ì©í ì ììµëë¤.
ì¼ë°ì ì¼ë¡, ë¤ë¥¸ íì´ì§ ê°ì ì¤í¬ë¦½í¸ë ê° íì´ì§ê° ê°ì íë¡í ì½, í¬í¸ ë²í¸ì í¸ì¤í¸ì ê³µì íê³ ìì ëì("ëì¼ ì¶ì² ì ì±
"ì¼ë¡ë ë¶ë ¤ ì§ëë¤.) ìë¡ ì ê·¼í ì ììµëë¤. window.postMessage() ë ì´ ì ì½ ì¡°ê±´ì ìì íê² ì°ííë 기ë¥ì ì ê³µí©ëë¤.
ëì²´ë¡, í windowë ë¤ë¥¸ window를 참조í ì ìê³ (ìì, targetWindow = window.opener), targetWindow.postMessage()를 íµí´ ë¤ë¥¸ windowì MessageEvent를 ì ì¡í ì ììµëë¤. ì´ë²¤í¸ë¥¼ ë°ë windowë ì´ë¥¼ íµí´ íìì ë°ë¼ ì´ë²¤í¸ë¥¼ ì²ë¦¬í ì ììµëë¤. window.postMessage() 를 íµí´ ì ë¬ë ì¸ì(ìì, "message")ë ì´ë²¤í¸ ê°ì²´ë¥¼ íµí´ ì´ë²¤í¸ë¥¼ ë°ë windowìì ì¬ì©í ì ììµëë¤.
문ë²
targetWindow.postMessage(message, targetOrigin, [transfer]);
targetWindow-
ë©ì¸ì§ë¥¼ ì ë¬ ë°ì windowì 참조. 참조를 ì·¨ëí ë°©ë²ì¼ë¡ë ë¤ìê³¼ ê°ì ê²ì´ ììµëë¤:*
Window.open(ì ì°½ì ë§ë¤ê³ ì ì°½ì 참조í ë),Window.opener(ì ì°½ì ë§ë window를 참조í ë),HTMLIFrameElement.contentWindow(ë¶ëª¨ windowìì ìë² ëëë<iframe>ì 참조í ë),Window.parent(ìë² ëëë<iframe>ìì ë¶ëª¨ window를 참조í ë),Window.frames+ an index value (named or numeric).
message-
ë¤ë¥¸ windowì ë³´ë´ì§ ë°ì´í°. ë°ì´í°ë the structured clone algorithmì ì´ì©í´ ì§ë ¬íë©ëë¤. ì´ë¥¼ íµí´ ì§ë ¬í를 ì§ì í íì ìì´ ëì windowì ë¤ìí ë°ì´í° ê°ì²´ë¥¼ ìì íê² ì ì¡í ì ììµëë¤. [1]
targetOrigin-
targetWindowì originì ì§ì í©ëë¤. ì´ë ì ì¡ëë ì´ë²¤í¸ìì ì¬ì©ëë©°, 문ìì´"*"(ë³ëë¡ ì§ì íì§ ììì ëíë) í¹ì URIì´ì´ì¼ í©ëë¤. ì´ë²¤í¸ë¥¼ ì ì¡íë ¤ í ëìtargetWindowì ì¤í¤ë§, í¸ì¤í¸ ì´ë¦, í¬í¸ê°targetOriginì ì ë³´ì ë§ì§ ìë¤ë©´, ì´ë²¤í¸ë ì ì¡ëì§ ììµëë¤. ì¸ ê°ì§ 모ë ì¼ì¹í´ì¼ ì´ë²¤í¸ê° ì ì¡ë©ëë¤. ì´ë ë©ì¸ì§ë¥¼ ë³´ë´ë ê³³ì ì ìí기 ìí¨ì ëë¤. ì를 ë¤ì´,postMessage()를 íµí´ ë¹ë°ë²í¸ê° ì ì¡ëë¤ë©´, ì ìì ì¸ ì 3ìê° ê°ë¡ì±ì§ 못íëë¡,targetOriginì ë°ëì ì§ì í ìì ìì ëì¼í URI를 ê°ì§ëë¡ ì¤ì íë ê²ì´ ì ë§ ì¤ìí©ëë¤. ë¤ë¥¸ windowì documentì ìì¹ë¥¼ ìê³ ìë¤ë©´, íìtargetOriginì*ë§ê³ í¹ì í ê°ì ì¤ì íì¸ì. í¹ì í ëìì ì§ì íì§ ìì¼ë©´ ì ìì ì¸ ì¬ì´í¸ì ì ì¡íë ë°ì´í°ê° ê³µê°ëì´ ë²ë¦½ëë¤. transferOptional-
ì¼ë ¨ì transfer ê°ì²´. ë©ì¸ì§ì í¨ê» ì ì¡ë©ëë¤. ì´ ê°ì²´ë¤ì ìì ê¶ì ìì 측ìê² ì ë¬ëë©°, ë ì´ì ì¡ì 측ìì ì¬ì©í ì ììµëë¤.
ëì¤íì¹ ì´ë²¤í¸(The dispatched event)
ì´íì JavaScript를 ì¤ííë©´ otherWindow ìì ì ë¬ë ë©ìì§ë¥¼ ë°ì ì ììµëë¤:
window.addEventListener("message", receiveMessage, false);
function receiveMessage(event) {
if (event.origin !== "http://example.org:8080") return;
// ...
}
ì ë¬ë ë©ìì§ì íë¡í¼í°ë ë¤ìê³¼ ê°ìµëë¤:
data-
ë¤ë¥¸ ìëì°ìì ì¨ ì¤ë¸ì í¸.
origin-
postMessageê° í¸ì¶ë ë ë©ìì§ë¥¼ ë³´ë´ë ìëì°ì origin. ì´ ë¬¸ìì´ì íë¡í ì½ê³¼ "://", í¸ì¤í¸ ëª (ì¡´ì¬í ê²½ì°), ê·¸ë¦¬ê³ ":"ì ë¤ì ì´ì´ ì§ë í¬í¸ ë²í¸ê° ì°ê²°ë ê²ì ëë¤. (í¬í¸ ë²í¸ë í¬í¸ ë²í¸ê° ëª ê¸°ëìê±°ë 주ì´ì§ íë¡í ì½ì ëí´í¸ í¬í¸ì ë¤ë¥¼ ê²½ì°). ì íì ì¸ originì ìë¡https://example.org(ì´ ê²½ì° port443),http://example.net(ì´ ê²½ì° port80), andhttp://example.com:8080ê° ììµëë¤. ì´ originìpostMessageí¸ì¶ ì´í ë¤ë¥¸ ìì¹ë¡ ì´ëëìì ì ìë í´ë¹ ìëì°ì íì¬ ëë 미ëì origin ì´ ë³´ì¥ëì§ ìëë¤ë ì ì 주ìíì¸ì. source-
ë©ìì§ë¥¼ ë³´ë¸
windowì¤ë¸ì í¸ì ëí 참조. ì´ê²ì ì¬ì©í¨ì¼ë¡ ë¤ë¥¸ orignì ìë ë ê°ì ìëì°ìì ìë°©í¥ íµì ì í립í ì ììµëë¤.
ë³´ì 문ì (Security concerns)
ë¤ë¥¸ ì¬ì´í¸ë¡ë¶í° ë©ìì§ë¥¼ ë°ê³ ì¶ì§ ìë¤ë©´, message ì´ë²¤í¸ë¥¼ ìí´ ì´ë í ì´ë²¤í¸ 리ì¤ëë ì¶ê°íì§ ë§ì¸ì. ì´ê²ì ë³´ì 문ì 를 í¼í ì ìë ë¨ìëª
ë£í ë°©ë²ì
ëë¤.
ë¤ë¥¸ ì¬ì´í¸ë¡ë¶í° ë©ìì§ë¥¼ ë°ê³ ì íë¤ë©´, originê³¼ ì¶ê°ë¡ source íë¡í¼í°ë¥¼ ì´ì©í´ íì ë³´ë´ë 쪽ì ì ìì íì¸íì¸ì. ììì ì´ë¤ ìëì°(ì: http://evil.example.com 를 í¬í¨)ë ë¤ë¥¸ ìëì°ì ë©ìì§ë¥¼ ë³´ë¼ ì ìì¼ë©°, ì ì ìë ë°ì ìê° ì
ìì ì¸ ë©ìì§ë¥¼ ë³´ë´ì§ ìëë¤ë ë³´ì¥ì´ ììµëë¤. ê·¸ë¬ë ì ìì íì¸íëë¼ë ìì ë ë©ìì§ì 구문ì íì íì¸í´ì¼ í©ëë¤. ê·¸ë ì§ ìì¼ë©´ ì 뢰í ì ìë ë©ìì§ë§ ì ì¡í ê²ì¼ë¡ 기ëí ì¬ì´í¸ì ë³´ì 구ë©ì¼ë¡ ì¸í´ í¬ë¡ì¤ ì¬ì´í¸ ì¤í¬ë¦½í¸ ë¹íì´ ì길 ì ììµëë¤.
postMessage 를 ì´ì©í´ ë¤ë¥¸ ìëì°ë¡ ë°ì´í°ë¥¼ ë³´ë¼ ë, íì ì íí íê² origin (*ê° ìëë¼) ì ì§ì íì¸ì. ì
ìì ì¸ ì¬ì´í¸ë ë¹ì ì´ ëª¨ë¥´ë ì¬ì´ì ìëì°ì ìì¹ë¥¼ ë³ê²½í ì ìê³ , ë°ë¼ì postMessage를 ì¬ì©íì¬ ì ì¡ë ë°ì´í°ë¥¼ ê°ë¡ì± ì ììµëë¤.
Example
/*
* <http://example.com:8080>ì ìë ìëì° Aì ì¤í¬ë¦½í¸:
*/
var popup = window.open(...popup details...);
// íì
ì´ ìì í ë¡ëëìì ë:
// This does nothing, assuming the window hasn't changed its location.
popup.postMessage("The user is 'bob' and the password is 'secret'",
"https://secure.example.net");
// This will successfully queue a message to be sent to the popup, assuming
// the window hasn't changed its location.
popup.postMessage("hello there!", "http://example.com");
function receiveMessage(event)
{
// Do we trust the sender of this message? (might be
// different from what we originally opened, for example).
if (event.origin !== "http://example.com")
return;
// event.source is popup
// event.data is "hi there yourself! the secret response is: rheeeeet!"
}
window.addEventListener("message", receiveMessage, false);
/*
* In the popup's scripts, running on <http://example.com>:
*/
// Called sometime after postMessage is called
function receiveMessage(event) {
// Do we trust the sender of this message?
if (event.origin !== "http://example.com:8080") return;
// event.source is window.opener
// event.data is "hello there!"
// Assuming you've verified the origin of the received message (which
// you must do in any case), a convenient idiom for replying to a
// message is to call postMessage on event.source and provide
// event.origin as the targetOrigin.
event.source.postMessage(
"hi there yourself! the secret response " + "is: rheeeeet!",
event.origin,
);
}
window.addEventListener("message", receiveMessage, false);
Notes
ìëì° documentì ì¥ìì 무ê´íê², ììì ìëì°ë ì¸ì ë ì§ ë©ìì§ë¥¼ ë³´ë´ê¸° ìí´ ììì ë¤ë¥¸ ìëì°ì ìë í¨ìì ì ê·¼í ìë ììµëë¤. ê·¸ëì ì´ë²¤í¸ 리ì¤ëë ë©ìì§ë¥¼ ì·¨ëí ë, origin ëë source íë¡í¼í°ë¥¼ ì´ì©í´, 먼ì ë©ìì§ ì¡ì ìì ìë³ ì 보를 ì²´í¬í´ì¼ë§ í©ëë¤. ì´ê²ì ì무리 ê°ì¡°í´ë ì§ëì¹ì§ ììµëë¤. ìëíë©´, origin ëë source íë¡í¼í°ì ì²´í¬ ì¤í¨ë í¬ë¡ì¤ ì¬ì´í¸ ì¤í¬ë¦½í
공격ì ê°ë¥íê² í기 ë문ì
ëë¤.
ë¹ëê¸°ë¡ ì ë¬ë ì¤í¬ë¦½í¸(íììì, ì ì ìì± ì´ë²¤í¸)ìì, postMessageì í¸ì¶ìì íë³ì´ ë¶ê°ë¥í ë, postMessageì ìí´ ë³´ë´ì§ ì´ë²¤í¸ë¥¼ 기ë¤ë¦¬ë ì´ë²¤í¸ í¸ë¤ë¬ë ìì¸ë¥¼ ë°ììíµëë¤.
postMessage()ë ë³´ë¥ ì¤ì¸ 모ë ì¤í 컨í
ì¤í¸ê° ìë£ë íìë§ MessageEventì ë°ì¡íëë¡ ì¤ì¼ì¤í©ëë¤. ì를 ë¤ì´, ì´ë²¤í¸ í¸ë¤ë¬ìì postMessage()ê° í¸ì¶ëë ê²½ì°, MessageEventê° ë°ì¡ë기 ì ì í´ë¹ ì´ë²¤í¸ì ëí ëë¨¸ì§ í¸ë¤ë¬ì ë§ì°¬ê°ì§ë¡ ì´ë²¤í¸ í¸ë¤ë¬ë ìë£ê¹ì§ ì¤íë©ëë¤.
ì ë¬ë ì´ë²¤í¸ì origin íë¡í¼í°ì ê°ì í¸ì¶íë ìëì°ì document.domain íì¬ ê°ì ìí¥ì ë°ì§ ììµëë¤.
IDN í¸ì¤í¸ ëª
ì ííì¬, origin íë¡í¼í° ê°ì ì¼ê´ëê² Unicode ëë punycodeê° ìëëë¤. ê·¸ëì, IDN ì¬ì´í¸ë¡ ë¶í° ë©ìì§ë¥¼ 기ëíë ê²½ì° ìµìì í¸íì± ì²´í¬ë¥¼ í기ìí´, IDNê³¼ Punycodeì ê° ëª¨ë를 ì²´í¬íì¸ì. ì´ ê°ì ê²°êµ ì¼ê´ëê² IDNì´ ë ê²ì´ì§ë§, íì¬ë¡ìë IDNê³¼ Punycode ììì 모ë ì²ë¦¬í´ì¼ í©ëë¤.
ì¡ì ì°½ì javascript: ëëdata: URLì´ ìì ëì origin íë¡í¼í°ì ê°ì URLì ë¡ëí ì¤í¬ë¦½í¸ì originì
ëë¤.
Using window.postMessage in extensions
window.postMessageë í¬ë¡¬ ì½ë(ì: íì¥ ì½ë ë° ê¶í ì½ë)ë¡ ì¤íëë JavaScriptìì ì¬ì©í ì ìì§ë§, ë°ì¡ë ì´ë²¤í¸ì source íë¡í¼í°ë ë³´ì ì íì¼ë¡ íì nullì
ëë¤. (ë¤ë¥¸ íë¡í¼í°ìë ìì ê°ì´ ììµëë¤.)
ì½í
ì¸ ëë ì¹ ì»¨í
ì¤í¸ ì¤í¬ë¦½í¸ê° targetOriginì ì§ì íì¬ íì¥ ì¤í¬ë¦½í¸(백그ë¼ì´ë ì¤í¬ë¦½í¸ ëë ì½í
ì¸ ì¤í¬ë¦½í¸)ì ì§ì íµì íë ê²ì ë¶ê°ë¥í©ëë¤. ì¹ ëë ì½í
ì¸ ì¤í¬ë¦½í¸ë "*"ì targetOriginì´ í¬í¨ë window.postMessage를 ì¬ì©íì¬ ëª¨ë 리ì¤ëìê² ë¸ë¡ëìºì¤í¸í ì ìì§ë§, íì¥ì ì´ë¬í ë©ìì§ì ë°ì ì§ë¥¼ íì¸í ì ìê³ ë¤ë¥¸ 리ì¤ë(ì ì´íì§ ìë ìì ì í¬í¨)ê° ìì í ì ì기 ë문ì ì´ ìì
ì ì¤ì§ë©ëë¤.
컨í ì¸ ì¤í¬ë¦½í¸ë runtime.sendMessage 를 ì¬ì©íì¬ ë°±ê·¸ë¼ì´ë ì¤í¬ë¦½í¸ì íµì í´ì¼ í©ëë¤. ì¹ ì»¨í ì¤í¸ ì¤í¬ë¦½í¸ë ì¬ì©ì ì§ì ì´ë²¤í¸ë¥¼ ì¬ì©íì¬ ì»¨í ì¸ ì¤í¬ë¦½í¸(íìí ê²½ì° ê²ì¤í¸ íì´ì§ìì ì¤ëíì ë°©ì§í기 ìí´ ììë¡ ìì±ë ì´ë²¤í¸ ì´ë¦ í¬í¨)ì íµì í ì ììµëë¤.
ë§ì§ë§ì¼ë¡, file: URLì íì´ì§ì ë©ìì§ë¥¼ ë³´ë¼ ê²½ì° targetOrigin íë¼ë¯¸í°ë¥¼ "*"ë¡ í íìê° ììµëë¤. file:// ì ë³´ì ì íì¼ë¡ ì¬ì©í ì ìì¼ë©° ì´ ì íì í¥í ìì ë ì ììµëë¤.
ëª ì¸ì
| Specification |
|---|
| HTML > # dom-window-postmessage-options-dev > |