Mitigation: Same Origin Policy
SOP์ ๋ํ์ฌ
์ด์ ๊น์ง์ ์ฟ ํค์ ์ธ์
์ ๊ดํ ๋ด์ฉ์ ๊ธฐ๋ณธ์ ์ด๋ผ์ ์ ์ ์ ๋ฆฌ๋ณด๋จ ์ง์ ๋ฐฐ์ฐ๋ฉด์ ํ๋๊ฒ ์ข์๋ณด์ฌ์..์ฌ์ค ๊ท์ฐฎ์์๊ฐ ์ ์ผ ํฐ๋ฐ ใ
ใ
์น์ ์ดํด์ HTTP
๐กํด๋น ๋ด์ฉ์ pentestqym์ ๋ด์ฉ์ ๋ค์ ํ ๋ฒ ์ ๋ฆฌํ ๋ด์ฉ์ด๋ฉฐ, ๋ชจ๋ ์ ์๊ถ์ ํด๋น ์ฌ์ดํธ์๊ฒ ์์ต๋๋ค. ์น(Web)์ด๋? ์น์ World Wide Web์ ์ฝ์๋ก, ์ธํฐ๋ท, ํ์ดํผ๋งํฌ ๋ฑ์ ํตํด ์ ๋ณด๋ฅผ ๊ณต์ ํ๊ณ
dystopia050119.tistory.com
์ฟ ํค์ ์ธ์
๐กํด๋น ๋ด์ฉ์ pentestqym์ ๋ด์ฉ์ ๋ค์ ํ ๋ฒ ์ ๋ฆฌํ ๋ด์ฉ์ด๋ฉฐ, ๋ชจ๋ ์ ์๊ถ์ ํด๋น ์ฌ์ดํธ์๊ฒ ์์ต๋๋ค. ์ฟ ํค(Cookie)๋? ์ฟ ํค๋ ์น ์๋ฒ๊ฐ ์์ฑํ์ฌ ์น ๋ธ๋ผ์ฐ์ ๋ก ์ ์กํ๋ ์์ ์ ๋ณด ํ์ผ์ ๋
dystopia050119.tistory.com
์ฌ๊ธฐ ๋งํฌ๋ฅผ ํตํด ๊ผญ ํ์ตํด๋ด
์๋ค! ์๋ ๋งํฌ ๋ค์ด๊ฐ์ ๋ฌธ์ ๋ ํ์๊ณ
์ฟ ํค & ์ธ์
๋ฐ๋ก SOP์ ๋ํ์ฌ ๋ฐฐ์๋ด ์๋ค.
์ฟ ํค์๋ ์ธ์ฆ ์ํ๋ฅผ ๋ํ๋ด๋ ๋ฏผ๊ฐํ ์ ๋ณด๊ฐ ๋ณด๊ด๋๋ฉฐ, ๋ธ๋ผ์ฐ์ ๋ด๋ถ์ ์ ์ฅ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ธ๋ผ์ฐ์ ๊ฐ ์น ์๋น์ค์ ์ ์ ์ ์๋์ผ๋ก ์ฟ ํค๋ฅผ ํค๋์ ํฌํจํด ์์ฒญ์ ๋ณด๋ด์ฃ
์ด ๋๋ถ์ ์ฐ๋ฆฌ๋ ์น ์๋น์ค์ ํ ๋ฒ ๋ก๊ทธ์ธ ํ ์ผ์ ๊ธฐ๊ฐ์ ๋ก๊ทธ์ธ ์์ด ๋ฐ๋ก ์๋น์ค๋ฅผ ์ฌ์ฉํ ์ ์๋๊ฑฐ์ฃ
๊ทธ๋ฌ๋ ๋ง์ฝ ์ด์ฉ์๊ฐ ์
์์ ์ธ ๋ชฉ์ ์ผ๋ก ์
์์ ์ธ ํ์ด์ง๋ฅผ ์ ์ ์ ์ด๋ป๊ฒ ๋ ๊น์?
SOP(Same Origin Policy) ํ์ ๋ฐฐ๊ฒฝ
์ ์์ ์ธ ํ์ด์ง ์ ์ → ๋ง์ฝ JS ์ด์ฉ ์ด์ฉ์์ SNS ์น ์๋น์ค๋ก ์์ฒญ ์..
→ ๋ธ๋ผ์ฐ์ ๋ ์์ฒญ ๋ณด๋ผ ๋ ํด๋์ ํด๋น ์น ์๋น์ค ์ฟ ํค๋ฅผ ํฌํจ์ํด..
๋ฐ๋ผ์ JS๋ก ์์ฒญ์ ๋ณด๋ธ ํ์ด์ง๋ ๋ก๊ทธ์ธ ๋ ์ด์ฉ์์ SNS ์๋ต์ ๋ฐ์
๊ทธ๋์ ์ธ์ ํ์ด์ ํน ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
SOP ์ฆ, ๋์ผ ์ถ์ฒ ์ ์ฑ
์ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ์น ๋ณด์์ ์์ด ์ค์ํ ์์์
๋๋ค.
์ค์ ๋ก ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๊ณต๊ฒฉ(XSS)์ ์ด SOP๋ฅผ ์ฐํํ๊ธฐ ์ํด๋ ๊ณผ์ธ์ด ์๋๋๋ค.
์ด๋ป๊ฒ ์๋ํ๊ณ ์์ธ ์ํฉ์ ๋ญ์ธ์ง ์์ธํ๊ฒ ์์๋ด
์๋ค.
Same Origin Policy (SOP)
์๋ก ์ ์์์ฒ๋ผ ๋ธ๋ผ์ฐ์ ๋ ์ธ์ฆ ์ ๋ณด๋ก ์ฌ์ฉ๋ ์ ์๋ ์ฟ ํค๋ฅผ ๋ธ๋ผ์ฐ์ ๋ด๋ถ์ ๋ณด๊ดํ๋ฉฐ ๋ํ
์ด์ฉ์๊ฐ ์น ์๋น์ค ์ ์ ์, ๋ธ๋ผ์ฐ์ ๋ ํด๋น ์น ์๋น์ค์ ์ฌ์ฉ๋๋ ์ธ์ฆ ์ ๋ณด ์ฟ ํค๋ฅผ http์์ฒญ ํฌํจ
์ด ํน์ง์ ์ฌ์ดํธ์ ์ง์ ์ ์ํ๋ ๊ฒ์๋ง ํ์ X
๋ธ๋ผ์ฐ์ ๋ ์น ๋ฆฌ์์ค๋ฅผ ํตํด ๊ฐ์ ์ ์ผ๋ก ํ ์ฌ์ดํธ์ ์ ๊ทผ ์์๋ ์ธ์ฆ ์ ๋ณด ์ฟ ํค๋ฅผ ํจ๊ป ์ ์กํจ
์ด ํน์ง ๋์ ์ ์์ ํ์ด์ง๊ฐ ํด๋ผ์ด์ธํธ์ ๊ถํ์ ์ด์ฉํด
๋์ ์ฌ์ดํธ์ ํด๋ ์์ฒญ์ ๋ณด๋ด ์๋ต ์ ๋ณด๋ฅผ ํ๋ํ๋ ์ฝ๋๋ฅผ ์คํ
์ด๋ ์ ๋ณด ์ ์ถ๊ณผ ๊ฐ์ ๋ณด์ ์ด์๋ก ํด๋ผ์ด์ธํธ ์
์ฅ์์ ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๋ฅผ ์
์์ ํ์ด์ง๊ฐ
๋ชป ์ฝ๊ฒ ํด์ผ๊ฒ ์ฃ ๊ทธ๋์ ๋์จ ๋ธ๋ผ์ฐ์ ์ ๋ณด์ ๋ฉ์ปค๋์ฆ์ธ SOP์
๋๋ค.
Same Origin Policy์ Origin ๊ตฌ๋ถ ๋ฐฉ๋ฒ
์ด์ ๋ธ๋ผ์ฐ์ ๊ฐ ๊ฐ์ ธ์จ ์ ๋ณด์ธ ์ค๋ฆฌ์ง(Origin)์ ์ด๋ป๊ฒ ๊ตฌ๋ถํ ๊น์?
๋จผ์ ์ค๋ฆฌ์ง์ ํ๋กํ ์ฝ(Protocol, Scheme), ํฌํธ(Port), ํธ์คํธ(Host)๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
๊ตฌ์ฑ ์์๊ฐ ๋ชจ๋ ์ผ์นํด์ผ ๋์ผํ ์ค๋ฆฌ์ง์ด๋ผ๊ณ ํฉ๋๋ค.
https://same-origin.com/ ๋ผ๋ ์ค๋ฆฌ์ง๊ณผ ์๋ URL์ ๋น๊ตํ์ ๋ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์์ ๊ฐ์ด ๋น๊ตํด์ ํ์ธํ๋ต๋๋ค!
Same Origin Policy ์ค์ต
SOP๋ Cross Origin์ด ์๋ Same Origin์ผ ๋๋ง ์ ๋ณด๋ฅผ ์ฝ์ ์ ์๋๋ก ํด์ค๋๋ค.
์์๋ก ์๋ ์ด๋ฏธ์ง๊ฐ ์์ผ๋ฉฐ JavaScript์ ์ด์ฉํด SOP๋ฅผ ํ
์คํธ ํ๋ค์
์ฌ๊ธฐ์ window.open์ ์ ์ฐฝ ๋์ฐ๋ ํจ์, object.location.href๋ ๊ฐ์ฒด๊ฐ ๊ฐ๋ฅดํจ URL ์ฃผ์ ์ฝ๋ ์ฝ๋
์ด์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ผ์ ์ค์ตํด๋ณด์ธ์ ํด๋น ๊ฒฐ๊ณผ์ฐฝ์ ์ง์ ํด๋ณด์๋ฉด์ ํ์ธํด๋ณด์ธ์
๊ทธ๋ฌ์๋ฉด ์ค์ผ ์ฑ์๊ฐ ์๋.. ๋ผ๊ณ ํ๋ฉด ์ด๊ฑด ๋ถ์ ๊ณต์ด๊ธฐ์ ์์ธํ ์ธ๋ฐํ๊ฒ ํ๊ธด.. ํ๋ค์ด์์ ใ
Same Origin Policy(SOP) ๋ฐ๋ชจ
์ง๊ธ๊น์ง SOP๊ฐ ๋ฌด์์ธ์ง ์์๋ดค๊ณ ๊ตฌ๋ถ๊น์ง ๋ฐฐ์ ์ต๋๋ค.
์ด์ ๋ค์ ๋ชจ๋ ๊ตฌ์ฑ์ผ๋ก ์ค์ตํด๋ณด๊ธฐ ์ ์ ์ดํด๋ด
์๋ค.
<!-- iframe ๊ฐ์ฒด ์์ฑ -->
<iframe src="" id="my-frame"></iframe>
<!-- Javascript ์์ -->
<script>
/* 2๋ฒ์งธ ์ค์ iframe ๊ฐ์ฒด๋ฅผ myFrame ๋ณ์์ ๊ฐ์ ธ์ต๋๋ค. */
let myFrame = document.getElementById('my-frame')
/* iframe ๊ฐ์ฒด์ ์ฃผ์๊ฐ ๋ก๋๋๋ ๊ฒฝ์ฐ ์๋์ ๊ฐ์ ์ฝ๋๋ฅผ ์คํํฉ๋๋ค. */
myFrame.onload = () => {
/* try ... catch ๋ ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ก์ง ์
๋๋ค. */
try {
/* ๋ก๋๊ฐ ์๋ฃ๋๋ฉด, secret-element ๊ฐ์ฒด์ ๋ด์ฉ์ ์ฝ์์ ์ถ๋ ฅํฉ๋๋ค. */
let secretValue = myFrame.contentWindow.document.getElementById('secret-element').innerText;
console.log({ secretValue });
} catch(error) {
/* ์ค๋ฅ ๋ฐ์์ ์ฝ์์ ์ค๋ฅ ๋ก๊ทธ๋ฅผ ์ถ๋ ฅํฉ๋๋ค. */
console.log({ error });
}
}
/* iframe๊ฐ์ฒด์ Same Origin, Cross Origin ์ฃผ์๋ฅผ ๋ก๋ํ๋ ํจ์ ์
๋๋ค. */
const loadSameOrigin = () => { myFrame.src = 'https://same-origin.com/frame.html'; }
const loadCrossOrigin = () => { myFrame.src = 'https://cross-origin.com/frame.html'; }
</script>
<!--
๋ฒํผ 2๊ฐ ์์ฑ (Same Origin ๋ฒํผ, Cross Origin ๋ฒํผ)
-->
<button onclick=loadSameOrigin()>Same Origin</button><br>
<button onclick=loadCrossOrigin()>Cross Origin</button>
<!--
frame.html์ ์ฝ๋๊ฐ ์๋์ ๊ฐ์ต๋๋ค.
secret-element๋ผ๋ id๋ฅผ ๊ฐ์ง div ๊ฐ์ฒด ์์ treasure๋ผ๊ณ ํ๋ ๋น๋ฐ ๊ฐ์ ๋ฃ์ด๋์์ต๋๋ค.
-->
<div id="secret-element">treasure</div>
์ฝ๋ ๋์ ์ค๋ช
- ๋๋ฒ ์ค์ iframe ํ์ฌ ์น ํ์ด์ง ์์ ๋ ๋ค๋ฅธ ์น ํ์ด์ง ์ฝ์
ํ๋ HTML ํ๊ทธ
src ์์๋ฅผ ์ค์ ํจ์ผ๋ก์จ ์ฝ์ ํ ์น ํ์ด์ง์ ์ฃผ์๊ฐ ๊ฒฐ์ ๋จ! - ์ด๋ฒ์งธ ์ค์ onload ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ก, ํด๋น ๊ฐ์ฒด๊ฐ ์ฑ๊ณต์ ๋ก๋ ์ ๋์
๋ณธ ์์์ 10-24๋ฒ ์ค์ด iframe ๊ฐ์ฒด์ ํ์ด์ง๊ฐ ๋ก๋ ์ ๋์๋๋ ์ฝ๋! - 14-15๋ฒ์งธ ์ค์ ๋ก๋ ์๋ฃ ์ iframe ๋ด์ ์ฝ์
๋ ์ฃผ์ secret-element ๊ฐ์ฒด์ ๊ฐ์ธ
treasure๋ฅผ ์ฝ์ด์ ์ฝ์์ ์ถ๋ ฅํ๋ ๋์ ์ํ!
๊ทผ๋ฐ ์ฌ์ค ์ ์ฝ๋์ ๋ด์ฉ์ Dreamhack ๋ก๋๋งต์์ ์ค์ต ์น ํ์ด์ง์ ์ฝ๋๋ผ์.. ๋ฑํ
์ฑ๊ณต๊ณผ ์คํจ์ ๋ชจ์ต๋ง ์ด๋ฏธ์ง๋ก ๋ณด์ฌ๋๋ฆด๊ป์ ใ
์ ์น์ SOP์์ iframe์ Same Origin์ด ์๋ Cross Origin์ ๋ฃ์ผ๋ฉด
์ธ๋ฒ์งธ ๋์ ๊ณผ์ ์ด ์คํจ๋ก ์ถ๋ ฅ๋ฉ๋๋ค. ๊ทธ ์ด์ ๋ ์์ ์ฝ๋ ๋ณด์๋ฉด ๋๊ฒ ์ฃ ?
Same Origin Policy ์ ์ ์ํ
SOP๋ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ์น ๋ณด์์์ ์ค์ํ ์์์
๋๋ค.
ํ์ง๋ง, ๋ธ๋ผ์ฐ์ ๊ฐ ์ด๋ฌํ SOP์ ๊ตฌ์ ๋ฐ์ง ์๊ณ ์ธ๋ถ ์ถ์ฒ์ ๋ํ ์ ๊ทผ์ ํ์ฉํ๋ ๊ฒฝ์ฐ๋ ์์ฃ
์๋ฅผ ๋ค๋ฉด, ์ด๋ฏธ์ง๋ JS, CSS ๋ฑ์ ๋ฆฌ์์ค๋ฅผ ๋ถ๋ฌ์ค๋ <img>, <style>, <script> ๋ฑ์ ํ๊ทธ๊ฐ ์์ฃ
์ ๊ฒฝ์ฐ๋ค ์ธ์๋ ์น ์๋น์ค์ SOP๋ฅผ ์ํํ์ฌ ๋ค๋ฅธ ์ถ์ฒ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌ ํด์ผ ํ๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค.
์๋ก ํน์ ํฌํธ ์ฌ์ดํธ ์นดํ, ๋ธ๋ก๊ทธ ๋ฑ์ ์ฃผ์๋ก ์ด์ ์ ๊ฐ ์๋น์ค Host๊ฐ ๋ค๋ฅด๋๊น ์ค๋ฆฌ์ง์ด ๋ค๋ฅด๊ฒ ์ฃ ?
- ์นดํ: https://cafe.dreamhack.io
- ๋ธ๋ก๊ทธ: https://blog.dreamhack.io
- ๋ฉ์ผ: https://mail.dreamhack.io
- ๋ฉ์ธ: https://dreamhack.io
์๋ Theori์ ํ์ฌ์ธก์์.. ์ Dreamhack ๋ถ์ ์ฌ์ดํธ๋ค์ ์์ ์ธ๋ฏ ์ถ๋ค์ ์จ๋
์ด๋ฌํ ํ๊ฒฝ์์, ์ด์ฉ์๊ฐ ์์ ํ ๋ฉ์ผ์ ๊ฐ์๋ฅผ ๋ฉ์ธ ํ์ด์ง์ ์ถ๋ ฅํ ๋ ค๋ฉด SOP๋ฅผ ํ๋ฝํด์ผ ํฉ๋๋ค.
์ด ๋, ๋ ์ฌ์ดํธ๋ ์ค๋ฆฌ์ง์ด ๋ค๋ฅด๋ฏ๋ก SOP๋ฅผ ์ ์ฉ๋ฐ์ง ์๊ณ ๋ฆฌ์์ค๋ฅผ ๊ณต์ ํ ๋ฐฉ๋ฒ์ด ์๊ตฌ๋จ!
๊ทธ๋์ ๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ (Cross Origin Resource Sharing; CORS)๋ผ๊ณ ํฉ๋๋ค.
๊ณต์ ๋ฐฉ๋ฒ์ CORS์ ๊ด๋ จ๋ HTTP ํด๋๋ฅผ ์ถ๊ฐํ์ฌ ์ ์กํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํฉ๋๋ค.
๊ทธ ์ธ์๋ JSON with Padding(JSONP) ๋ฐฉ๋ฒ๋ ์์ต๋๋ค
Cross Origin Resource Sharing(CORS)
CORS๋ HTTP ํด๋ ๊ธฐ๋ฐ Cross Origin ๊ฐ์ ๋ฆฌ์์ค๋ฅผ ๊ณต์ ํ๋ ๋ฐฉ๋ฒ์
๋๋ค.
๋ฐ์ ์ธก์ CORS ํด๋๋ฅผ ์ค์ ํด ์์ฒญ ์, ์์ ์ธก์ ํค๋๋ฅผ ๊ตฌ๋ถํด ์ ํด์ง ๊ท์น์ ์ํด ๋ฐ์ดํฐ ๊ณต์ !
์๋ ๋ ์ด๋ฏธ์ง๋ ๊ฐ๊ฐ ์น ๋ฆฌ์์ค๋ฅผ ์์ฒญํ๋ ๋ฐ์ ์ธก ์ฝ๋์ ์ผ๋ถ์ ๋ฐ์ ์ธก์ HTTP์์ฒญ์ ๋๋ค.
์น ๋ฆฌ์์ค ์์ฒญ ์ฝ๋
/*
XMLHttpRequest ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
XMLHttpRequest๋ ์น ๋ธ๋ผ์ฐ์ ์ ์น ์๋ฒ ๊ฐ์ ๋ฐ์ดํฐ ์ ์ก์
๋์์ฃผ๋ ๊ฐ์ฒด ์
๋๋ค. ์ด๋ฅผ ํตํด HTTP ์์ฒญ์ ๋ณด๋ผ ์ ์์ต๋๋ค.
*/
xhr = new XMLHttpRequest();
/* https://theori.io/whoami ํ์ด์ง์ POST ์์ฒญ์ ๋ณด๋ด๋๋ก ํฉ๋๋ค. */
xhr.open('POST', 'https://theori.io/whoami');
/* HTTP ์์ฒญ์ ๋ณด๋ผ ๋, ์ฟ ํค ์ ๋ณด๋ ํจ๊ป ์ฌ์ฉํ๋๋ก ํด์ค๋๋ค. */
xhr.withCredentials = true;
/* HTTP Body๋ฅผ JSON ํํ๋ก ๋ณด๋ผ ๊ฒ์ด๋ผ๊ณ ์์ ์ธก์ ์๋ ค์ค๋๋ค. */
xhr.setRequestHeader('Content-Type', 'application/json');
/* xhr ๊ฐ์ฒด๋ฅผ ํตํด HTTP ์์ฒญ์ ์คํํฉ๋๋ค. */
xhr.send("{'data':'WhoAmI'}");
๋ฐ์ ์ธก์ HTTP ์์ฒญ
OPTIONS /whoami HTTP/1.1
Host: theori.io
Connection: keep-alive
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type
Origin: https://dreamhack.io
Accept: */*
Referer: https://dreamhack.io/
๊ทธ๋ผ ์ ๋ ฅ๋ฐ์ ํด๋์ ๋ํ ์ ๋ณด์ ๋ํ์ฌ ์์๊ฐ๋ณด๋ฉฐ ํ์ธํด๋ด ์๋ค.
ํ๋ฅผ ์ดํด๋ณด๋ฉด, ๋ฐ์ ์ธก์์ POST๋ฐฉ์์ผ๋ก HTTP ์์ฒญ์ ๋ณด๋์ผ๋,
OPTIONS ๋ฉ์๋๋ฅผ ๊ฐ์ง HTTP ์์ฒญ์ด ์ ๋ฌ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์ด๋ฅผ CORS preflight๋ผ๊ณ ํ๋ฉฐ, ์์ ์ธก์ ์น ๋ฆฌ์์ค๋ฅผ ์์ฒญํด๋ ๋๋์ง ์ง์ํ๋ ๊ณผ์ !
๊ทธ๋ฆฌ๊ณ ์์ 2๋ฒ์งธ ์ฝ๋๋ฅผ ๋ณด์๋ฉด "Access-Control-Request"๋ก ์์ํ๋ ํค๋๊ฐ ์กด์ฌํฉ๋๋ค
ํด๋น ํค๋ ๋ค์ ๋ฐ๋ผ์ค๋ Method์ Headers๋ ๊ฐ ๋ฉ์๋์ ํค๋๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋์ง ์ง์ํจ!
๋ํ ์์ฒ๋ผ ์ง์ ์ ์๋ฒ๋ ์๋์ ๊ฐ์ด ์๋ตํ๋ฉฐ, ๋ค์์ ์๋ต ๊ฒฐ๊ณผ์ ๋ํ ์ค๋ช
์
๋๋ค.
์๋ฒ์ ์๋ต
OPTIONS /whoami HTTP/1.1
Host: theori.io
Connection: keep-alive
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type
Origin: https://dreamhack.io
Accept: */*
Referer: https://dreamhack.io/
์ ๊ณผ์ ์ ๋ง์น๋ฉด ๋ธ๋ผ์ฐ์ ๋ ์์ ์ธก์ ์๋ต์ด ๋ฐ์ ์ธก์ ์์ฒญ๊ณผ ์์ํ๊ฐ ํ์ธํ๊ณ ,
๊ทธ๋์ผ ๋น๋ก์ POST ์์ฒญ์ ๋ณด๋ด ์์ ์ธก์ ์น ๋ฆฌ์์ค๋ฅผ ์์ฒญํ๋ HTTP ์์ฒญ์ ๋ณด๋
JSON with Padding(JSONP)
์๊น ์ด๋ฏธ์ง, JS, CSS ๋ฑ์ ๋ฆฌ์์ค๋ SOP์ ๊ตฌ์ X, ์ธ๋ถ ์ถ์ฒ ์ ๊ทผ ํ์ฉํ๋ค๊ณ ํ์ฃ
JSONP ๋ฐฉ์์ ์ด๋ฌํ ํน์ง ํ์ฉ <script> ํ๊ทธ๋ก Cross Origin์ ๋ฐ์ดํฐ๋ฅผ ํธ์ถ
ํ์ง๋ง <script> ํ๊ทธ ๋ด์ ๋ฐ์ดํฐ๋ฅผ JS ์ฝ๋๋ก ์ธ์ํ๊ธฐ์ Callback ํจ์๋ฅผ ํ์ฉํด์ผํฉ๋๋ค.
Cross Origin์ ์์ฒญ ์ callback ํ๋ผ๋ฏธํฐ์ ์ด๋ค ํจ์๋ก ๋ฐ์์ค๋ ๋ฐ์ดํฐ๋ฅผ ํธ๋ค๋งํ ์ง ๋๊ฒจ์ฃผ๋ฉด,
๋์ ์๋ฒ๋ ์ ๋ฌ๋ Callback์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ธ ์๋ตํฉ๋๋ค.
์น ๋ฆฌ์์ค ์์ฒญ ์ฝ๋
<script>
/* myCallback์ด๋ผ๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ง์ ํฉ๋๋ค. */
function myCallback(data){
/* ์ ๋ฌ๋ฐ์ ์ธ์์์ id๋ฅผ ์ฝ์์ ์ถ๋ ฅํฉ๋๋ค.*/
console.log(data.id)
}
</script>
<!--
https://theori.io์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ก๋ํ๋ HTML ์ฝ๋์
๋๋ค.
๋จ, callback์ด๋ผ๋ ์ด๋ฆ์ ํ๋ผ๋ฏธํฐ๋ฅผ myCallback์ผ๋ก ์ง์ ํจ์ผ๋ก์จ
์์ ์ธก์๊ฒ myCallback ํจ์๋ฅผ ์ฌ์ฉํด ์์ ๋ฐ๊ฒ ๋ค๊ณ ์๋ฆฝ๋๋ค.
-->
<script src='http://theori.io/whoami?callback=myCallback'></script>
์น ๋ฆฌ์์ค ์์ฒญ์ ๋ฐ๋ฅธ ์๋ต ์ฝ๋
/*
์์ ์ธก์ myCallback ์ด๋ผ๋ ํจ์๋ฅผ ํตํด ์์ฒญ์ธก์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํฉ๋๋ค.
์ ๋ฌํ ๋ฐ์ดํฐ๋ ํ์ฌ theori.io์์ ํด๋ผ์ด์ธํธ๊ฐ ์ฌ์ฉ ์ค์ธ ๊ณ์ ์ ๋ณด์ธ
{'id': 'dreamhack'} ์
๋๋ค.
*/
myCallback({'id':'dreamhack'});
์์ ์์ ์ฝ๋๋ <script src=.. ๋ถ๋ถ์ Cross Origin์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ต๋๋ค.
์ด๋ callback ํ๋ผ๋ฏธํฐ๋ก myCallback์ ํจ๊ป ์ ๋ฌํ์ฃ
Cross Origin์ ์๋ตํ ๋ฐ์ดํฐ๋ฅผ myCallback ํจ์์ ์ธ์๋ก ์ ๋ฌ๋ ์ ์๋๋ก myCallback์ผ๋ก ๊ฐ์ธ
JavaScript ์ฝ๋๋ก ๋ฐํ, ๋ฐํ ์ฝ๋๋ ์์ฒญ์ธก์ ์คํ๋๊ธฐ์ 3-6๋ฒ ์ค์ ์ ์๋ ํจ์๊ฐ ์ ๋ฌ๋ ๋ฐ์ดํฐ ์ฝ์
๋ค๋ง JSONP๋ CORS๊ฐ ์๊ธฐ๊ธฐ์ ์ ์ฌ์ฉ๋ ๊ฑฐ๋ผ ์์ฆ์ ์ฌ์ฉ ์ํด์ ใ
ํต์ฌ ํค์๋
- Same Origin Policy (SOP): ๋์ผ ์ถ์ฒ ์ ์ฑ
- ํ์ฌ ํ์ด์ง์ ์ถ์ฒ๊ฐ ์๋ ๋ค๋ฅธ ์ถ์ฒ๋ก๋ถํฐ ์จ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ง ๋ชปํ๊ฒ ํ๋ ๋ธ๋ผ์ฐ์ ์ ๋ณด์ ๋ฉ์ปค๋์ฆ - Same Origin: ํ์ฌ ํ์ด์ง์ ๋์ผํ ์ถ์ฒ
- Cross Origin: ํ์ฌ ํ์ด์ง์ ๋ค๋ฅธ ์ถ์ฒ
- Cross Origin Resource Sharing (CORS): ๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์
- SOP์ ์ ํ์ ๋ฐ์ง ์๊ณ Cross Origin์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌ ํ ์ ์๋๋ก ํด์ฃผ๋ ๋ฉ์ปค๋์ฆ
์ฐธ๊ณ ์๋ฃ
Mitigation: Same Origin Policy
์ด ์ฝ์ค์์๋ ๋ธ๋ผ์ฐ์ ์ ๋ณด์ ๋งค์ปค๋์ฆ์ธ SOP์ ๋ํด ์ค๋ช ํฉ๋๋ค.
dreamhack.io
์ฐธ๊ณ ์ด๋ฏธ์ง
'๐โWeb_Study > ๐โDreamhack_Hacking' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
SQL Injection (0) | 2022.10.20 |
---|---|
ClientSide: CSRF (0) | 2022.06.23 |
ClientSide: XSS (0) | 2022.06.21 |
http vs https (0) | 2022.05.25 |