์์ฑ์ : ์ ์ฐฌ๋ฏผ
๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ ํํ๋ ๋ณด์๋ฐฉ์
URL์ Protocol
, Host
, Port
๋ฅผ ํตํด ๊ฐ์ ์ถ์ฒ์ธ์ง ๋ค๋ฅธ ์ถ์ฒ์ธ์ง ํ๋จํ ์ ์๋ค.
Protocol, Host, Port์ค ํ๋๋ผ๋ ๋ค๋ฅด๋ฉด ๋ค๋ฅธ ์ถ์ฒ๋ผ๊ณ ํ๋๊ฒ์ด๊ณ , 3๊ฐ์ง๊ฐ ๋ชจ๋ ๊ฐ์์ผ์ง๋ง ๊ฐ์ ์ถ์ฒ๋ผ ํ๋๊ฒ์ด๋ค. ์ต์คํ๋ก๋ฌ ๊ฐ์ ๊ฒฝ์ฐ๋ Port๊ฐ ์ถ์ฒ๋ฅผ ํ๋จํ์ง ์๋๋ค. ์ฆ, Port๊ฐ ๋ฌ๋ผ๋ ๊ฐ์ ์ถ์ฒ์ด๋ค ๋ผ๊ณ ์ธํฐ๋ท ์ต์คํ๋ก๋ฌ๋ ํ๋จ์ ํ๋ค.
http://localhost์ ๋์ผ ์ถ์ฒ์ธ url์?
๋ต์ 2๋ฒ๊ณผ 4๋ฒ์ด๋ค.
1๋ฒ ๋ณด๊ธฐ๋ http, ์ฆ Protocol์ด ๋ค๋ฅด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ์ถ์ฒ๋ผ ๋ณด์๋ฉด ๋ฉ๋๋ค.
2๋ฒ์ ํฌํธ80์ด ๋ถ์ด์ ธ ์๋๋ฐ http๊ธฐ๋ณธ port๋ฒํธ๊ฐ 80์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ฐ์ ์ถ์ฒ๋ผ ๋ณด์๋ฉด ๋ฉ๋๋ค. ์์ ๋ณด๊ธฐ์์๋ ์๋ต์ด ๋ ์ํ์ด๋ค.
3๋ฒ์ 127.0.0.1.์ IP๋ localhost๊ฐ ๋ง๋ค. ๊ทธ๋ ์ง๋ง ๋ธ๋ผ์ฐ์ ์
์ฅ์์๋ ์ด๊ฑฐ๋ฅผ String value๋ฅผ ์๋ก ๋น๊ต๋ฅผ ํ๋ค๊ณ ํ๋ค. ๊ทธ๋์ String value๊ฐ localhost์ 127.0.0.1์ด ์๋ก ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋ธ๋ผ์ฐ์ ์
์ฅ์์๋ ๋ค๋ฅธ์ถ์ฒ๋ผ๊ณ ํ๋จ์ ํ๋ค๊ณ ํ๋ค.
4๋ฒ์ api/cors ๊ฐ์ ๊ฒฝ์ฐ๋ ์ถ๊ฐ์ ์ผ๋ก ๋ถ๋ ๋ก์ผ์ด์
์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ api ์์๊น์ง ๋น๊ต๋ฅผ ํด์ ์ด๊ฒ์ ๋์ผ ์ถ์ฒ์ด๋ค ๋ผ๊ณ ํ๋จ์ ํ๋ค๊ณ ํ๋ค.
SOP๋ ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ ํํ๋ ๋ณด์๋ฐฉ์์ด๋ผ๊ณ ํ๋๋ฐ ์ ์ด๋ฐ SOP๋ฅผ ์ฌ์ฉ์ ํด์ผ ๋ณด์์ ๋์์ ์ค๊น?
์ฌ๊ธฐ ์ ๋ํ ์ฐฌ๋ฏผ์ด ์๋ค. ์ฐฌ๋ฏผ์ด๊ฐ ํ์ด์ค๋ถ ์๋น์ค์ ๋ก๊ทธ์ธ์ ์ฌ์ฉํ๋ค. ์ด์ ๋ก๊ทธ์ธ์ ํ๊ฒ ๋๋ฉด ํ์ด์ค๋ถ ์ธ์ฆ ํ ํฐ์ ๋ฐ์์จ๋ค.
์ ๋ํ ์ฐฌ๋ฏผ์ ํ์ด์ค๋ถ์ ์ธ์ฆ ํ ํฐ์ ๊ฐ์ง๊ณ ์๋ ์ํ์
๋๋ค. ๊ทธ๋ฌ๋ค๊ฐ ํด์ปค์ฐ์์ด ํฅ๋ฏธ์ง์งํ ๋ด์ฉ๊ณผ ๋งํฌ๋ฅผ ๋ฉ์ผ์ ํตํด์ ๋ณด๋ธ๋ค.
๊ทธ๋์ ์ ๋ํ ์ฐฌ๋ฏผ์ ํด๋ฆญ์ ํ๋ค. ํด๋ฆญ์ ํ๋๊น ํด์ปค๊ฐ ๋ง๋ ์ฃผ์๋ก ์ด๋์ ํ๊ฒ ๋๋ค.
์ฌ๊ธฐ์ ํด์ปค๋ ์คํฌ๋ฆฝํธ๋ก "ํ์ด์ค๋ถ์ ๋๋ ๋ฐ๋ณด๋ค ๋ผ๋ ํฌ์คํธ๋ฅผ ๋ฑ๋กํด" ๋ผ๋ ์คํธ๋ฆฝํธ๊ฐ ์์ฑ์ด ๋์ด ์๋ ์ํ์ด๋ค.
๊ทธ๋์ ๋งํฌ๋ฅผ ํ๊ณ ๋ค์ด๊ฐ๋๋ ์คํฌ๋ฆฝํธ์ ๋ด์ฉ์ด ์คํ๋๋ค. ์๊น ์ด์ผ๊ธฐ ํ๋ฏ ์ ๋ํ ์ฐฌ๋ฏผ์ ํ์ด์ค๋ถ์ ์๊ธฐ์ธ์ฆ ํ ํฐ์ ๊ฐ์ง๊ณ ์๋ค.
ํด์ปค๋ ๊ทธ ์ธ์ฆํ ํฐ์ ๊ฐ์ง๊ณ ํ์ด์ค๋ถ์ ๋๋ ๋ฐ๋ณด๋ค ํฌ์คํธ๋ฅผ ๊ฐ์ํ๋ผ๊ณ ๋ช
๋ น์ ํ๊ฒ ๋๋ค.
๊ทผ๋ฐ ์ด์ ์ฌ๊ธฐ์ SOP๊ฐ ์ ๋ง๋ก ์๋ ฅ์ ๋ฐํํ๋ค. ํ์ด์ค๋ถ ์
์ฅ์์ origin์ ํ์ธํ๋ค. ์ด ์์ฒญ์ ์ถ์ฒ๋ฅผ ํ์ธํ๋๊น
hacker.ck์์ ์จ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฉด ํ์ด์ค๋ถ ์
์ฅ์์๋ ์๊ธฐ ์ถ์ฒ์ ๋ค๋ฅด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ด origin์ ๋ค๋ฅธ ์ถ์ฒ๋ผ๊ณ ํ๋จ์ ํ๊ธฐ ๋๋ฌธ์ ์ฆ, cross origin์ด๋ผ๊ณ ํ๋จ์ ํ๊ธฐ ๋๋ฌธ์ SOP์ ์๋ฐ๋๋ค.
๊ทธ๋์ ์ด ์์ฒญ์ ๋ฐ์๋ค์ผ ์ ์๋ค๊ณ ์ด์ผ๊ธฐ๋ฅผ ํ๋ค.
CORS (Cross-Origin Resource Sharing)๋ ์ถ๊ฐ HTTPํค๋๋ฅผ ์ฌ์ฉํ์ฌ, ํ ์ถ์ฒ์์ ์คํ์ค์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ค๋ฅธ ์ถ์ฒ์ ์ ํํ ์์์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ ๋ถ์ฌํ๋๋ก ๋ธ๋ผ์ฐ์ ์ ์๋ ค์ฃผ๋ ์ฒด์ ์ ๋๋ค. ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฆฌ์์ค๊ฐ ์์ ์ ์ถ์ฒ(๋๋ฉ์ธ, ํ๋กํ ์ฝ, ํฌํธ)์ ๋ค๋ฅผ ๋ ๊ต์ฐจ ์ถ์ฒ HTTP์์ฒญ์ ์คํํฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์น ํด๋ผ์ด์ธํธ ์ดํ๋ฆฌ์ผ์ด์
์ด ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ ๋๋ HTTP ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ฌ ์์ฒญ์ ๋ณด๋ด๊ฒ ๋๋๋ฐ, ์ด ๋ ๋ธ๋ผ์ฐ์ ๋ ์์ฒญํค๋์ Origin
์ด๋ผ๋ ํ๋์ ์์ฒญ์ ๋ณด๋ด๋ ์ถ์ฒ๋ฅผ ํจ๊ป ๋ด์๋ณด๋ธ๋ค.
Origin : https://even-moon.github.io
์ดํ ์๋ฒ๊ฐ ์ด ์์ฒญ์ ๋ํ ์๋ต์ ํ ๋ ์๋ต ํค๋์ Access-Control-Allow-Origin
์ด๋ผ๋ ๊ฐ์ "์ด ๋ฆฌ์์ค๋ฅผ ์ ๊ทผํ๋ ๊ฒ์ด ํ์ฉ๋ ์ถ์ฒ" ๋ฅผ ๋ด๋ ค์ฃผ๊ณ , ์ดํ ์๋ต์ ๋ฐ์ ๋ธ๋ผ์ฐ์ ๋ ์์ ์ด ๋ณด๋๋ ์์ฒญ์ Origins
๊ณผ ์๋ฒ๊ฐ ๋ณด๋ด์ค Access-Control-Allow-Origin
์ ๋น๊ตํด๋ณธ ํ ์ด ์๋ต์ด ์ ํจํ ์๋ต์ธ์ง ์๋์ง๋ฅผ ๊ฒฐ์ ํ๋ค.
- ๋จ์์์ฒญ (Simple Request)
- ํ๋ฆฌํ๋ผ์ดํธ ์์ฒญ (Preflight Request)
- ์ธ์ฆ์ ๋ณด ํฌํจ ์์ฒญ (Credentialed Request)
ํ๋ฆฌํ๋ผ์ดํธ(Preflight) ๋ฐฉ์์ ์ผ๋ฐ์ ์ผ๋ก ์ฐ๋ฆฌ๊ฐ ์น ์ดํ๋ฆฌ์ผ์ด์
์ ๊ฐ๋ฐํ ๋ ๊ฐ์ฅ ๋ง์ด ๋ณด์ด๋ ์ค๋ฅ์ด๋ค.
ํ๋ฆฌํ๋ผ์ดํธ์ ํด๋นํ๋ ์ํฉ์ผ ๋ ๋ธ๋ผ์ฐ์ ๋ ์์ฒญ์ ํ๋ฒ์ ๋ณด๋ด์ง ์๊ณ ์๋น์์ฒญ๊ณผ ๋ณธ ์์ฒญ์ผ๋ก ๋๋์ด์ ์๋ฒ๋ก ์ ์กํ๋ค.
์ด๋ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ณธ ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ ์ ๋ณด๋ด๋ ์๋น์์ฒญ์ Preflight
๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฒ์ด๋ฉฐ, ์ด ์๋น์์ฒญ์๋ HTTP ๋ฉ์๋ ์ค OPTIONS
๋ฉ์๋๊ฐ ์ฌ์ฉ๋๋ค.
์๋น ์์ฒญ์ ์ญํ ์ ๋ณธ ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ ์ ๋ธ๋ผ์ฐ์ ๊ฐ ์ค์ค๋ก ์ด ์์ฒญ์ ๋ณด๋ด๋ ๊ฒ์ด ์์ ํ์ง ํ์ธํ๋ ๊ฒ์ด๋ค.
์ฐ๋ฆฌ๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ์ fetch
API๋ฅผ ์ฌ์ฉํ์ฌ ๋ธ๋ผ์ฐ์ ์๊ฒ ๋ฆฌ์์ค๋ฅผ ๋ฐ์ ์ค๋ผ๋ ๋ช
๋ น์ ๋ด๋ฆฌ๋ฉด ์๋ฒ์๊ฒ ์๋น์์ฒญ์ ๋จผ์ ๋ณด๋ด๊ณ , ์๋ฒ๋ ์ด ์๋น ์์ฒญ์ ๋ํ ์๋ต์ผ๋ก ํ์ฌ ์์ ์ด ์ด๋ค ๊ฒ๋ค์ ํ์ฉํ๊ณ , ์ด๋ค ๊ฒ๋ค์ ๊ธ์งํ๊ณ ์๋์ง์ ๋ํ ์ ๋ณด๋ฅผ ์๋ต ํค๋์ ๋ด์์ ๋ธ๋ผ์ฐ์ ์๊ฒ ๋ค์ ๋ณด๋ด์ฃผ๊ฒ๋๋ค.
์ดํ ๋ธ๋ผ์ฐ์ ๋ ์์ ์ด ๋ณด๋ธ ์๋น์์ฒญ๊ณผ ์๋ฒ๊ฐ ์๋ต์ ๋ด์์ค ํ์ฉ ์ ์ฑ ์ ๋น๊ตํ ํ, ์ด ์์ฒญ์ ๋ณด๋ด๋ ๊ฒ์ด ์์ ํ๋ค๊ณ ํ๋จ๋๋ฉด ๊ฐ์ ์๋ํฌ์ธํธ๋ก ๋ค์ ๋ณธ ์์ฒญ์ ๋ณด๋ด๊ฒ ๋๋ค. ์ดํ ์๋ฒ๊ฐ ์ด ๋ณธ ์์ฒญ์ ๋ํ ์๋ต์ ํ๋ฉด ๋ธ๋ผ์ฐ์ ๋ ์ต์ข ์ ์ผ๋ก ์ด ์๋ต ๋ฐ์ดํฐ๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ์๊ฒ ๋๊ฒจ์ค๋ค.
์ด ํ๋ก์ฐ๋ ๋ธ๋ผ์ฐ์ ์ ๊ฐ๋ฐ์ ๋๊ตฌ ์ฝ์์์๋ ๊ฐ๋จํ๊ฒ ์ฌํํด๋ณผ ์ ์๋๋ฐ, RSS ํ์ผ ๋ฆฌ์์ค์ ์์ฒญ์ ๋ณด๋ด๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ๋ณธ ์์ฒญ์ ๋ณด๋ด๊ธฐ์ ์ OPTIONS
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์๋น์์ฒญ์ ๋ณด๋ด๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
const headers = new Headers({
"Content-Type": "text/xml",
});
fetch("https://evanmoon.tistory.com/rss", { headers });
OPTIONS https://evanmoon.tistory.com/rss
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9,ko;q=0.8,ja;q=0.7,la;q=0.6
Access-Control-Request-Headers: content-type
Access-Control-Request-Method: GET
Connection: keep-alive
Host: evanmoon.tistory.com
Origin: https://evan-moon.github.io
Referer: https://evan-moon.github.io/2020/05/21/about-cors/
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: cross-site
์ค์ ๋ก ๋ธ๋ผ์ฐ์ ๊ฐ ๋ณด๋ธ ์์ฒญ์ ๋ณด๋ฉด, ๋จ์ํ Origin
์ ๋ํ ์ ๋ณด ๋ฟ๋ง ์๋๋ผ ์์ ์ด ์๋น์์ฒญ ์ดํ์ ๋ณด๋ผ ๋ณธ ์์ฒญ์ ๋ํ ๋ค๋ฅธ ์ ๋ณด๋ค๋ ํจ๊ป ํฌํจ๋์ด ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด ์๋น ์์ฒญ์์ ๋ธ๋ผ์ฐ์ ๋ Access-Control-Request-Headers
๋ฅผ ์ฌ์ฉํ์ฌ ์์ ์ด ๋ณธ ์์ฒญ์์ Content-Type
ํค๋๋ฅผ ์ฌ์ฉํ ๊ฒ์ ์๋ ค์ฃผ๊ฑฐ๋, Access-Control-Request-Method
๋ฅผ ์ฌ์ฉํ์ฌ ์ดํ GET๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๊ฒ์ ์๋ฒ์๊ฒ ๋ฏธ๋ฆฌ ์๋ ค์ฃผ๊ณ ์๋ ๊ฒ์ด๋ค.
OPTIONS https://evanmoon.tistory.com/rss 200 OK
Access-Control-Allow-Origin: https://evanmoon.tistory.com
Content-Encoding: gzip
Content-Length: 699
Content-Type: text/xml; charset=utf-8
Date: Sun, 24 May 2020 11:52:33 GMT
P3P: CP='ALL DSP COR MON LAW OUR LEG DEL'
Server: Apache
Vary: Accept-Encoding
X-UA-Compatible: IE=Edge
์ฌ๊ธฐ์ ๋ด์ผ ํ ๊ฒ์ ์๋ฒ๊ฐ ๋ณด๋ด์ค ์๋ตํค๋์ ํฌํจ๋ Access-Control-Allow-Origin: https://evanmoon.tistory.com
๋ผ๋ ๊ฐ์ด๋ค.
์๋ฒ๋ ์ด ๋ฆฌ์์ค์ ์ ๊ทผ์ด ๊ฐ๋ฅํ ์ถ์ฒ๋ ์ค์ง https://evanmoon.tistory.com
๋ฟ์ด๋ผ๊ณ ๋ธ๋ผ์ฐ์ ์๊ฒ ์ด์ผ๊ธฐํด์ค ๊ฒ์ด๊ณ , ์ด ์์ฒญ์ ๋ณด๋ธ ์ถ์ฒ๋ https://evan-moon.github.io
์ด๋ฏ๋ก ์๋ฒ๊ฐ ํ์ฉํด์ค ์ถ์ฒ์๋ ๋ค๋ฅธ ์ถ์ฒ์ด๋ค.
๊ฒฐ๊ตญ ๋ธ๋ผ์ฐ์ ๋ ์ด ์์ฒญ์ด CORS ์ ์ฑ
์ ์๋ฐํ๋ค๊ณ ํ๋จํ๊ณ ๋ค์๊ณผ ๊ฐ์ ์๋ฌ๋ฅผ ๋ฑ๋๋ค.
๐จ Access to fetch at โhttps://evanmoon.tistory.com/rssโ from origin โhttps://evan-moon.github.ioโ has been blocked by CORS policy: Response to preflight request doesnโt pass access control check: The โAccess-Control-Allow-Originโ header has a value โhttp://evanmoon.tistory.comโ that is not equal to the supplied origin. Have the server send the header with a valid value, or, if an opaque response serves your needs, set the requestโs mode to โno-corsโ to fetch the resource with CORS disabled.
์ด๋ ์๋น ์์ฒญ์ ๋ํ ์๋ต์์ ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๊ณ ์ ์์ ์ผ๋ก 200์ด ๋จ์ด์ก๋๋ฐ, ์ฝ์ ์ฐฝ์๋ ๋นจ๊ฐ๊ฒ ์๋ฌ๊ฐ ํ์๋๊ธฐ ๋๋ฌธ์ ๋ง์ ๋ถ๋ค์ด ํท๊ฐ๋ คํ์๋๋ฐ, CORS ์ ์ฑ
์๋ฐ์ผ๋ก ์ธํ ์๋ฌ๋ ์๋น ์์ฒญ์ ์ฑ๊ณต ์ฌ๋ถ์ ๋ณ ์๊ด์ด ์๋ค.
๋ธ๋ผ์ฐ์ ๊ฐ CORS ์ ์ฑ
์๋ฐ ์ฌ๋ถ๋ฅผ ํ๋จํ๋ ์์ ์ ์๋น ์์ฒญ์ ๋ํ ์๋ต์ ๋ฐ์ ์ดํ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฌผ๋ก ์๋น ์์ฒญ ์์ฒด๊ฐ ์คํจํด๋ ๋๊ฐ์ด CORS ์ ์ฑ
์๋ฐ์ผ๋ก ์ฒ๋ฆฌ๋ ์๋ ์์ง๋ง, ์ค์ํ ๊ฒ์ ์๋น ์์ฒญ์ ์ฑ๊ณต/์คํจ ์ฌ๋ถ๊ฐ ์๋๋ผ "์๋ต ํค๋์ ์ ํจํ Access-Control-Allow-Origin
๊ฐ์ด ์กด์ฌํ๋ ๊ฐ" ์ด๋ค.
๋ง์ฝ ์๋น ์์ฒญ์ด ์คํจํด์ 200์ด ์๋ ์ํ์ฝ๋๊ฐ ๋ด๋ ค์ค๋๋ผ๋ ํค๋์ ์ ๊ฐ์ด ์ ๋๋ก ๋ค์ด๊ฐ ์๋ค๋ฉด CORS ์ ์ฑ
์๋ฐ์ด ์๋๋ผ๋ ์๋ฏธ์ด๋ค.
๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ด๋ ๊ฒ ์๋น์์ฒญ, ๋ณธ ์์ฒญ์ ๋๋์ด ๋ณด๋ด๋ ํ๋ฆฌํ๋ผ์ดํธ ๋ฐฉ์์ ์ฌ์ฉํ๊ธฐ๋ ํ์ง๋ง, ๋ชจ๋ ์ํฉ์์ ์ด๋ ๊ฒ ๋ ๋ฒ์ฉ ์์ฒญ์ ๋ณด๋ด๋ ๊ฒ์ ์๋๋ค. ์กฐ๊ธ ๊น๋ค๋ก์ด ์กฐ๊ฑด์ด๊ธฐ๋ ํ์ง๋ง ์ด๋ค ๊ฒฝ์ฐ์๋ ์๋น ์์ฒญ์์ด ๋ณธ ์์ฒญ๋ง์ผ๋ก CORS ์ ์ฑ ์๋ฐ ์ฌ๋ถ๋ฅผ ๊ฒ์ฌํ๊ธฐ๋ ํ๋ค.
๋จ์ ์์ฒญ์ ์๋น์์ฒญ์ ๋ณด๋ด์ง ์๊ณ ๋ฐ๋ก ์๋ฒ์๊ฒ ๋ณธ ์์ฒญ์ ๋ณด๋ธ ํ, ์๋ฒ๊ฐ ์ด์ ๋ํ ์๋ต์ ํค๋์
Access-Control-Allow-Origin
๊ณผ ๊ฐ์ ๊ฐ์ ๋ณด๋ด์ฃผ๋ฉด ๊ทธ๋ ๋ธ๋ผ์ฐ์ ๊ฐ CORS ์ ์ฑ
์๋ฐ ์ฌ๋ถ๋ฅผ ๊ฒ์ฌํ๋ ๋ฐฉ์์ด๋ค.
์ฆ, ํ๋ฆฌํ๋ผ์ดํธ์ ๋จ์ ์์ฒญ ์๋๋ฆฌ์ค๋ ์ ๋ฐ์ ์ธ ๋ก์ง ์์ฒด๋ ๊ฐ๋, ์๋น ์์ฒญ์ ์กด์ฌ ์ ๋ฌด๋ง ๋ค๋ฅด๋ค.
ํ์ง๋ง ์๋ฌด๋๋ ๋จ์ ์์ฒญ์ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ ์๋๊ณ , ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฒฝ์ฐ์๋ง ์๋น ์์ฒญ์ ์๋ตํ ์ ์๋ค.
๊ฒ๋ค๊ฐ ์ด ์กฐ๊ฑด์ด ์กฐ๊ธ ๊น๋ค๋กญ๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ์น ์ดํ๋ฆฌ์ผ์ด์
์ํคํ
์ฒ๋ฅผ ์ค๊ณํ๊ฒ ๋๋ฉด ๊ฑฐ์ ์ถฉ์กฑ์ํค๊ธฐ ์ด๋ ค์ด ์กฐ๊ฑด๋ค์ด๋ค.
- ์์ฒญ์ ๋ฉ์๋๋
GET
,HEAD
,POST
์ค ํ๋์ฌ์ผ ํ๋ค.Accept
,Accept-Language
,Content-Language
,Content-Type
,DPR
,Downlink
,Save-Data
,Viewport-Width
,Width
์ ์ธํ ํค๋๋ฅผ ์ฌ์ฉํ๋ฉด ์๋๋ค.- ๋ง์ฝ
Content-Type
๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋application/x-www-form-urlencoded
,multipart/form-data
,text/plain
๋ง ํ์ฉ๋๋ค.
1๋ฒ ์กฐ๊ฑด์ ๊ฒฝ์ฐ๋ ๊ทธ๋ฅ PUT
์ด๋ DELETE
๊ฐ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ๋๋ ๊ฒ ๋ฟ์ด๋ ๊ทธ๋ ๊ฒ ๋ณด๊ธฐ ๋๋ฌธ ์ํฉ์ ์๋์ง๋ง, 2๋ฒ์ด๋ 3๋ฒ ์กฐ๊ฑด ๊ฐ์ ๊ฒฝ์ฐ๋ ๊น๋ค๋กญ๋ค.
์ ์กฐ๊ฑด์ ๋ช
์๋ ํค๋๋ค์ ์ง์ง ๊ธฐ๋ณธ์ ์ธ ํค๋๋ค์ด๊ธฐ ๋๋ฌธ์, ๋ณต์กํ ์์ฉ ์น ์ดํ๋ฆฌ์ผ์ด์
์์ ์ด ํค๋๋ค ์ธ์ ์ถ๊ฐ์ ์ธ ํค๋๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ๋ ๋๋ฌผ๋ค.
์ฌ์ฉ์ ์ธ์ฆ์ ์ฌ์ฉ๋๋ Authorization
ํค๋ ์กฐ์ฐจ ์ ์กฐ๊ฑด์๋ ํฌํจ๋์ง ์๋๋ค.
๋๋ถ๋ถ์ HTTP API๋ text/xml
์ด๋ application/json
์ปจํ
์ธ ํ์
์ ๊ฐ์ง๋๋ก ์ค๊ณ๋๊ธฐ ๋๋ฌธ์ ์ด ์กฐ๊ฑด๋ค์ ๋ชจ๋ ๋ง์กฑ์ํค๋ ์ํฉ์ ๋ง๋ค๊ธฐ๋ ๊ทธ๋ ๊ฒ ์ฝ์ง์๋ค.
CORS์ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ์์ด๋ผ๊ธฐ ๋ณด๋ค๋ ๋ค๋ฅธ ์ถ์ฒ ๊ฐ ํต์ ์์ ์ข ๋ ๋ณด์์ ๊ฐํํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๋ธ๋ผ์ฐ์ ๊ฐ ์ ๊ณตํ๋ ๋น๋๊ธฐ ๋ฆฌ์์ค ์์ฒญ API์ธ XMLHttpRequest
๊ฐ์ฒด๋ fetch
API๋ ๋ณ๋์ ์ต์
์์ด ๋ธ๋ผ์ฐ์ ์ ์ฟ ํค ์ ๋ณด๋ ์ธ์ฆ๊ณผ ๊ด๋ จ๋ ํค๋๋ฅผ ํจ๋ถ๋ก ์์ฒญ์ ๋ด์ง ์๋๋ค.
์ด ๋ ์์ฒญ์ ์ธ์ฆ๊ณผ ๊ด๋ จ๋ ์ ๋ณด๋ฅผ ๋ด์ ์ ์๊ฒ ํด์ฃผ๋ ์ต์
์ด ๋ฐ๋ก credentials
์ต์
์ด๋ค.
์ต์ ๊ฐ | ์ค๋ช |
---|---|
same-origin (๊ธฐ๋ณธ๊ฐ) | ๊ฐ์ ์ถ์ฒ ๊ฐ ์์ฒญ์๋ง ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ด์ ์ ์๋ค. |
include | ๋ชจ๋ ์์ฒญ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ด์ ์ ์๋ค. |
omit | ๋ชจ๋ ์์ฒญ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ด์ง ์๋๋ค. |
๋ง์ฝ same-origin
์ด๋ include
์ ๊ฐ์ ์ต์
์ ์ฌ์ฉํ์ฌ ๋ฆฌ์์ค ์์ฒญ์ ์ธ์ฆ ์ ๋ณด๊ฐ ํฌํจ๋๋ค๋ฉด, ์ด์ ๋ธ๋ผ์ฐ์ ๋ ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค ์์ฒญ์ ํ ๋ ๋จ์ํ Access-Control-Allow-Origin
๋ง ํ์ธํ๋ ๊ฒ์ด ์๋๋ผ ์ข ๋ ๋นก๋นกํ ๊ฒ์ฌ ์กฐ๊ฑด์ ์ถ๊ฐํ๊ฒ ๋๋ค.
Access-Control-Allow-Origin
๊ฐ์ผ๋ก ๋ชจ๋ ์ถ์ฒ๋ฅผ ํ์ฉํ๋ค๋ ์๋ฏธ์ธ *
๊ฐ ์ค์ ๋์ด ์๊ธฐ ๋๋ฌธ์, ๋ค๋ฅธ ์ถ์ฒ์์ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ ๋ CORS ์ ์ฑ
์๋ฐ์ผ๋ก ์ธํ ์ ์ฝ์ ๋ฐ์ง ์๋๋ค.
๊ทธ๋์ http://localhost:8000
๊ณผ ๊ฐ์ ๋ก์ปฌ์ ๊ฐ๋ฐ ํ๊ฒฝ์์๋ fetch
API๋ฅผ ์ฌ์ฉํ์ฌ ๋ง์๋๋ก ๋ฆฌ์์ค๋ฅผ ์์ฒญํ๊ณ , ๋ ๋ฐ์์ฌ ์ ์๋ค.
fetch("https://evan-moon.github.io/feed.xml");
Request
GET https://evan-moon.github.io/feed.xml
Origin: http://localhost:8000
Referer: http://localhost:8000/2020/05/21/about-cors/
Response
GET https://evan-moon.github.io/feed.xml 200 OK
Access-Control-Allow-Origin: *
Content-Encoding: gzip
Content-Length: 1132748
Content-Type: application/xml
Server: GitHub.com
Status: 200
๋ํ ๊ตฌ๊ธ ํฌ๋กฌ ๋ธ๋ผ์ฐ์ ์ credentials
๊ธฐ๋ณธ ๊ฐ์ ๊ฐ์ ์ถ์ฒ ๋ด์์๋ง ์ธ์ฆ ์ ๋ณด๋ฅผ ์ฌ์ฉํ๊ฒ ๋ค๋ same-origin
์ด๊ธฐ ๋๋ฌธ์, ๋ก์ปฌ ํ๊ฒฝ์์ https://even-moon.github.io
๋ก ๋ณด๋ด๋ ๋ฆฌ์์ค ์์ฒญ์๋ ๋น์ฐํ ๋ธ๋ผ์ฐ์ ์ ์ฟ ํค์ ๊ฐ์ ์ธ์ฆ์ ๋ณด๊ฐ ํฌํจ๋์ด ์์ง ์๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ธ๋ผ์ฐ์ ๋ ๋จ์ํ Access-Control: *
์ด๋ผ๋ ๊ฐ๋ง ๋ณด๊ณ ์์ ํ ์์ฒญ์ด๋ค ๋ผ๋ ๊ฒฐ๋ก ์ ๋ด๋ฆฌ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ crednetials
์ต์
์ ๋ชจ๋ ์์ฒญ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ํฌํจํ๊ฒ ๋ค๋ ์๋ฏธ๋ฅผ ๊ฐ์งinclude
๋ก ๋ณ๊ฒฝํ๊ณ ๊ฐ์ ์์ฒญ์ ๋ณด๋ด๋ฉด ์ด๋ฒ์๋ ์ํฉ์ด ๋ฌ๋ผ์ง๋ค.
fetch('https://evan-moon.github.io/feed.xml', {
credentials: 'include', // Credentials ์ต์
๋ณ๊ฒฝ!
});
์ง์ ๋ธ๋ผ์ฐ์ ์ฝ์์์ ์คํํด๋ณด๋ฉด ์๊ฒ ์ง๋ง, ์ด๋ฒ์๋ credentials: include
์ต์
์ ์ฌ์ฉํ์ฌ ๋์ผ ์ถ์ฒ ์ฌ๋ถ์ ์๊ด์์ด ๋ฌด์กฐ๊ฑด ์์ฒญ์ ์ธ์ฆ ์ ๋ณด๊ฐ ํฌํจ๋๋๋ก ์ค์ ํ์ผ๋ฏ๋ก, ์ด๋ฒ ์์ฒญ์๋ ๋ธ๋ผ์ฐ์ ์ ์ฟ ํค์ ๋ณด๊ฐ ํจ๊ป ๋ด๊ฒจ ์๋๊ฒ์ ํ์ธํด ๋ณผ ์ ์๋ค.
ํธ์คํ
ํ๊ณ ์๋ Github์๋ฒ๋ ์ด๋ฒ์๋ ๋์ผํ ์๋ต์ ๋ด์ฃผ์์ง๋ง, ๋ธ๋ผ์ฐ์ ์ ๋ฐ์์ ๋ค๋ฅด๋ค.
๐จ Access to fetch at โhttps://evan-moon.github.io/feed.xmlโ from origin โhttp://localhost:8000โ has been blocked by CORS policy: The value of the โAccess-Control-Allow-Originโ header in the response must not be the wildcard โ*โ when the requestโs credentials mode is โincludeโ.
๋ธ๋ผ์ฐ์ ๋ ์ธ์ฆ๋ชจ๋๊ฐ include
์ผ ๊ฒฝ์ฐ, ๋ชจ๋ ์์ฒญ์ ํ์ฉํ๋ค๋ ์๋ฏธ์ *
์ Access-Control-Allow-Origin
ํค๋์ ์ฌ์ฉํ๋ฉด ์๋๋ค๊ณ ํ๋ค.
์ด์ฒ๋ผ ์์ฒญ์ ์ธ์ฆ ์ ๋ณด๊ฐ ๋ด๊ฒจ์๋ ์ํ์์ ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ๊ฒ ๋๋ฉด ๋ธ๋ผ์ฐ์ ๋ CORS ์ ์ฑ ์๋ฐ ์ฌ๋ถ๋ฅผ ๊ฒ์ฌํ๋ ๋ฃฐ์ ๋ค์ ๋ ๊ฐ์ง๋ฅผ ์ถ๊ฐํ๊ฒ ๋๋ค.
Access-Control-Allow-Origin
์๋*
์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ๋ช ์์ ์ธ URL์ด์ด์ผ ํ๋ค.- ์๋ต ํค๋์๋ ๋ฐ๋์
Access-Control-Allow-Credentials: true
๊ฐ ์กด์ฌํด์ผ ํ๋ค.
์ธ์ฆ๊น์ง ์ฝํ์๋ ์ด ๊ตฌ์กฐ๋ ๋ค๋ฅธ ๊ตฌ์กฐ์ ๋นํด์ ๋ค์ ๋ณต์กํ๊ฒ ๋๊ปด์ง ์๋ ์์ง๋ง, ์ด๋ ๊ฒ CORS ์ ์ฑ ์ ๋ํ ๋ค์ํ ๊ตฌ์กฐ๋ฅผ ์์๋๋ฉด ์ค์ ์ํฉ์์ CORS ์ ์ฑ ์๋ฐ์ผ๋ก ์ธํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๊ฒฝ์ฐ ์๊ฐ์ ๋จ์ถ์ํฌ ์ ์์ ๊ฒ์ด๋ค.
CORS ์ ์ฑ
์๋ฐ์ผ๋ก ์ธํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฐ์ฅ ๋ํ์ ์ธ ๋ฐฉ๋ฒ์, ๊ทธ๋ฅ ์ ์๋๋ก ์๋ฒ์์ Access-Control-Allow-Origin
ํค๋์ ์๋ง์ ๊ฐ์ ์ธํ
ํด์ฃผ๋ ๊ฒ์ด๋ค.
์ด๋ *
์ ์ฌ์ฉํ์ฌ ์ด ํค๋๋ฅผ ์ธํ
ํ๊ฒ ๋๋ฉด ๋ชจ๋ ์ถ์ฒ์์ ์ค๋ ์์ฒญ์ ๋ฐ์๋จน๊ฒ ๋ค๋ ์๋ฏธ์ด๋ฏ๋ก ๋น์ฅ์ ํธํ ์ ์๊ฒ ์ง๋ง, ๋ฐ๊ฟ์ ์๊ฐํ๋ฉด ์ ์ฒด๋ ๋ชจ๋ฅด๋ ์ด์ํ ์ถ์ฒ์์ ์ค๋ ์์ฒญ๊น์ง ๋ชจ๋ ๋ฐ์๋จน๊ฒ ๋ค๋ ๊ฒ๊ณผ ๋ค๋ฅผ ๊ฒ ์์ผ๋ฏ๋ก ๋ณด์์ ์ผ๋ก ์ฌ๊ฐํ ์ด์๊ฐ ๋ฐ์ํ ์๋ ์๋ค.
๊ฐ๊ธ์ ์ผ๋ฉด Access-Control-Allow-Origin: https://evan.github.io
์ ๊ฐ์ด ์ถ์ฒ๋ฅผ ๋ช
์ํ์!
์ด ํค๋๋ Nginx๋ Apache์ ๊ฐ์ ์๋ฒ ์์ง์ ์ค์ ์์ ์ถ๊ฐํ ์๋ ์์ง๋ง, ์๋ฌด๋๋ ๋ณต์กํ ์ธํ ์ ํ๊ธฐ๋ ๋ถํธํ๊ธฐ ๋๋ฌธ์ ์์ค์ฝ๋ ๋ด์์ ์๋ต ๋ฏธ๋ค์จ์ด ๋ฑ์ ์ฌ์ฉํ์ฌ ์ธํ ํ๋ ๊ฒ์ ์ถ์ฒํ๋ค. Spring, Express, Django์ ๊ฐ์ด ์ด๋ฆ์๋ ๋ฐฑ์๋ ํ๋ ์์ํฌ์ ๊ฒฝ์ฐ์๋ ๋ชจ๋ CORS ๊ด๋ จ ์ค์ ์ ์ํ ์ธํ ์ด๋ ๋ฏธ๋ค์จ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตํ๊ณ ์์ผ๋ ์ธํ ์์ฒด๊ฐ ์ด๋ ต์ง๋ ์๋ค.
CORS๋ฅผ ๊ฐ์ฅ ๋ง์ด ๋ง์ฃผ์น๋ ํ๊ฒฝ์ ๋ฐ๋ก ๋ก์ปฌ์์ ํ๋ก ํธ์๋ ์ดํ๋ฆฌ์ผ์ด์
์ ๊ฐ๋ฐํ๋ ๊ฒฝ์ฐ๋ผ๊ณ ํด๋ ๊ณผ์ธ์ด ์๋๋ค.
๋ฐฑ์๋์๋ ์ด๋ฏธ Access-Control-Allow-Origin
ํค๋๊ฐ ์ธํ
๋์ด ์๊ฒ ์ง๋ง, ์ด ์ค์ํ ํค๋์ http://localhost:3000
๊ฐ์ ๋ฒ์ฉ์ ์ธ ์ถ์ฒ๋ฅผ ๋ฃ์ด์ฃผ๋ ๊ฒฝ์ฐ๋ ๋๋ฌผ๊ธฐ ๋๋ฌธ์ด๋ค.
ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ ๋๋ถ๋ถ ์นํฉ๊ณผ webpack-dev-server
๋ฅผ ์ฌ์ฉํ์ฌ ์์ ์ ๊ฐ๋ฐ ํ๊ฒฝ์ ๊ตฌ์ถํ๊ฒ ๋๋๋ฐ, ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ ๊ณตํ๋ ํ๋ก์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ์์ฃผ ํธํ๊ฒ CORS ์ ์ฑ
์ ์ฐํํ ์ ์๋ค.
module.exports = {
devServer: {
proxy: {
"/api": {
target: "https://api.evan.com",
changeOrigin: true,
pathRewrite: { "^/api": "" },
},
},
},
};
์ด๋ ๊ฒ ์ค์ ์ ํด ๋์ผ๋ฉด ๋ก์ปฌํ๊ฒฝ์์ /api๋ก ์์ํ๋ URL๋ก ๋ณด๋ด๋ ์์ฒญ์ ๋ํด ๋ธ๋ผ์ฐ์ ๋ localhost:8000/api
๋ก ์์ฒญ์ ๋ณด๋ธ ๊ฒ์ผ๋ก ์๊ณ ์์ง๋ง, ์ฌ์ค ๋ค์์ ์นํฉ์ด https://api.evan.com
์ผ๋ก ์์ฒญ์ ํ๋ก์ฑํด์ฃผ๊ธฐ ๋๋ฌธ์ ๋ง์น CORS ์ ์ฑ
์ ์งํจ ๊ฒ์ฒ๋ผ ๋ธ๋ผ์ฐ์ ๋ฅผ ์์ด๋ฉด์๋ ์ฐ๋ฆฌ๋ ์ํ๋ ์๋ฒ์ ์์ ๋กญ๊ฒ ํต์ ์ ํ ์ ์๋ค. ์ฆ, ํ๋ก์ฑ์ ํตํด CORS ์ ์ฑ
์ ์ฐํํ ์ ์๋ ๊ฒ์ด๋ค.
ํน์ Webpack-dev-middelware์ Node ์๋ฒ์ ์กฐํฉ์ผ๋ก ๊ฐ๋ฐ ํ๊ฒฝ์ ์ง์ ๊ตฌ์ถํ๋๋ผ๋ http-proxy-middleware ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์์ฝ๊ฒ ํ๋ก์ ์ค์ ์ ํ ์ ์๋ค.(webpack-dev-server
๋ ๋ด๋ถ์ ์ผ๋ก๋ http-proxy-middleware
์ฌ์ฉํ๋ค.)
๊ทธ๋ ์ง๋ง ์ด ๋ฐฉ๋ฒ์ ์ค์ ํ๋ก๋์
ํ๊ฒฝ์์๋ ํด๋ผ์ด์ธํธ ์ดํ๋ฆฌ์ผ์ด์
์ ์์ค๋ฅผ ์๋นํ๋ ์ถ์ฒ์ API ์๋ฒ์ ์ถ์ฒ๊ฐ ๊ฐ์ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค. ๋ก์ปฌ ๊ฐ๋ฐํ๊ฒฝ์์๋ ์นํฉ์ด ์์ฒญ์ ํ๋ก์ฑํด์ฃผ๋ ์ด์์ด ์์ง๋ง, ์ดํ๋ฆฌ์ผ์ด์
์ ๋น๋ํ๊ณ ์๋ฒ์ ์ฌ๋ฆฌ๊ณ ๋๋ฉด ๋์ด์ webpack-dev-server
๊ฐ ๊ตฌ๋ํ๋ ํ๊ฒฝ์ด ์๋๊ธฐ ๋๋ฌธ์ ์ด์ํ ๊ณณ์ผ๋ก API์์ฒญ์ ๋ณด๋ด๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ฅผ ๋ค์ด, API์๋ฒ์ ์ถ์ฒ๋ https://api.evan.com
์ด๊ณ , ํด๋ผ์ด์ธํธ ์ดํ๋ฆฌ์ผ์ด์
์ ์๋นํ๋ ์๋ฒ์ ์ถ์ฒ๋ https://www.evan.com
์ด๋ผ๋ฉด, ์ด๋ฐ ์ํฉ์ด ๋ฐ์ํ๋ค.
fetch("/api/me");
๋ก์ปฌํ๊ฒฝ์์๋...
GET https://api.evan.com/me 200 OK
์ค์ ์๋ฒ์๋ ํ๋ก์ฑ ๋ก์ง์ด ์์...
GET https://www.evan.com/api/me 404 Not Found
๋น์ฆ๋์ค ๋ก์ง ๋ด์์ process.env.NODE_ENV
์ ๊ฐ์ ๋น๋ ํ๊ฒฝ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ถ๊ธฐ ๋ก์ง์ ์์ฑํ๋ ๋ฐฉ๋ฒ๋ ์์ง๋ง, ๋น์ฆ๋์ค ๋ก์ง์ ์ด๋ฐ ๊ฐ๋ฐํ๊ฒฝ ์ ์ฉ ์์ค๊ฐ ํฌํจ๋๋ ๊ฒ์ ์ข์ง ์๋ค๊ณ ํ๋ค.
SOP(Same-Origin Policy) ์ ์ฑ ์๋ ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์๋ ๋ช ๊ฐ์ง ์์ธ์กฐํญ์ด ์กด์ฌํ๊ณ , ๊ทธ ์ค ํ๋๊ฐ CORS ์ ์ฑ ์ ์งํจ ์์ฒญ์ด๋ผ๊ณ ์ด์ผ๊ธฐํ์๋ค. ๊ทธ๋ฆฌ๊ณ CORS ์ ์ฑ ์ ์งํจ ์์ฒญ์ ์ ์ธํ SOP์ ์์ธ ์กฐํญ์ ์คํ ๊ฐ๋ฅํ ์คํฌ๋ฆฝํธ, ๋ ๋๋ ์ด๋ฏธ์ง ์คํ์ผ ์ํธ ์ ๋๊ฐ ์๋ค.
<img src="https://evanmoon.tistory.com/rss" />
<script src="https://evanmoon.tistory.com/rss"></script>
์ด๋ฐ ์์ผ๋ก ์ ๊ทผํ๋ฉด CORS๋ฅผ ์๋ฐํ์ง ์๊ณ ์์ฒญ ์์ฒด๋ ์ฑ๊ณตํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ธ๋ผ์ฐ์ ์ ๊ฐ๋ฐ์ ๋๊ตฌ์ ๋คํธ์ํฌ ํญ์์ ์ด ์์ฒญ๋ค์ ํค๋๋ฅผ ์์ธํ ์ดํด๋ณด๋ฉด Sec-Fetch-Mode: no-cors
๋ผ๋ ๊ฐ์ด ํฌํจ๋์ด ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
Sec-Fetch-Mode
ํค๋๋ ์์ฒญ์ ๋ชจ๋๋ฅผ ์ค์ ํ๋ ํ๋์ธ๋ฐ, ๋ธ๋ผ์ฐ์ ๋ ์ด ํ๋์ ๊ฐ์ด no-cors
์ธ ๊ฒฝ์ฐ์๋ ๋ค๋ฅธ ์ถ์ฒ๋ผ๊ณ ํด๋ CORS ์ ์ฑ
์๋ฐ ์ฌ๋ถ๋ฅผ ๊ฒ์ฌํ์ง ์๋๋ค.
ํ์ง๋ง ๋ธ๋ผ์ฐ์ ๊ฐ ์ด ํค๋์ ๊ฐ์ด ํฌํจ๋ ์์ฒญ์ ์๋ต์ ์๋ฐ์คํฌ๋ฆฝํธ์๊ฒ ์๋ ค์ฃผ์ง ์๋๋ค๋ ๊ฒ์ด๋ค.
์ฆ, ์ฐ๋ฆฌ๋ ์ฝ๋๋ ๋ฒจ์์ ์ ๋ ์ด ์๋ต์ ๋ด๊ธด ๋ด์ฉ์ ์ ๊ทผํ ์๊ฐ ์๋ค.
CORS ์ ์ฑ
์ ๋ธ๋ผ์ฐ์ ์ ๊ตฌํ ์คํ์ด๊ธฐ ๋๋ฌธ์ ์ ์ฑ
์๋ฐ์ผ๋ก ์ธํด ๋ฌธ์ ๋ฅผ ๊ฒช๋ ์ฌ๋์ ๋๋ถ๋ถ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์์ด์ง๋ง, ์ ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๋ฐฑ์๋ ๊ฐ๋ฐ์๊ฐ ์๋ฒ ์ดํ๋ฆฌ์ผ์ด์
์ ์๋ต ํค๋์ ์ฌ๋ฐ๋ฅธ Access-Control-Allow-Origin
์ด ๋ด๋ ค์ฌ ์ ์๋๋ก ์ธํ
ํด์ค์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
webpack-dev-server
์ ํ๋ก์ฑ ์ต์
์ ์ฌ์ฉํ์ฌ ์์ฒด์ ์ผ๋ก ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ๋ ์์ง๋ง, ์ด ๋ฐฉ๋ฒ์ ๋ก์ปฌ ๊ฐ๋ฐํ๊ฒฝ์์๋ง ํตํ๋ ๋ฐฉ๋ฒ์ธ๋ฐ๋ค๊ฐ, ๊ทผ๋ณต์ ์ธ ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ตญ ์ด์ ํ๊ฒฝ์์ CORS ์ ์ฑ
์๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๋ฐฑ์๋ ๊ฐ๋ฐ์์ ๋์์ด ํ์ํ ์ ๋ฐ์ ์๋ค.
CORS ์ ์ฑ
์๋ฐ์ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ ์์ฒด๊ฐ ๊ทธ๋ ๊ฒ ์ด๋ ต๊ณ ๋ณต์กํ ํธ์ ์๋๋ผ์ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ ๋ฐฑ์๋ ๊ฐ๋ฐ์ ์ค ํ๋ช
์ด๋ผ๋ ์ด๋ฌํ ์ ์ฑ
์ ๋ํด์ ์ ์๊ณ ์๋ ๊ฒฝ์ฐ๋ผ๋ฉด ์๊ฐ๋ณด๋ค ๋น ๋ฅด๊ณ ์์ํ๊ฒ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.