๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
1๏ธโƒฃ Web/๊ธฐํƒ€

[Web] Chrome Cross-Origin ์ •์ฑ… ๋ณ€๊ฒฝ์— ๋”ฐ๋ฅธ iframe ํ™œ์šฉ ๋ฐฉ์•ˆ (feat. PostMessage)

by seolhee2750 2023. 10. 14.

ํšŒ์‚ฌ ์„œ๋น„์Šค์—์„œ ๊ธฐ์กด์— iframe์„ ์“ฐ๋˜ ๋ถ€๋ถ„์˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

์ฐพ์•„๋ณด๋‹ˆ Chrome ์ •์ฑ… ๋ณ€๊ฒฝ์— ์˜ํ•œ ๊ฒƒ์ด์—ˆ๋Š”๋ฐ, ๊ทธ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ์„ ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.

 

 

๐Ÿ“ ๋ฌธ์ œ ์ƒํ™ฉ

Uncaught DOMException : Blocked a frame with origin "๋„๋ฉ”์ธ" from accessing a cross-origin

iframe์„ ๋กœ๋“œํ•˜๋Š”๋ฐ์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ์ง€๋งŒ

iframe๊ณผ ๋ถ€๋ชจ์ฐฝ๊ฐ„์˜ ํ†ต์‹ ์ด ์žˆ์„ ๊ฒฝ์šฐ๋งˆ๋‹ค ๊ณ„์† ์œ„์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

 

์šฐ๋ฆฌ ์„œ๋น„์Šค์˜ ๊ฒฝ์šฐ document.domain ์„ค์ •์„ ํ†ตํ•ด ๋ถ€๋ชจ์ฐฝ๊ณผ ์ž์‹์ฐฝ(๋‹ค๋ฅธ ๋„๋ฉ”์ธ)๊ฐ„์˜ ํ†ต์‹ ์„ ๊ตฌํ˜„ํ–ˆ๋Š”๋ฐ,

์ด์™€ ๊ด€๋ จํ•˜์—ฌ Chrome ์ •์ฑ… ๋ณ€๊ฒฝ์ด ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ์ด์—ˆ๋‹ค.

 

2023๋…„ 8์›” ๊ธฐ์ค€ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ, ๊ฐ™์€ ํฌ๋กฌ ๋ฒ„์ „์ด๋”๋ผ๋„

๊ฐ ์‚ฌ์šฉ์ž์˜ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋กœ์ปฌ๊ณผ ์„œ๋ฒ„์—์„œ ๋‘˜ ๋‹ค ์ •์ƒ ์ž‘๋™ํ•˜๊ฑฐ๋‚˜,

๋กœ์ปฌ์—์„œ๋งŒ ์ •์ƒ ์ž‘๋™, ๋˜๋Š” ๋กœ์ปฌ๊ณผ ์„œ๋ฒ„์—์„œ ๋ชจ๋‘ ์ž‘๋™๋˜์ง€ ์•Š๋Š” ๋“ฑ

์ผ๋ถ€ ํ™˜๊ฒฝ์—์„œ๋งŒ document.domain์ด ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ–ˆ๋‹ค.

 

 

๐Ÿ“ ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋ธ”๋กœ๊ทธ

22๋…„ 11์›”, 23๋…„ 5์›”์— ๊ฒŒ์‹œ๋œ ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ–ˆ๋‹ค.

 

โ–ช๏ธ 2022๋…„ 11์›”

https://developer.chrome.com/blog/immutable-document-domain/

 

Chrome will disable modifying `document.domain` to relax the same-origin policy - Chrome for Developers

If your website relies on setting `document.domain`, your action is required.

developer.chrome.com

 

โ–ช๏ธ 2023๋…„ 5์›”

https://developer.chrome.com/blog/document-domain-setter-deprecation/#origin-agent-cluster

 

Chrome disables modifying `document.domain` - Chrome for Developers

If your website relies on setting document.domain, your action is required.

developer.chrome.com

 

์œ„ ๋ธ”๋กœ๊ทธ์˜ ๋‚ด์šฉ์„ ์š”์•ฝํ•˜๋ฉด,

 

๊ธฐ์กด์—๋Š” ๋ถ€๋ชจ์ฐฝ๊ณผ ์ž์‹์ฐฝ(iframe)์ด ์„œ๋กœ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์„ ๊ฐ€์งˆ ๋•Œ

