์ค๋์ ๋ณ๋ ์ปจํ
์คํธ๋ฅผ ๊ฐ์ง ์ ์ฐฝ์ ๋์ฐ๋ ๊ฐ๋ฐ์ ํ๋ฉฐ ์๊ฒ๋ ๋ด์ฉ์ ์ ๋ฆฌํด๋ณด๋ ค ํฉ๋๋ค.
window.open
์ ์์ง๋ window.open์ด ํ์ํ๊ฐ?
์์์ ์ ํ์
๊ณผ ๋ชจ๋ฌ์ ๋ณธ์ง์ ์ฐจ์ด๋ถํฐ ์์๋ณด๊ฒ ์ต๋๋ค.
ํ์
์ฐฝ
- ๋ธ๋ผ์ฐ์ ๊ฐ ์์ ํ ๋ถ๋ฆฌ๋ ์ ์ฐฝ(๋๋ ํญ)์ผ๋ก ๋์
- ๋ธ๋ผ์ฐ์ ์ ํ์
์ฐจ๋จ ๊ธฐ๋ฅ์ ์ํฅ์ ๋ฐ๊ณ
- ๋ถ๋ชจ ํ์ด์ง์ ๋ณ๋์ ๋ธ๋ผ์ฐ์ ์ปจํ
์คํธ๋ฅผ ๊ฐ์ต๋๋ค.
- ์ฐฝ์ ์์น, ํฌ๊ธฐ, ์คํฌ๋กค๋ฐ ๋ฑ ๋ค์ํ ์์ฑ์ ์ ์ดํ ์ ์์ต๋๋ค.
- ๋ถ๋ชจ ์ฐฝ์ด ์๋ก๊ณ ์นจ๋๊ฑฐ๋ ์ด๋ํด๋ ํ์
์ ์ ์ง๋ฉ๋๋ค.
- ๋ธ๋ผ์ฐ์ ํ์
์ฐจ๋จ ๊ธฐ๋ฅ์ ์ํด ์ฌ์ฉ์๊ฐ ํ์
์ ๋ชป ๋ณผ ์ ์์ผ๋ฏ๋ก, ๋ฐ๋์ ํ์ํ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํ๋๊ฒ ์ข์ต๋๋ค. ๊ทธ ์ธ์๋ ๋ชจ๋ฌ์ด ๊ถ์ฅ๋ฉ๋๋ค.
๋ชจ๋ฌ์ฐฝ
- ๊ธฐ์กด ํ์ด์ง ์์ ์ค๋ฒ๋ ์ด ๋ ์ด์ด๋ก ๊ตฌํ
- ๋ถ๋ชจ ํ์ด์ง์ ์ข
์๋์ด ์์ต๋๋ค.
- ๋ธ๋ผ์ฐ์ ์ ํ์
์ฐจ๋จ ๊ธฐ๋ฅ๊ณผ ๋ฌด๊ดํฉ๋๋ค.
- ๋ถ๋ชจ ํ์ด์ง๊ฐ ์ด๋ ๋๋ ์๋ก๊ณ ์นจ๋๋ฉด ๋ชจ๋ฌ๋ ์ฌ๋ผ์ง๋๋ค.
- ๋ณ๋์ ๋ธ๋ผ์ฐ์ ์ปจํ
์คํธ๊ฐ ์๋๋ฏ๋ก, ์ธ๋ถ ๋๋ฉ์ธ ํ์ด์ง๋ฅผ ์ง์ ํฌํจํ ์ ์์ต๋๋ค. ์ด๋ iframe์ ์๊ฐํ์ค ์ ์๋๋ฐ ๋ณด์์ ์ ์ฝ์ด ๋ง์ ๋ถํธํฉ๋๋ค.
React์์๋ ์ํ(state)๋ฅผ ํ์ฉํ ์กฐ๊ฑด๋ถ ๋ ๋๋ง์ผ๋ก ํ์
์ ๊ตฌํํ๊ฑฐ๋, Toss์ ์ค๋ฒ๋ ์ด ํคํธ(Overlay Kit)๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
๊ทธ๋ฐ๋ฐ๋ ์ฌ์ ํ window.open()์ด ํธ๋ฆฌํ๊ฑฐ๋ ํ์ํ ์ํฉ์ด ์์ต๋๋ค.
- ์ธ๋ถ ๋๋ฉ์ธ๊ณผ์ ์ฐ๋: OAuth ์ธ์ฆ, ๊ฒฐ์ ์์คํ
์ฐ๋ ๋ฑ ๋ค๋ฅธ ๋๋ฉ์ธ์ ํ์ด์ง๋ฅผ ์ด์ด์ผ ํ ๋
- OAuth ์ธ์ฆ์ด๋ ์ธ๋ถ ๊ฒฐ์ ์์คํ
์ฐ๋ ์, ๋ณด์์ด๋ ์ฌ์ฉ์ ์ธ์ฆ ํ ์ฝ๋ฐฑ๋ฑ์ UX ์ ์ธ ์ด์ ๋ก ๋ณ๋ ์ฐฝ์ด ํ์ํฉ๋๋ค.
- ์ด๋ window.open()์ ์ฌ์ฉํ๋ฉด ๋ถ๋ชจ-์์ ์ฐฝ ๊ฐ ํต์ ์ด๋ ์ฐฝ ๋ซํ ๊ฐ์ง ๋ฑ์ ์ฒ๋ฆฌ๊ฐ ์ฌ์์ ธ์.
- ๋ชจ๋ฌ๋ก๋ ์ธ๋ถ ๋๋ฉ์ธ ํ์ด์ง๋ฅผ iframe์ผ๋ก ๋์ฐ๋ ๊ฒ์ด CORS, X-Frame-Options ๋๋ Content-Security-Policy ๋ฑ์ ๋ณด์ ์ ์ฑ
๋ฑ์ ์ด์ ๋ก ๋ถํธํฉ๋๋ค.
- ํ๋ฆฐํธ ๊ธฐ๋ฅ: ํน์ ์ฝํ
์ธ ๋ง ํ๋ฆฐํธํ๊ธฐ ์ํ ๋ณ๋ ์ฐฝ์ด ํ์ํ ๋
- ์ ์ฐฝ์ ํด๋น ์ฝํ
์ธ ๋ง ๋ ๋๋งํ๊ณ window.print()๋ฅผ ํธ์ถํ๋ ๋ฐฉ์์ด ๋ง์ด ์ฌ์ฉ๋์ต๋๋ค.
- ๋ชจ๋ฌ์ด๋ ์ค๋ฒ๋ ์ด๋ก๋ ์ ์ฒด ํ์ด์ง์ ์ผ๋ถ๋ง ๊น๋ํ๊ฒ ์ธ์ํ๋ ์ธ์ ๋ฒ์ ์ ์ด๊ฐ ์ด๋ ค์ ๊ธฐ์กด ํ์ด์ง ์ ์ฒด๊ฐ ์ธ์๋ฉ๋๋ค.
- ๋ฐ๋ผ์ ์ ์ฐฝ์ด ๊ฐ์ฅ ๊ฐ๋จํ๊ณ ํ์คํ ๋ฐฉ๋ฒ์ด๋ผ ์๊ฐํฉ๋๋ค.
- ๋ฉํฐํ์คํน UX: ์ฌ์ฉ์๊ฐ ๋ ํ๋ฉด์ ๋์์ ๋ณด๋ฉฐ ์์
ํด์ผ ํ ๋
- ๋ ๊ฐ์ ์ฐฝ์ ๋์์ ํ๋ฉด์ ๋์ ์ํธ ๋น๊ต ์์
ํ๋ ค๋ฉด ์ฐฝ ๋ถ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค.
- ๋ชจ๋ฌ์ ํญ์ ๋ถ๋ชจ ์ฐฝ ์์ ๋ ์๊ธฐ ๋๋ฌธ์ ๋ ํ๋ฉด์ ๋์์ ๋ณผ ์ ์์ต๋๋ค.
- ๋ฐ๋ผ์ ์ ์ฐฝ์ ๋์ฐ๋ ๊ฒ์ด ์ ์ผํ ๋ฐฉ๋ฒ์
๋๋ค.
- ๋ ๊ฑฐ์ ์์คํ
ํตํฉ: ๊ธฐ์กด ์์คํ
๊ณผ์ ํธํ์ฑ์ ์ํด ํ์ํ ๊ฒฝ์ฐ
- ๊ธฐ์กด ์์คํ
์์ ํ์
์ฐฝ์ ํตํ ๋ฐ์ดํฐ ๊ตํ์ด๋ ์ธ์ฆ ๋ฑ์ ๊ตฌ์กฐ๊ฐ ์ด๋ฏธ window.open()์ ๋ง์ถฐ์ ธ ์๋ค๋ฉด, ์ด๋ฅผ ๋ชจ๋ฌ๋ก ๋์ฒดํ๋ ๊ฒฝ์ฐ ํธํ์ฑ ์ด์๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
- ๋ณ๋ ์๋์ฐ ๊ธฐ๋ฅ: ๋ถ๋ชจ ์ฐฝ์ ์๋ก๊ณ ์นจ์ด๋ ์ด๋์๋ ์ ์ง๋์ด์ผ ํ๋ ๋
๋ฆฝ์ ๊ธฐ๋ฅ
- ๋ชจ๋ฌ์ด๋ SPA ์ปดํฌ๋ํธ๋ก๋ ๊ตฌํ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.
- ์๋ก์ด ํ์
์ฐฝ๋ง์ด ์์ ํ ๋ณ๋์ ๋ธ๋ผ์ฐ์ ์ปจํ
์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ด๋ฐ ๊ฒฝ์ฐ์๋ window.open()์ ์ฌ์ฉํด์ผ ํ๋๋ฐ, ์์ ํ๊ณ ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ ์์๋ณด๊ฒ ์ต๋๋ค.
window.open('javascript:focus()', 'myPopup', 'width=800,height=600');
๊ฒ๋ณด๊ธฐ์ ์ ์๋ํ ์ ์์ง๋ง, ์ด ๋ฐฉ์์ ๋ณด์์ ๋ฌธ์ ๊ฐ ์์ผ๋ฉฐ ๊ณต์์ ์ผ๋ก ๊ถ์ฅ๋์ง ์๋ ๋ฐฉ์์
๋๋ค.
์ด๋ฒ ๊ธ์์ ๊ทธ ์ด์ ์ ๋ํด ์ ์ด๋ณด๋ คํฉ๋๋ค! ๋ํ ์ด๋ค ๋ฐฉ์์ด ์์ ํ๊ณ ํ์ค์ ๋ถํฉํ๋์ง๋ ์์๋ณด๊ฒ ์ต๋๋ค.
javascript:focus() ๋ฐฉ์์ ์ํ์ฑ
์ด ๋ฐฉ์์ javascript: URL ์คํด์ ์ด์ฉํด ์ ์ฐฝ์ ์ด๋ฉด์ focus() ํจ์๋ฅผ ์คํํ๋ ค๋ ์๋์
๋๋ค. ํ์ง๋ง ์ด๋ฐ ๋ฐฉ์์ ๋ณด์์ ์ทจ์ฝํฉ๋๋ค.
MDN ๊ณต์ ๋ฌธ์์์๋ ๋ค์๊ณผ ๊ฐ์ด ๋ช
ํํ ๊ฒฝ๊ณ ํ๊ณ ์์ต๋๋ค.
"Use of javascript: URLs on the web is discouraged as it may lead to execution of arbitrary code, similar to the ramifications of using eval()."
๋ํ, ESLint์์๋ no-script-url ๊ท์น์ ํตํด javascript: URL ์คํด ์ฌ์ฉ์ ๊ธ์งํ๊ฑฐ๋ ๊ฒฝ๊ณ ํ๊ณ ์์ต๋๋ค. ์ด๋ ์ฝ๋๊ฐ ์ธ๋ถ ์
๋ ฅ์ ์ํด ์กฐ์๋๊ฑฐ๋ ์
์ฉ๋ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
์์ฝํ์๋ฉด
- ๋ณด์์ ์ํ (์์ ์ฝ๋ ์คํ ๊ฐ๋ฅ์ฑ)
- XSS(ํฌ๋ก์ค ์ฌ์ดํธ ์คํฌ๋ฆฝํ
) ๊ณต๊ฒฉ์ ๋ฒกํฐ๊ฐ ๋ ์ ์์
- ์ต์ ๋ธ๋ผ์ฐ์ ๋ฐ ๋ฆฐํฐ ์ฐจ๋จ ๋์
- ์ ์ง๋ณด์์ ์๋ ํ์
์ด ์ด๋ ค์
ํ์ค์ ์ด๊ณ ์์ ํ ๋ฐฉ๋ฒ: about:blank ๋๋ ๋น ๋ฌธ์์ด
ํ์
์ ์์ ํ๊ฒ ์ด๊ณ ์ถ๋ค๋ฉด, ๊ถ์ฅ๋๋ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
const popup = window.open('about:blank', 'myPopup', 'width=800,height=600');
if (popup) {
popup.location.href = '/your-target-page';
popup.focus(); // ํ์ ์ ํฌ์ปค์ค ์ด๋
}
๋๋ ์์ ๋น ๋ฌธ์์ด๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
const popup = window.open('', 'myPopup', 'width=800,height=600');
์ด ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ ์ฅ์ ์ด ์์ต๋๋ค.
- ๋ณด์์ ์์ ํจ
- ํ์ค ์น API ์ฌ์ฉ๋ฒ์ ์ค์
- ์ฝ๋ ์๋๊ฐ ๋ช
ํํจ
- ๊ณต์ ๋ฌธ์(MDN, W3C ๋ฑ)์์๋ ๊ถ์ฅํ๋ ๋ฐฉ์
javascript:focus()์ ๋ชฉ์ ๊ณผ ์คํด
๋ง์ ๊ฐ๋ฐ์๋ค์ด javascript:focus()๋ฅผ ์ด๊ธฐ URL๋ก ๋ฃ๋ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋น ์ฐฝ์ ์ด ๋ ํ์
์ด ์ฐจ๋จ๋๋ ํ์์ ์ฐํํ๋ ค๊ณ
- ์ฐฝ์ ์ฐ ์งํ ์๋์ผ๋ก ํฌ์ปค์ค๋ฅผ ์ฃผ๋ ค๊ณ
ํ์ง๋ง ์ต์ ๋ธ๋ผ์ฐ์ ๋ ๋ค์๊ณผ ๊ฐ์ ํน์ฑ์ด ์์ต๋๋ค.
- ์ฌ์ฉ์ ํด๋ฆญ ์ด๋ฒคํธ ๋ด๋ถ์์ window.open()์ ํธ์ถํ๋ฉด ๋๋ถ๋ถ ์ฐจ๋จํ์ง ์์ต๋๋ค
- ํฌ์ปค์ค๊ฐ ํ์ํ๋ค๋ฉด popup.focus()๋ฅผ ๋ช
์์ ์ผ๋ก ํธ์ถํ๋ ๊ฒ์ด ํจ์ฌ ๋ ๋ช
ํํ๊ณ ์์ ํฉ๋๋ค
- ์ผ๋ถ ์ต์ ๋ธ๋ผ์ฐ์ ์์๋ ๋ณด์ ์ ์ฑ
์ผ๋ก ์ธํด javascript: URL์ด ์๋ํ์ง ์์ ์ ์์ต๋๋ค
์ฆ, javascript:focus()๋ ๊ณผ๊ฑฐ์๋ ํตํ์์ง ๋ชฐ๋ผ๋, ํ๋ ์น ๋ณด์ ํ๊ฒฝ์์๋ ์ ์ ํ์ง ์์ ๋ฐฉ์์
๋๋ค.
URL ๊ฐ์ฒด์ javascript: URL์ ์์ ํ ๋ค๋ฆ
๋๋ค
ํน์ URL์ด๋ผ๋ ๋จ์ด ๋๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ๋ฒ์ ๋ ์ฌ๋ฆฌ์ ๋ถ๋ ๊ณ์ค ํ
๋ฐ์?!
const url = new URL(window.location.href);
const tag = url.searchParams.get('tag');
์ด๊ฑด URL ์ ๋ณด๋ฅผ ๋ถ์ํ๊ณ ์กฐ์ํ๊ธฐ ์ํ ๊ฐ์ฒด๋ก, ์ฃผ์ ํ์ฑ์ ์ํด ์์ฃผ ์ ์ฉํ๊ฒ ์ฐ์
๋๋ค. ์๋ฅผ ๋ค์ด ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ์ถ์ถ, ๊ฒฝ๋ก ์กฐ์ ๋ฑ์ ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค.
๋ฐ๋ฉด 'javascript:...'๋ ๋ธ๋ผ์ฐ์ ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ง์ ์คํํ๋ผ๊ณ ๋ช
๋ นํ๋ ์คํด์ด๊ธฐ ๋๋ฌธ์, ๋ชฉ์ ๋ ์ฐ์๋ ์์ ํ ๋ค๋ฆ
๋๋ค.
ํญ๋ชฉ์ค๋ช
- ์ฌ์ฉ ์ฉ๋
| new URL(...) |
์ฃผ์ ํ์ฑ์ ์ํ URL ๊ฐ์ฒด |
์์ ํ๊ณ ํ์ค์ ์ธ ๋ฐฉ๋ฒ |
| 'javascript:focus()' |
์คํ ์ฝ๋๋ฅผ URL์ ๋ฃ๋ ๋ฐฉ์ |
๋ณด์์ ์ํ, ๋น๊ถ์ฅ ๋ฐฉ์ |
๋ถ๋ชจ-์์ ์ฐฝ ๊ด๊ณ์ ์ ์ด
window.open()์ผ๋ก ์ด๋ฆฐ ํ์
์ ๋ถ๋ชจ ํ์ด์ง์ ๋ฐ์ ํ ๊ด๊ณ๋ฅผ ๊ฐ์ง๋๋ค. ์ด๋ฅผ ํ์ฉํ๊ฑฐ๋ ์ฃผ์ํด์ผ ํ ์ ์ด ์์ต๋๋ค.
๋ถ๋ชจ ํ์ด์ง์์ ์์ ์ฐฝ ์ ์ดํ๊ธฐ
ํ์
์ ์ฐ ๋ถ๋ชจ ํ์ด์ง๋ ๋ฐํ๋ ์ฐธ์กฐ๋ฅผ ํตํด ์์ ์ฐฝ์ ์์ ํ ์ ์ดํ ์ ์์ต๋๋ค.
const popup = window.open('about:blank', 'myPopup');
// ์์ ์ฐฝ ๋ด์ฉ ๋ณ๊ฒฝ
popup.document.body.innerHTML = '<h1>๋ถ๋ชจ๊ฐ ๋ณ๊ฒฝํ ๋ด์ฉ</h1>';
// ์์ ์ฐฝ ํฌ๊ธฐ/์์น ์กฐ์
popup.resizeTo(500, 300);
popup.moveTo(100, 100);
// ์์ ์ฐฝ ์ข
๋ฃ
popup.close();
์์ ์ฐฝ ์ข
๋ฃ ์๋๋ฆฌ์ค
์ฌ๋ฌ ์ํฉ์์ ์์ ์ฐฝ์ด ์๋์ผ๋ก ์ข
๋ฃ๋ ์ ์์ต๋๋ค.
- ๋ถ๋ชจ ํ์ด์ง ์ด๋ ๋๋ ์๋ก๊ณ ์นจ ์
// ํ์ด์ง ์ด๋ ์ ์ ์์ ์ฐฝ ๋ซ๊ธฐ
window.addEventListener('beforeunload', () => {
if (popup && !popup.closed) {
popup.close();
}
});
- ๋ค๋ฅธ SPA ๋ผ์ฐํธ๋ก ์ด๋ ์
// React Router ๋ฑ์ ๋ผ์ฐํธ ๋ณ๊ฒฝ ์ด๋ฒคํธ์ ์ฐ๊ฒฐ
router.beforeEach((to, from, next) => {
if (window.myPopup && !window.myPopup.closed) {
window.myPopup.close();
}
next();
});
์์ ์ฐฝ์ด ๋ถ๋ชจ ํ์ด์ง ๊ฐ์งํ๊ธฐ
์์ ์ฐฝ์์๋ ๋ถ๋ชจ ์ฐฝ์ ์กด์ฌ์ ์ํ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
// ์์ ์ฐฝ์์ ๋ถ๋ชจ ์ฐฝ ํ์ธ ๋ฐ ๋์ํ๊ธฐ
if (window.opener && !window.opener.closed) {
// ๋ถ๋ชจ ์ฐฝ์ด ์กด์ฌํ๊ณ ์ด๋ ค์์
console.log('๋ถ๋ชจ ์ฐฝ URL:', window.opener.location.href);
} else {
// ๋ถ๋ชจ ์ฐฝ์ด ๋ซํ๊ฑฐ๋ ์์
console.log('๋
๋ฆฝ์ ์ผ๋ก ์คํ ์ค');
}
๋ธ๋ผ์ฐ์ ํธํ์ฑ๊ณผ ์ถ๊ฐ ๊ณ ๋ ค์ฌํญ
์ต์ ๋ธ๋ผ์ฐ์ ๋ค์ window.open()์ ๋ํด ์ ์ ๋ ์๊ฒฉํ ์ ์ฑ
์ ์ ์ฉํ๊ณ ์์ต๋๋ค.
- Chrome, Safari: ์ฌ์ฉ์ ์ ์ค์ฒ(ํด๋ฆญ ๋ฑ) ์์ด window.open()์ ํธ์ถํ๋ฉด ์ฐจ๋จ๋ฉ๋๋ค
- Firefox: ํ์
์ฐจ๋จ ์ค์ ์ ๋ฐ๋ผ ๋์์ด ๋ฌ๋ผ์ง๋๋ค
- ๋ชจ๋ฐ์ผ ๋ธ๋ผ์ฐ์ : ๋ง์ ๋ชจ๋ฐ์ผ ๋ธ๋ผ์ฐ์ ์์ ํ์
์์ฒด๋ฅผ ์ ํ์ ์ผ๋ก ์ง์ํฉ๋๋ค
๋ฐ๋ผ์ ํ์
๋์ ๋ชจ๋ฌ์ด๋ ์ธ๋ผ์ธ ์ฝํ
์ธ ๋ฅผ ๊ณ ๋ คํ๋ ๊ฒ๋ ์ข์ ๋์์ด ๋ ์ ์์ต๋๋ค:
// ํน๋ณํ ์ด์ ๊ฐ ์๋ค๋ฉด ํ์
๋์ ๋ชจ๋ฌ์ ๊ณ ๋ คํด๋ณด์ธ์
document.getElementById('openModal').addEventListener('click', () => {
document.getElementById('myModal').style.display = 'block';
});
์์ฝ ๋ฐ ๊ฒฐ๋ก
- ๋ชจ๋ ํ๋ ์์ํฌ๊ฐ ์ฃผ๋ฅ์ธ ์ง๊ธ๋ OAuth, ๊ฒฐ์ ์ฐ๋, ํ๋ฆฐํธ ๊ธฐ๋ฅ ๋ฑ์ ์ํด window.open()์ด ํ์ํ ์ํฉ์ด ์์ต๋๋ค.
- javascript:focus() ๋ฐฉ์์ ๋ณด์์ ์ํํ๊ณ , MDN ๋ฐ ESLint์์๋ ์ฌ์ฉ์ ๊ถ์ฅํ์ง ์์ต๋๋ค.
- ํ์
์ ์ด ๋๋ about:blank๋ ๋น ๋ฌธ์์ด์ ์ฌ์ฉํ๊ณ , ๊ทธ ์ดํ์ popup.location.href์ popup.focus()๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ด ๊ฐ์ฅ ํ์ค์ ์ด๊ณ ์์ ํฉ๋๋ค.
- ๋ถ๋ชจ ํ์ด์ง์์๋ ํ์
์ฐฝ์ ์์ ํ ์ ์ดํ ์ ์์ผ๋ฉฐ, ํ์ด์ง ์ ํ ์ ํ์
์ฐฝ์ ์ ์ ํ ๊ด๋ฆฌ(์ข
๋ฃ)ํด์ผ ํฉ๋๋ค.
- React ๊ฐ์ ํ๋ ์์ํฌ์์๋ useRef์ useEffect๋ฅผ ํ์ฉํด ํ์
์ ์๋ช
์ฃผ๊ธฐ๋ฅผ ์ปดํฌ๋ํธ์ ์ฐ๋ํ ์ ์์ต๋๋ค.
- URL ๊ฐ์ฒด์ javascript: URL์ ๊ฐ๋
์ด ์์ ํ ๋ค๋ฅด๋ฏ๋ก ํผ๋ํ์ง ๋ง์ธ์.
ํน์ ์ํฉ์์๋ window.open์ด ์ฌ์ ํ ์ ์ ํ ์ ํ์ผ ์ ์์ต๋๋ค. ์ด๋ฐ ๊ฒฝ์ฐ์๋ ๋ ์์ ํ ๋ฐฉ์์ผ๋ก ์ฝ๋ฉํด ๋ณด์๋ ๊ฑด ์ด๋จ๊น์?!
๊ถ๊ธํ์ ์ ์ด ์๋ค๋ฉด ์ธ์ ๋ ์ง ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์ธ์!