
์ต๊ทผ ์น ํ๋ก ํธ์๋ ๋ณด์ ๊ด๋ จ ์ฑ ์ ์ฝ๋ ์ค Cross-Origin Isolation์ด๋ผ๋ ๊ฐ๋ ์ ์ ํ๊ฒ ๋์์ต๋๋ค.
์ฑ ์์๋ ๊ฐ๋จํ ์ธ๊ธ๋ง ๋์ด ์์ด์, ๋ ์์ธํ ์์๋ณด๊ณ ์ถ์ด์ ์ถ๊ฐ๋ก ์ฐพ์๋ณธ ๋ด์ฉ๋ค์ ์ ๋ฆฌํด๋ณด์์ต๋๋ค. ํนํ ์ด ๊ธฐ์ ์ด ์ด๋ป๊ฒ ๋ฐ์ ํด์๋์ง, ๊ทธ ๋ฐฐ๊ฒฝ์ ์ดํด๋ณด๋ฉด์ ์ดํดํด๋ณด๊ฒ ์ต๋๋ค.
2018๋ 1์ ๋ฐ๊ฒฌ๋ CPU ํ๋์จ์ด ์ทจ์ฝ์ ์ ๋๋ค. CPU๊ฐ ์ฑ๋ฅ ํฅ์์ ์ํด "๋ฏธ๋ฆฌ ๊ณ์ฐํด๋๋" ๊ธฐ๋ฅ์ ์ ์ฉํ์ฌ, ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ ๋น๋ฐ ์ ๋ณด๋ฅผ ํ์น ์ ์์ต๋๋ค.
๋น์ : ์ํ ์ง์์ด ๋ค์ ๊ณ ๊ฐ ์๋ฅ๋ฅผ ๋ฏธ๋ฆฌ ์ค๋นํ๋ค๊ฐ, ์ค์ ๋ก๋ ๊ทธ ๊ณ ๊ฐ์ด ์ค์ง ์์์ง๋ง ์ฑ ์์ ๋จ์ ์๋ฅ ํ์ ์ ๋ณด๊ณ ๋ค๋ฅธ ๊ณ ๊ฐ์ ๊ฐ์ธ์ ๋ณด๋ฅผ ์ถ์ธกํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
Spectre ๋ฐ๊ฒฌ๊ณผ ๋์์ ๋ชจ๋ ์ฃผ์ ๋ธ๋ผ์ฐ์ ์์ SharedArrayBuffer๊ฐ ๊ธด๊ธ ๋นํ์ฑํ๋์์ต๋๋ค.
์ SharedArrayBuffer๊ฐ ๋ฌธ์ ์์๊น?
SharedArrayBuffer ์์ฒด๋ ๋์ ๊ธฐ์ ์ด ์๋์์ต๋๋ค. ํ์ง๋ง Spectre ๊ณต๊ฒฉ์ ๋ ์ ํํ๊ฒ ๋ง๋๋ ์ ๋ฐํ ์๊ณ ์ญํ ์ ํ ์ ์์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋น์ ๋ก ์ค๋ช ํ๋ฉด:
Spectre ๊ณต๊ฒฉ = ์๋ฌผ์ ๋ฅผ ๋ฐ๋ ๊ฒ
SharedArrayBuffer = ๋งค์ฐ ์ ํํ ์คํฑ์์น
์๋ฌผ์ ๋ฅผ ๋ธ ๋ "๋" ์๋ฆฌ๊ฐ ๋๋ ํ์ด๋ฐ์
์ ํํ ์ธก์ ํ ์ ์๋ค๋ฉด ๋น๋ฐ๋ฒํธ๋ฅผ ์์๋ผ ํ๋ฅ ์ด ๋์์ง๋๋ค.
SharedArrayBuffer๊ฐ ๋ฐ๋ก ๊ทธ "์ ํํ ์คํฑ์์น" ์ญํ ์ ํ์ต๋๋ค.
๋ฐ๋ผ์ SharedArrayBuffer๋ ๊ทธ ์์ฒด๋ก๋ ๋ฌธ์ ๊ฐ ์์์ง๋ง, Spectre ๊ณต๊ฒฉ์ ์ ํ๋๋ฅผ ํฌ๊ฒ ๋์ฌ์ฃผ๋ ๋๊ตฌ์๊ธฐ ๋๋ฌธ์ ๋นํ์ฑํ๋ ์๋ฐ์ ์์์ต๋๋ค.
2018๋ ๋น์ ๋ธ๋ผ์ฐ์ ๋ ๋ชจ๋ ์ฌ์ดํธ(๊ตฌ๊ธ, ํ์ด์ค๋ถ, ์ํ, ์ ์ฑ ์ฌ์ดํธ)๊ฐ ํ๋์ ํ๋ก์ธ์ค์์ ๋์๊ฐ์ต๋๋ค.
๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๊ณต์ ํ๊ธฐ ๋๋ฌธ์ ์ ์ฑ ์ฌ์ดํธ๊ฐ Spectre ๊ณต๊ฒฉ์ผ๋ก ๋ค๋ฅธ ์ฌ์ดํธ์ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์์์ต๋๋ค.
๋ง์น 4๋ช ์ด ๊ฐ์ ๋ฐฉ์์ ์ผํ๋ค๊ฐ ํด์ปค๊ฐ ๋ค๋ฅธ ์ฌ๋์ ์์ ๋ด์ฉ์ ์ฟ๋ณด๋ ๊ฒ๊ณผ ๊ฐ์์ต๋๋ค.
Spectre ์ํ์ ๋์ํ๊ธฐ ์ํด ๋ธ๋ผ์ฐ์ ๋ค์ Site Isolation์ ๊ฐํํ๊ธฐ ์์ํ์ต๋๋ค. Chrome์ด ์ ๋๋ฅผ ๋ฌ๋ ธ๊ณ , ๋ค๋ฅธ ๋ธ๋ผ์ฐ์ ๋ค๋ ๋ค๋ฐ๋์ต๋๋ค.
์๋ก์ด ํ๋ก์ธ์ค ๋ถ๋ฆฌ ๊ตฌ์กฐ:
ํ๋ก์ธ์ค A: google.com
ํ๋ก์ธ์ค B: facebook.com
ํ๋ก์ธ์ค C: bank.com
ํ๋ก์ธ์ค D: malicious-site.com
โ ์ด์์ฒด์ ๊ฐ ํ๋ก์ธ์ค ๊ฐ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ ์ฐจ๋จ
๋ธ๋ผ์ฐ์ ๋ eTLD+1(effective Top-Level Domain + 1) ๊ธฐ์ค์ผ๋ก "์ฌ์ดํธ"๋ฅผ ์ ์ํฉ๋๋ค:
// ๊ฐ์ ์ฌ์ดํธ๋ก ๋ถ๋ฅ๋๋ ์์๋ค
'www.example.com' โ ์ฌ์ดํธ: example.com
'api.example.com' โ ์ฌ์ดํธ: example.com (๊ฐ์ ํ๋ก์ธ์ค)
'cdn.example.com' โ ์ฌ์ดํธ: example.com (๊ฐ์ ํ๋ก์ธ์ค)
// ๋ค๋ฅธ ์ฌ์ดํธ๋ก ๋ถ๋ฅ๋๋ ์์๋ค
'alice.github.io' โ ์ฌ์ดํธ: alice.github.io
'bob.github.io' โ ์ฌ์ดํธ: bob.github.io (๋ค๋ฅธ ํ๋ก์ธ์ค)
// ํ๊ตญ ๋๋ฉ์ธ ์์
'blog.naver.co.kr' โ ์ฌ์ดํธ: naver.co.kr
'mail.naver.co.kr' โ ์ฌ์ดํธ: naver.co.kr (๊ฐ์ ํ๋ก์ธ์ค)
'blog.daum.co.kr' โ ์ฌ์ดํธ: daum.co.kr (๋ค๋ฅธ ํ๋ก์ธ์ค)
example.com ํ๋ก์ธ์ค (๋จ์ผ ํ๋ก์ธ์ค)
โโโ evil.example.com (์
์ฑ ์๋ธ๋๋ฉ์ธ)
โโโ banking.example.com (์ค์ํ ๊ธ์ต ์๋น์ค)
โ ๊ฐ์ ์ฌ์ดํธ๋ก ๋ถ๋ฅ
์ค์ ์๋น์ค์์๋ ์๋ธ๋๋ฉ์ธ์ ๋ค์ํ ์ฉ๋๋ก ์ฌ์ฉํ๋๋ฐ, ์๋ธ๋๋ฉ์ธ์ ๊ฐ์ ์ฌ์ดํธ๋ก ๋ถ๋ฅ๋์ด Spectre ๊ณต๊ฒฉ ๊ฐ๋ฅํ๋ค๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
Site Isolation๋ง์ผ๋ก๋ ๊ฐ์ ์ฌ์ดํธ ๋ด์ ๋ค๋ฅธ ์ถ์ฒ ๊ฐ ๊ณต๊ฒฉ์ ๋ง์ ์ ์๋ค๋ ๊ฒ์ด ๋ช
ํํด์ก์ต๋๋ค.
์ด์ ๋ํ ํด๊ฒฐ์ฑ
์ผ๋ก Cross-Origin Isolation์ด ์์ต๋๋ค.
Cross-Origin Isolation์ ์ธ ๊ฐ์ง HTTP ํค๋๋ก ์ถ์ฒ ๋จ์ ๊ฒฉ๋ฆฌ๋ฅผ ๊ตฌํํฉ๋๋ค.
์ญํ : ๊ฐ๋ณ ํ์ผ(์ด๋ฏธ์ง, API, ์คํฌ๋ฆฝํธ ๋ฑ)์ด ์ด๋ค ์ฌ์ดํธ์์ ์ฌ์ฉ๋ ์ ์๋์ง ์ ํ
Cross-Origin-Resource-Policy: same-origin # ๊ฐ์ ์ถ์ฒ๋ง OK
Cross-Origin-Resource-Policy: same-site # ๊ฐ์ ์ฌ์ดํธ๋ง OK
Cross-Origin-Resource-Policy: cross-origin # ๋ชจ๋ ์ฌ์ดํธ OK
์ญํ : ๋ด ํ์ด์ง๊ฐ ๋ก๋ํ๋ ๋ชจ๋ ์ธ๋ถ ๋ฆฌ์์ค์ ๋ํด "ํ๊ฐ์ฆ"(CORP ํค๋) ํ์ธ์ ๊ฐ์
Cross-Origin-Embedder-Policy: require-corp
๋์ ๋ฐฉ์:
<!-- COEP ์ค์ ํ๋ฉด ์ด๋ฐ ๊ฒ๋ค์ด ์ฐจ๋จ๋จ -->
<img src="https://๋ค๋ฅธ์ฌ์ดํธ.com/image.jpg"> โ CORP ํค๋ ์์
<script src="https://cdn.com/library.js"> โ CORP ํค๋ ์์
<!-- ์ด๋ฐ ๊ฒ๋ค๋ง ํ์ฉ๋จ -->
<img src="https://ํ๊ฐ๋์ฌ์ดํธ.com/image.jpg"> โ
CORP ํค๋ ์์
<img src="/๋ด์ฌ์ดํธ/image.jpg"> โ
๊ฐ์ ์ถ์ฒ
์ญํ : ๋ด ํ์ด์ง๊ฐ ์ด์ด์ค ๋ค๋ฅธ ์ฌ์ดํธ ์ฐฝ(ํ์ )๊ณผ์ ์ฐ๊ฒฐ์ ์ฐจ๋จ
Cross-Origin-Opener-Policy: same-origin
a ํ๊ทธ๋ window.open()์ผ๋ก ์ด๋ฆฐ ๊ต์ฐจ ์ถ์ฒ ํ์ด์ง๋ ์๋ ์คํํ ํ์ด์ง์ ๊ฐ์ ํ๋ก์ธ์ค์์ ๋์ํฉ๋๋ค.
์ด๋ window.opener๋ก ๊ต์ฐจ ์ถ์ฒ ํ์ด์ง์ ์ ๊ทผ์ด ๊ฐ๋ฅํด์ ๋ณด์ ์ํ์ด ์์ต๋๋ค.COOP๋ฅผ ํ์ฉํ๋ฉด, ์ด๋ฌํ ๊ต์ฐจ ์ถ์ฒ ํ์ด์ง์ ์ ๊ทผ์ ์ ํํ ์ ์์ต๋๋ค.
์ด ์ธ ํค๋๊ฐ ํจ๊ป ์๋ํ๋ฉด ์์ ํ ์ถ์ฒ ๊ฒฉ๋ฆฌ๊ฐ ์์ฑ๋ฉ๋๋ค:
CORP: "์ด ํ์ผ์ ๋๊ฐ ์ธ ์ ์๋?"
COEP: "๋ด ํ์ด์ง๋ ํ๊ฐ๋ ํ์ผ๋ง ์ธ ๊ฑฐ์ผ"
COOP: "๋ด ํ์ด์ง๋ ๋ค๋ฅธ ์ฌ์ดํธ ์ฐฝ๊ณผ ๋จ์ ํ ๊ฑฐ์ผ"
โ ๊ฒฐ๊ณผ: ์์ ํ ๊ฒฉ๋ฆฌ๋ ์์ ํ ํ๊ฒฝ
Cross-Origin Isolation์ด ์ด๋ก ์ ์ผ๋ก๋ ์๋ฒฝํ์ง๋ง, ํ์ค์์๋ ์ฌ๋ฌ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค:
OAuth/๊ฒฐ์ ์์คํ ์ ๋ณดํต ๋ค๋ฅธ ์ฌ์ดํธ(๊ตฌ๊ธ, ํ์ดํ ๋ฑ)๋ฅผ ํ์ ์ผ๋ก ์ด์ด์ ์ธ์ฆ์ ์ฒ๋ฆฌํ ํ, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์๋ ์ฌ์ดํธ๋ก ์ ๋ฌํ๋ ๋ฐฉ์์ผ๋ก ๋์ํฉ๋๋ค.
Cross-Origin Isolation์ COOP ํค๋๋ฅผ ์ ์ฉํ๋ฉด ๋ณด์์ ์ํด ๋ค๋ฅธ ์ถ์ฒ์ ์๋์ฐ์์ ์ฐ๊ฒฐ์ ๊ฐ์ ๋ก ์ฐจ๋จํ๊ธฐ ๋๋ฌธ์, ํ์ ์ฐธ์กฐ๊ฐ null์ด ๋์ด ํต์ ์ด ๋ถ๊ฐ๋ฅํด์ง๋๋ค.
Chrome 137 (2025)๋ถํฐ ์ง์:
# ๊ธฐ์กด ๋ณต์กํ ๋ฐฉ์
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin
# ์๋ก์ด ๋จ์ํ ๋ฐฉ์
Document-Isolation-Policy: isolate-and-require-corp
ํน์ง:
ํฅ๋ฏธ๋ก์ ๋ ์ ์ ์น ๋ณด์์ด ๊ฒฐ๊ตญ "๋๊ตฌ์ ๋๊ตฌ๋ฅผ ๊ฐ์ ๊ณต๊ฐ์ ๋ ๊ฒ์ธ๊ฐ?"์ ๋ฌธ์ ๋ผ๋ ๊ฒ์ด์์ต๋๋ค. ๊ฐ์ ํ๋ก์ธ์ค์ ์์ผ๋ฉด ์๋ก ๊ณต๊ฒฉํ ์ ์๊ณ , ๋ค๋ฅธ ํ๋ก์ธ์ค์ ์์ผ๋ฉด ์ด์์ฒด์ ๊ฐ ๋ง์์ค๋ค๋ ๋จ์ํ ์๋ฆฌ๊ฐ ์ด๋ ๊ฒ ๋ณต์กํ ๋ณด์ ์ ์ฑ ์ ๊ทผ๊ฐ์ด ๋๋ ๊ฒ์ด ์ฌ๋ฏธ์์์ต๋๋ค