document.domain ์„ค์ •์„ ์ด์šฉํ•˜๋ฉด ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ–ˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜ ์ด์ „๋ถ€ํ„ฐ ์ œ๊ธฐ๋œ document.domain์˜ ๋ณด์•ˆ ๊ด€๋ จ ์šฐ๋ ค๋ฅผ ๋ฐ˜์˜ํ•˜์—ฌ

Chrome์—์„œ๋Š” ์ •์ฑ…์œผ๋กœ ๊ธˆ์ง€ํ•˜๋„๋ก ํ•œ ๊ฒƒ์ด๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ๊ทธ์— ๋Œ€ํ•œ ๋Œ€์•ˆ์œผ๋กœ, PostMessage๋ฅผ ํ™œ์šฉํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ๋‹ค.

 

 

๐Ÿ“ PostMessage ํ™œ์šฉ ์˜ˆ์‹œ

์šฐ๋ฆฌ ํšŒ์‚ฌ ์„œ๋น„์Šค์—์„œ๋Š” ๋ถ€๋ชจ์ฐฝ์—์„œ ํŠน์ •ํ•œ ๋™์ž‘์ด ์žˆ์„ ๋•Œ,

์ž์‹์ฐฝ์—์„œ ๊ทธ์— ๋Œ€์‘ํ•˜๋Š” ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ๋˜๋„๋ก ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด ๋ถ€๋ชจ์ฐฝ์—์„œ A๋ผ๋Š” ๋™์ž‘์ด ๋ฐœ์ƒํ•˜๋ฉด ์ž์‹์ฐฝ์— A`๋ผ๋Š” ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ ,

๋ถ€๋ชจ์ฐฝ์—์„œ B๋ผ๋Š” ๋™์ž‘์ด ๋ฐœ์ƒํ•˜๋ฉด ์ž์‹์ฐฝ์— B`๋ผ๋Š” ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

๊ธฐ์กด์—๋Š” document.domain์„ ์ด์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—

์ž์‹์ฐฝ์—์„œ ๋ฐœ์ƒ๋˜์–ด์•ผ ํ•˜๋Š” ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ๋กœ์ง๊นŒ์ง€๋„ ๋ชจ๋‘ ๋ถ€๋ชจ์ฐฝ์— ํ•ด๋‹นํ•˜๋Š” ์ฝ”๋“œ์— ์ž‘์„ฑ๋˜์–ด์žˆ์—ˆ๋‹ค.

 

์ด๋Ÿฌํ•œ ๋กœ์ง์„ PostMessage๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋กœ์ง์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด

1๏ธโƒฃ ๋ถ€๋ชจ์ฐฝ์—์„œ ํŠน์ • ์ด๋ฒคํŠธ(A or B) ๋ฐœ์ƒ
2๏ธโƒฃ ์ž์‹์ฐฝ์œผ๋กœ ํ•ด๋‹น ์ด๋ฒคํŠธ๊ฐ€ A์ธ์ง€ B์ธ์ง€ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ทธ ํ‘œ์‹œ์™€ ํ•จ๊ป˜, ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก
3๏ธโƒฃ ์ž์‹์ฐฝ์—์„œ PostMessage๋ฅผ ์ˆ˜์‹ ํ•˜๋ฉด A์ธ์ง€ B์ธ์ง€ ์ด๋ฒคํŠธ๋ฅผ ํ™•์ธ
4๏ธโƒฃ ํ™•์ธ๋œ ์ด๋ฒคํŠธ์— ํ•ด๋‹นํ•˜๋Š” ๋กœ์ง ์ˆ˜ํ–‰

์œ„์™€ ๊ฐ™์€ ์‹์œผ๋กœ ์ƒˆ๋กญ๊ฒŒ ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ–ˆ๋‹ค.

(์ž์‹์ฐฝ ๋กœ์ง์ด ์ค‘์š”ํ•˜๊ณ  ์ „์ฒด ๊ธฐ๋Šฅ ๋™์ž‘์— ๊ผญ ํ•„์š”ํ•œ ๋ถ€๋ถ„์ผ ๊ฒฝ์šฐ, ๋งˆ์ง€๋ง‰ 5๋ฒˆ์„ ์ถ”๊ฐ€ํ•˜์—ฌ

์ž์‹์ฐฝ ๋กœ์ง ์ˆ˜ํ–‰ ์™„๋ฃŒ ์‹œ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜์—ˆ๋‹ค๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋ถ€๋ชจ์ฐฝ์œผ๋กœ ๋ณด๋‚ด๊ณ ,

๋ถ€๋ชจ์ฐฝ์—์„œ ํ•ด๋‹น ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์•˜์„ ๋•Œ ๋‹ค์Œ ๋กœ์ง์ด ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.)

 

