Origin(์ถ์ฒ): <Protocol> "://" <hostname> [ ":" <port> ]
<Protocol>
: [ HTTP, HTTPS ] <hostname>
: ์๋ฒ์ ๊ณ ์ ํ ์ด๋ฆ ๋๋ IP<port>
: ์๋ฒ์ ์ฐ๊ฒฐ์ ๋งบ๊ธฐ ์ํ TCP ํฌํธ ๋ฒํธ, [ Default : 80 ]๐จ Access to fetch at https://blah.blah.blah/yadda
Visit Website from origin http://localhost:1234
has been blocked by CORS policy: No โAccess-Control-Allow-Originโ header is present on the requested resource. If an opaque response serves your needs, set the requestโs mode to โno-corsโ to fetch the resource with CORS disabled.
๐จ ์๋ณธhttp://localhost:1234
์์ https://blah.blah.blah/yadda
์น์ฌ์ดํธ๋ฅผ ๊ฐ์ ธ์ค๋๋์ค CORS์ ์ฑ
์ ์ํด ์ฐจ๋จ๋์์ต๋๋น. ์์ฒญํ ๋ฆฌ์์ค์ Access-Control-Allow-Origin
ํค๋๊ฐ ์์ต๋๋ค. ๋ง์ฝ ์๋ต์ด ํ์ํ ๊ฒฝ์ฐ requestโs
๋ชจ๋๋ฅผ no-cors
๋ก ๋ณ๊ฒฝํด์ CORS๊ฐ ๋นํ์ฑํ๋ ๋ฆฌ์์ค๋ฅผ ๊ฐ์ ธ์์ฃผ์ธ์ฌ!
์ด๋ฐ ์ค๋ฅ๊ฐ ์๊ธฐ๋ ์ด์ ๋ HTTP์์ฒญ์์ ์ด๋ค ์์ฒญ์ ํ๋์ ๋ฐ๋ผ ๋ค๋ฅธ ์ ์ฑ ์ ๋ฐ๋ฅด๊ธฐ ๋๋ฌธ!
<HTML>
๐๐ป Cross-Origin ์ ์ฑ ์ ๋ฐ๋ฆ
<Script>
๐๐ป Same-Origin ์ ์ฑ ์ ๋ฐ๋ฆ
JS๋ ์๋ก ๋ค๋ฅธ ๋๋ฉ์ธ์ ๋ํ ์์ฒญ์ ๋ณด์์ ์ ํํ๋ค.
๋ค๋ฅธ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ (Cross-Origin Resource Sharing, CORS)
๋ ์ถ๊ฐ HTTP ํค๋๋ฅผ ์ฌ์ฉํ์ฌ, ํ ์ถ์ฒ์์ ์คํ ์ค์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ค๋ฅธ ์ถ์ฒ์ ์ ํํ ์์์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ ๋ถ์ฌํ๋๋ก ๋ธ๋ผ์ฐ์ ์ ์๋ ค์ฃผ๋ ์ฒด์ ์ด๋ค. - MDN
Fetch API
๋ฅผ ์ฌ์ฉํ์ฌ ๋ธ๋ผ์ฐ์ ์๊ฒ ๋ฆฌ์ค์๋ฅผ ๋ฐ์์! ๋ผ๊ณ ์ํจ๋ค๋ฉดFetch API
๋ ๋คํธ์ํฌ ํต์ ์ ํฌํจํ ๋ฆฌ์์ค ์ทจ๋์ ์ํ ์ธํฐํ์ด์ค๊ฐ ์ ์๋์ด ์๋ค.์๋น ์์ฒญ(Preflight)
์ ๋ณด๋ธ๋ค. ๋ณธ ์์ฒญ
์ ๋ณด๋ธ๋ค.ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด ์๋น์์ฒญ์ ์๋ตํ ์ ์๋ค. ํ์ง๋ง ์ด ์กฐ๊ฑด์ด ๊น๋ค๋ก์์ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ์น ์ดํ๋ฆฌ์ผ์ด์ ์ํคํ ์ฒ๋ฅผ ์ค๊ณํ๋ค๋ฉด ๊ฑฐ์ ์ถฉ์กฐ์ํค๊ธฐ ์ด๋ ค์ ๊ฑฐ์ ์ฌ์ฉ๋์ง ์๋๋ค.
์์ฒญ์ ๋ฉ์๋๋ GET
, HEAD
, POST
์ค ํ๋์ฌ์ผ ํ๋ค.
Fetch๊ฐ "CORS-safelisted request-header"๋ก ์ ์ํ ํค๋๋ง ์ฌ์ฉํ ์ ์๋ค.
Content-Language
Content-Type
Accept
Accept-Language
Save-Data
Viewport-Width
DPR
Downlink
Width
๋ง์ฝ Content-Type๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ์๋ ๊ฐ๋ค๋ง ํ์ฉ๋๋ค.
application/x-www-form-urlencoded
multipart/form-data
text/plain
์ด ๋ฐฉ๋ฒ์ ๋ค๋ฅธ ๋ฐฉ๋ฒ๋ณด๋ค ์ข ๋ ๋ณด์์ ๊ฐํํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๋ธ๋ผ์ฐ์ ๊ฐ ์ ๊ณตํ๋ ๋น๋๊ธฐ ๋ฆฌ์์ค ์์ฒญ API์ธ XMLHttpRequest
๊ฐ์ฒด๋ fetch API
๋ ๋ณ๋์ ์ต์
์์ด ๋ธ๋ผ์ฐ์ ์ ์ฟ ํค ์ ๋ณด๋ ์ธ์ฆ๊ณผ ๊ด๋ จ๋ ํค๋๋ฅผ ํจ๋ถ๋ก ์์ฒญ์ ๋ด์ง ์๋๋ค.
๋ง์ฝ ์์ฒญ์ ์ธ์ฆ๊ณผ ๊ด๋ จ๋ ์ ๋ณด๋ฅผ ๋ด์์ผ ํ๋ค๋ฉด credentials ์ต์
์ ์ฌ์ฉํด์ผํ๋ค.
Credentials ์ต์
same-origin(๊ธฐ๋ณธ๊ฐ):
๊ฐ์ ์ถ์ฒ ๊ฐ ์์ฒญ์๋ง ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ด์ ์ ์๋ค.include:
๋ชจ๋ ์์ฒญ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ด์ ์ ์๋ค.omit:
๋ชจ๋ ์์ฒญ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ด์ง ์๋๋ค.๋ง์ฝ same-origin
, include
์ต์
์ ์ฌ์ฉํด ๋ฆฌ์์ค ์์ฒญ์ ์ธ์ฆ ์ ๋ณด๊ฐ ํฌํจ๋๋ค๋ฉด ํ๋ค๋ฉด ๋ธ๋ผ์ฐ์ ๋ ๋นก๋นกํ ์กฐ๊ฑด๋ค์ ์ถ๊ฐํ์ฌ ๊ฒ์ฌํด์ผํ๋ค.
Access-Control-Allow-Credentials: true
๊ฐ ์กด์ฌํด์ผํจ Chrome ํ์ฅํ๋ก๊ทธ๋จ์ CORS ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ํ์ฅ ํ๋ก๊ทธ๋จ์ธ Allow CORS ์ ์ ๊ณตํ๋ค.
Reference: CORS๋ ์ ์ด๋ ๊ฒ ์ฐ๋ฆฌ๋ฅผ ํ๋ค๊ฒ ํ๋๊ฑธ๊น?