SOP, COP
Same Origin Policy
document ๊ฐ์ฒด๋ ์ถ์ ์ธ origin์ ๊ฐ์ง๊ณ ์๊ณ , ์ด๋ js์์ `document.location.origin`์ผ๋ก ํ์ธํ ์ ์๋ค. document ๋ด์์ ๋ฆฌ์์ค๋ค๊ณผ ์ํธ์์ฉํ ๋, origin์ด ๋ค๋ฅด๋ค๋ฉด ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๋ ๋ฐ์ ์์ด์ ์ ํ์ ๋๊ฒ ๋ค๋ ๊ฒ์ด SOP(Same Origin Policy)์ด๋ค.
Origin ํ๋จ
Origin์ด ๊ฐ์ ์ง๋ Protocol, Host, Port๋ก ํ๋จํ๋๋ฐ url ๊ตฌ์กฐ๋ฅผ ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
http://localhost:3000
Protocol://Host:Port
์ธ ๊ฐ์ง๊ฐ ๋ชจ๋ ๊ฐ์ผ๋ฉด ๊ฐ์ Origin์ด๋ผ๊ณ ํ๋จ๋๋ ๊ฒ์ด๋ค.
IE๋ ์์ชฝ ๋๋ฉ์ธ ๋ชจ๋ ๋์ ๋จ๊ณ์ ๋ณด์ ์์ค์ผ ๊ฒฝ์ฐ Same Origin Policy๊ฐ ์ ์ฉ๋์ง ์๊ณ , ํฌํธ๊ฐ ๋ค๋ฅด๋๋ผ๋ Same Origin์ผ๋ก ๊ฐ์ฃผ๋๋ค.
IE...ใ ใทใ ใท
SOP๊ฐ ์๋ค๋ฉด?
SOP๊ฐ ์๋ค๋ฉด ์ด๋ค ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์๊น?
์๋ฅผ ๋ค์ด Same origin์ด ์๋ ๋, ํด์ปค๊ฐ ์์ ์ ์๋ฒ url๋ก ์ ์ ๋ฅผ ์ ๋ํ๋ฉด ํด๋น document๊ฐ ์ ์ ์ ๋ธ๋ผ์ฐ์ ์์ ์คํ๋ ํ ๋ฐ, document์ ํด๋น ์ ์ ์ ๋ค๋ฅธ ํ์ด์ง๋ฅผ ๊ธ์ด์ฌ ์ ์๋ ์ฝ๋๊ฐ ์์ผ๋ฉด ๊ฐ์ธ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๊ฒ ๋๋ค.
SOP ์ ์ฉ
ํ์ง๋ง, ์ฐ๋ฆฌ๋ ๋ค๋ฅธ ์ฌ์ดํธ์ ๋น๋์ค๋ฅผ ์ฝ์ ํ๊ธฐ๋ ํ๊ณ ๋ค๋ฅธ ์ฌ์ดํธ๋ก link๋ฅผ ๊ฑธ์ด ์ด๋ํ๊ธฐ๋ ํ๋ค. ์ด๋ฌํ ์ผ๋ค์ SOP์ ์ํฅ์ ์ ๋ฏธ์น๋ ๊ฒ์ผ๊น?
-
Cross Origin Writes
-
์ฐ๊ธฐ๋ ๋ณดํต ํ์ฉ๋๋ค. ์์์ ์ค๋ช ํ ๋งํฌ๋ redirect, form ์ ์ถ ๋ฑ์ ์์ด์ ์์ ๋กญ์ง๋ง ์ผ๋ถ ์ฌ์ด๋์์ preflight๋ฅผ ์์ฒญํ๊ธฐ๋ ํ๋ค.
-
preflight๋ ์ค์ request๋ฅผ ๋ณด๋ด๋ ๊ด์ฐฎ์์ง ํ๋จํ๊ธฐ ์ํด, option method๋ฅผ ์ด์ฉํ์ฌ ํ ์คํธ request๋ฅผ ๋ณด๋ด๋ ๊ฒ์ด๋ค.
-
-
Cross Origin Inserts
- ์ฝ์ ์ ๋ณดํต ํ์ฉ๋๋ค. iframe์ด๋ video, img, embed ๋ฑ์ ํ๊ทธ๋ก ์ธ๋ถ ๋ฆฌ์์ค๋ฅผ ์ฝ์ ํ๋ค.
-
Cross Origin Read
- ์ฝ๊ธฐ๋ ๋ถํํ์ง๋ง CORS(Cross Origin Resource Sharing)๋ฅผ ์ด์ฉํด ์ ๊ทผ์ ํ์ฉํ ์ ์๋ค.
๊ฒฐ๊ตญ SOP๋ฅผ ๋ฐ๋ฅด๋ Web API๋ค์ ์ฌ์ฉํ๋ฉด, api ํธ์ถ ๋ฑ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ ๋ ๊ฐ์ origin์ด๊ฑฐ๋ ๋ค๋ฅธ origin์ผ ๊ฒฝ์ฐ cors ์ต์ ์ด ํ์ธ๋์ด์ผํ๋ค. ์ด๋ฌํ API๋ค์๋ Fetch API, XMLHttpRequest, axios ๋ฑ์ด ์๋ค.
CORS๋ Cross-Origin Resource Sharing์ผ๋ก origin์ด ๋ค๋ฅธ ์ฌ์ดํธ์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ ์ ์ฑ ์ด๋ค. SOP์์๋ ์๋ ๋ค๋ฅธ origin์ ์ฌ์ดํธ์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ ์ ์๋๋ฐ, CORS๋ฅผ ์ค์ ํ๋ฉด ๊ฐ๋ฅํ๋ค.
Preflight
๋ค๋ฅธ origin์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ ๋๋ ์๋ฒ ์ ์ฅ์์๋ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ ์ ์๊ณ , ๋ธ๋ผ์ฐ์ ์ ์ฅ์์๋ ์๋ฒ๊ฐ ์์ฒญ์ ์ ๋๋ก ๋ฐ์ ์ ์์ ์ ์์ผ๋ ์ ๋๋ก ๋ ๋์์ ๋ณด์ฅํ๊ธฐ ์ํด์๋ ํ ์คํธ๋ฅผ ๋จผ์ ํด์ผํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ํ ์คํ ๊ณผ์ ์ด ๋ฐ๋ก Preflight์ด๋ค.
๊ฐ๋ api ์์ฒญ ์ get method๋ง ์ ๋๋ก ๋์ํ๊ณ ๋ค๋ฅธ ๋ฉ์๋๋ 404 ์๋ฌ๊ฐ ๋ฐ ๋๊ฐ ์๋ค. ๊ทธ๋ฆฌ๊ณ Network๋ฅผ ์ดํด๋ณด๋ฉด ๋ด๊ฐ ์ง์ ํ method๊ฐ ์๋ OPTION method๋ก ์์ฒญ์ ๋ณด๋ธ ๊ฒ์ด ๋ณด์ธ๋ค.
์ด๋ Preflight๋ฅผ ์ด์ฉํ๊ธฐ ๋๋ฌธ์ธ๋ฐ, ์ฝ๊ฒ ์๋ฅผ ๋ค์ด ํด๋ผ์ด์ธํธ๊ฐ ๋ค์ ์์ฒญ์์ ์ฌ์ฉํ method๋ฅผ ์๋ฒ์๊ฒ ๋ณด๋ด๋ฉด ์๋ฒ๋ ํ์ฉํ๋ method๋ฅผ response๋ก ๋ณด๋ด์ ํด๋ผ์ด์ธํธ๊ฐ ํ ๋ค์ ์์ฒญ์ด ์ ํจํ ์ง์ ๋ํ ์๋ต์ ํด์ฃผ๋ ์์ด๋ค.
CORS ๋์
CORS(Cross-Origin Resource Sharing)๋ HTTP header๋ฅผ ์ถ๊ฐํจ์ผ๋ก์จ ๋์ํ๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด๋ค header๋ฅผ ์ถ๊ฐํด์ผํ ๊น?
์๋ฒ์์ ์ฌ์ฉํ๋ HTTP response header์ ์ต์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
-
Access-Control-Allow-Origin : ์ด๋ค origin์ data ์์ฒญ์ ํ์ฉํ ์ง
-
Access-Control-Expose-Headers : ๋ธ๋ผ์ฐ์ ๊ฐ ํ์ฉํ๋ header ์ง์ ๊ฐ๋ฅ
-
Access-Control-Max-Age : preflight์ ์์ฒญ์ด ์ผ๋ง๋ ์ค๋ ์บ์๋๋์ง
-
Access-Control-Allow-Credentials : ์ธ์ฆ ์ ๋ณด ์ธํ ๊ฐ๋ฅ
-
Access-Control-Allow-Methods : ๊ฐ๋ฅํ ์์ฒญ method
-
Access-Control-Allow-Headers : ํ์ฉํ๋ header ์ง์ ๊ฐ๋ฅ
๋ธ๋ผ์ฐ์ ์์ ์ฌ์ฉํ๋ HTTP request header์ ์ต์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
-
origin
-
Access-Control-Request-Method : preflight์์ ์ค์ ์์ฒญ์ ์ด๋ค method๊ฐ ์ฐ์ผ ๊ฒ์ธ์ง ์๊ณ
- ์๋ฒ์์๋ Access-Control-Allow-Methods๋ก ๋ต๋ณํจ
-
Access-Control-Request-Headers : preflight์์ ์ค์ ์์ฒญ์ ์ด๋ค header๊ฐ ์ฐ์ผ ๊ฒ์ธ์ง ์๊ณ
- ์๋ฒ์์๋ Access-Control-Allow-Headers๋ก ๋ต๋ณํจ
๊ฒฐ๋ก ์ ์ผ๋ก same origin์ด ์๋ cross origin์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ ๋, preflight๋ก ๋จผ์ ํ ์คํ ์ ํ๋ฉฐ ์๋ฒ์ ๋ธ๋ผ์ฐ์ ์์๋ ์์ ๊ฐ์ header๋ฅผ ํตํด ํด๋น origin์ ์์ฒญ์ด ์ฌ๋ฐ๋ฅด๊ณ ์ดํ๋ ์ ์๋์ง ์ํตํ๋ค.
Comment