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 RequestsCORS์๋ ๋ ๊ฐ์ง ์ ํ์ ์์ฒญ์ด ์๋ค. simple request ์ preflighted request ๋ค.
์ด๋ฆ์์ ๋๋ฌ๋๋ฏ์ด, simple request๋ ๊ฐ๋จํ ์์ฒญ, preflighted request๋ ๋ฏธ๋ฆฌ ๋ณด๋ด๋ ์์ฒญ์ด๋ค.
#
simple requestsimple request๋ ๋ค์ ์กฐ๊ฑด์ ๋ง์กฑํด์ผ ํ๋ค.
GET, POST ๋ฉ์๋ + (HEAD ๋ฉ์๋)
POST ๋ฐฉ์์ผ ๊ฒฝ์ฐ Content-type์ด ์๋ ์ ์ค ํ๋
application/x-www-form-urlencoded
multipart/form-data
text/plain
์ปค์คํ ํค๋๋ฅผ ์ ์กํ์ง ๋ง์์ผ ํ๋ค.
์์ธํ ์กฐ๊ฑด์ ์๋์ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ๋ค.
๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ (CORS)
#
preflighted requestpreflighted request๋ ์ค์ง์ ์์ฒญ(actual request)์ ๋ณด๋ด๊ธฐ ์ ์ Access-Control-Request-*
ํค๋๋ฅผ ์ฌ์ฉํด ๋ฏธ๋ฆฌ ์์ฒญ์ ๋ณด๋ธ๋ค.
๋ธ๋ผ์ฐ์ ๋ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ์๋ต์ ๋ณด๊ณ , ํ์ฉ๋์๋ค๋ฉด ์ค์ง์ ์์ฒญ์ ๋ณด๋ด๊ฒ ๋๋ค.
๋ง์ฝ preflighted request๊ฐ ํ์ฉ๋์ง ์์๋ค๋ฉด ๋ธ๋ผ์ฐ์ ๋ ์ค์ง์ ์์ฒญ์ ์ ์กํ์ง์๊ฒ ๋๋ค.
์ด๋ฌํ ๋ฐฉ๋ฒ์ ํตํด ์๋ฒ๋ ํ์ฉํ์ง ์์ ์ถ์ฒ๋ก๋ถํฐ์ ์์์ ๋ํ ์ ๊ทผ์ด๋ ์์ ์๋ง์ ๋ณดํธ๋ฅผ ๋ฐ๊ฒ ๋๋ค.
#
์ฐธ๊ณ ์๋ฃโ๐ผ๐ฅ CS Visualized: CORS