CORS
๋ฐฐ๊ฒฝ#
ํ๋ก ํธ์๋์์ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด์๋ ์ฌ๋ฌ ์๋ฒ์ ์์์ ์์ฒญ(request)ํ๊ฒ๋๋ค. ( image , css , js , json ... )

๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ HTTP ์์ฒญ์ Cross-Site HTTP Request๊ฐ ๊ฐ๋ฅํ๋ค. ์ฆ <img> ํ๊ทธ์ src , <link> ํ๊ทธ๋ก css , <script> ํ๊ทธ๋ก JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฑ์๊ฐ์ ธ์ค๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค.
ํ์ง๋ง <script></script> ๋ก ๋๋ฌ์ธ์ฌ ์๋ ์คํฌ๋ฆฝํธ ๋ด์์ ์์ฑ๋ HTTP Request์ ๋ํด์๋ Same Origin Policy๊ฐ ์ ์ฉ๋๋ค.
Origin ์ด๋?#

์ฌ๊ธฐ์ origin ์ด๋ (์๋ธ)๋๋ฉ์ธ, ํ๋กํ ์ฝ, ํฌํธ๋ฒํธ๊น์ง ๋ชจ๋ ํฉ์น ๊ฒ์ ์๋ฏธํ๋ค.
(์ฝ์ ์ฐฝ์์ location.origin ์ผ๋ก ์ ๊ทผํ ์ ์๋ค.)

์ฆ ๋๋ฉ์ธ, ํ๋กํ ์ฝ, ํฌํธ๋ฒํธ๊น์ง ๋ชจ๋ ๊ฐ์์ผ ๋์ผ ์ถ์ฒ๋ก ์ธ์ ๋๋ ๊ฒ์ด๋ค.
Cross Origin#
๊ทธ๋ฌ๋ฉด ์คํฌ๋ฆฝํธ ๋ด์์๋ ๊ฐ์ ์ถ์ฒ์ ์๋ ์์๋ง ์์ฒญํ๊ณ , ์ฌ์ฉํ ์ ์๋๊ฐ? ์๋๋ค. AJAX๊ฐ ๋๋ฆฌ ์ฌ์ฉ๋๋ฉด์ <script> ๋ด๋ถ์์๋ Cross-Site HTTP Request๊ฐ ๊ฐ๋ฅํด์ผ ํ๋ค๋ ์๊ตฌ๊ฐ ๋์ด๋๋ฉด์ W3C๋ก๋ถํฐ CORS(Cross-Origin-Request-Sharing) ๋ผ๋ ๊ถ๊ณ ์์ด ๋์ค๊ฒ ๋์๋ค.
๋ธ๋ผ์ฐ์ (Client-Side)#
๋ธ๋ผ์ฐ์ ๋ ์คํฌ๋ฆฝํธ ๋ด์ ๋ค๋ฅธ ์ถ์ฒ์ ๋ํ HTTP Request Header์ Origin ์ด๋ผ๋ํ๋๋ฅผ ์ถ๊ฐํด์ ์์ฒญ์ ๋ณด๋ธ๋ค.
ํฌ๋กฌ ๋คํธ์ํฌ ํญ์์ Request Header๋ฅผ ์ดํด๋ณด์. (์๋ฒ : http://localhost:3000 )
Cross Origin

Same Origin

<script>ํ๊ทธ ์ธ๋ถ์request
โ Cross Origin ์์ฒญ์๋ง Origin ํ๋๊ฐ ์ถ๊ฐ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์๋ฒ ์ฌ์ด๋#
์๋ฒ์์ ๊ต์ฐจ ์ถ์ฒ ์์ฒญ์ ํ์ฉํด์ฃผ๊ธฐ ์ํด์ HTTP response์ Access-Control-Allow-* ์ต์
๋ค์ ์ฌ์ฉํ ์ ์๋ค.
์๋ฒ๋ Access-Control-Allow-Origin ํค๋๋ก ์ด๋ ์ถ์ฒ๋ฅผ ํ์ฉํ ๊ฒ์ธ์ง ๋ช
์ํ ์์๋ค.
express์์์ ์์
์ ์ฒด ํ์ฉ :
res.header('Access-Control-Allow-Origin', '*');ํน์ ์ถ์ฒ ํ์ฉ :
res.header('Access-Control-Allow-Origin', 'http://example.com');

๋ํ Access-Control-Allow-Methods ๋ก ํ์ฉํ ๋ฉ์๋๋ค์ ์ง์ ํ ์ ์๋ค.
res.header('Access-Control-Allow-Methods', ["POST", "GET", "PUT"]);
Preflighted Requests#
CORS์๋ ๋ ๊ฐ์ง ์ ํ์ ์์ฒญ์ด ์๋ค. simple request ์ preflighted request ๋ค.
์ด๋ฆ์์ ๋๋ฌ๋๋ฏ์ด, simple request๋ ๊ฐ๋จํ ์์ฒญ, preflighted request๋ ๋ฏธ๋ฆฌ ๋ณด๋ด๋ ์์ฒญ์ด๋ค.
simple request#
simple request๋ ๋ค์ ์กฐ๊ฑด์ ๋ง์กฑํด์ผ ํ๋ค.
GET, POST ๋ฉ์๋ + (HEAD ๋ฉ์๋)
POST ๋ฐฉ์์ผ ๊ฒฝ์ฐ Content-type์ด ์๋ ์ ์ค ํ๋
application/x-www-form-urlencoded
multipart/form-data
text/plain
์ปค์คํ ํค๋๋ฅผ ์ ์กํ์ง ๋ง์์ผ ํ๋ค.
์์ธํ ์กฐ๊ฑด์ ์๋์ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ๋ค.
๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ (CORS)
preflighted request#

preflighted request๋ ์ค์ง์ ์์ฒญ(actual request)์ ๋ณด๋ด๊ธฐ ์ ์ Access-Control-Request-* ํค๋๋ฅผ ์ฌ์ฉํด ๋ฏธ๋ฆฌ ์์ฒญ์ ๋ณด๋ธ๋ค.

๋ธ๋ผ์ฐ์ ๋ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ์๋ต์ ๋ณด๊ณ , ํ์ฉ๋์๋ค๋ฉด ์ค์ง์ ์์ฒญ์ ๋ณด๋ด๊ฒ ๋๋ค.

๋ง์ฝ preflighted request๊ฐ ํ์ฉ๋์ง ์์๋ค๋ฉด ๋ธ๋ผ์ฐ์ ๋ ์ค์ง์ ์์ฒญ์ ์ ์กํ์ง์๊ฒ ๋๋ค.
์ด๋ฌํ ๋ฐฉ๋ฒ์ ํตํด ์๋ฒ๋ ํ์ฉํ์ง ์์ ์ถ์ฒ๋ก๋ถํฐ์ ์์์ ๋ํ ์ ๊ทผ์ด๋ ์์ ์๋ง์ ๋ณดํธ๋ฅผ ๋ฐ๊ฒ ๋๋ค.
์ฐธ๊ณ ์๋ฃ#
โ๐ผ๐ฅ CS Visualized: CORS