์œ„ ๋ฐฉ์•ˆ์„ ์š”์•ฝ๋œ ์ฝ”๋“œ๋กœ ๋ณด๊ฒ ๋‹ค.

 

1๏ธโƒฃ, 2๏ธโƒฃ ๋ถ€๋ชจ์ฐฝ์—์„œ ํŠน์ • ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ์ž์‹ ์ฐฝ์œผ๋กœ ๋ฐ์ดํ„ฐ ์ „์†ก

var iframe = document.getElementById( 'iframe' ); // iframe

// A or B ๋™์ž‘ ๋ฐœ์ƒ ์‹œ ํ˜ธ์ถœ
// eventType : A ๋™์ž‘ ์‹œ 'A', B ๋™์ž‘ ์‹œ 'B'
// sendData : ์ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์•˜์„ ๋•Œ ์ž์‹์ฐฝ์—์„œ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ๋กœ์ง์—์„œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ
function sendMsgToChild(eventType, sendData) {
    iframe.contentWindow.postMessage({'eventType':eventType, 'sendData':sendDate}, "๋„๋ฉ”์ธ");
}
  • PostMessage๋Š” JSON์ด๋‚˜ String ๋“ฑ ๋‹ค์–‘ํ•œ ํƒ€์ž…์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‚˜๋Š” ๋‹ค์–‘ํ•œ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ์•ผ ํ–ˆ์œผ๋ฏ€๋กœ JSON์œผ๋กœ ๊ตฌ์„ฑํ•œ ๋’ค eventType์ด๋ผ๋Š” ํ‚ค ๊ฐ’์œผ๋กœ ๊ตฌ๋ถ„ํ•˜๋Š” ์‹์œผ๋กœ ์ž‘์„ฑํ–ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  sendData๋ผ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ๋Š” ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋“ค์„ JSON ๊ฐ์ฒด๋กœ ๋ฌถ์–ด์„œ ํ•œ ๋ฒˆ์— ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  postMessage์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ๋Š” ์ž์‹์ฐฝ์˜ ๋„๋ฉ”์ธ์„ ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•˜๋Š”๋ฐ, ๋‚˜๋Š” https๋ถ€ํ„ฐ ์ „์ฒด๋ฅผ ๋„ฃ์—ˆ๋‹ค.
    (๋กœ์ปฌ์ผ ๊ฒฝ์šฐ ํฌํŠธ๋ฒˆํ˜ธ๊นŒ์ง€ ๋ชจ๋‘ ์ž‘์„ฑํ–ˆ๋‹ค.)

 

3๏ธโƒฃ, 4๏ธโƒฃ ์ž์‹์ฐฝ์—์„œ PostMessage ์ˆ˜์‹  ์‹œ ๊ทธ์— ํ•ด๋‹นํ•˜๋Š” ๋กœ์ง ์ˆ˜ํ–‰

window.addEventListener('message', function(e) {
	if(e.data.eventType === 'A') {
		// ์ด๋ฒคํŠธ ์ˆ˜ํ–‰ ๋กœ์ง
		console.log('e.data.eventType');
		console.log('e.data.sendData');
	} else if(e.data.eventType === 'B') {
		// ์ด๋ฒคํŠธ ์ˆ˜ํ–‰ ๋กœ์ง
		console.log('e.data.eventType');
		console.log('e.data.sendData');
	}
});
  • ์ˆ˜์‹ ํ•œ ๋ฉ”์‹œ์ง€์˜ eventType์„ ํ™•์ธํ•œ ๋’ค ๊ทธ์— ๋งž๋Š” ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ๋‹ค.
  • console.log๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๊ทธ ๋กœ๊ทธ๋Š” ๋ถ€๋ชจ์ฐฝ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋‚˜๋Š” ์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ–ˆ๊ณ ,

์™ธ์—๋„ ์ž์‹์—์„œ ๋ถ€๋ชจ๋กœ ๋ฉ”์‹œ์ง€ ์ „์†ก์„ ์›ํ•  ๋•Œ ๋˜ํ•œ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.

 


๐Ÿ“ ๊ฒฐ๋ก 

  • Chrome ์ •์ฑ… ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ ๊ฐ„์˜ document.domain ์„ค์ •์„ ํ†ตํ•œ ํ†ต์‹ ์ด ๋ถˆ๊ฐ€ํ•จ
  • ์„œ๋กœ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์˜ ํ†ต์‹  ์œ„ํ•ด PostMessage๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ

๋Œ“๊ธ€