CORS๋ ์ ์ด๋ ๊ฒ ์ฐ๋ฆฌ๋ฅผ ํ๋ค๊ฒ ํ๋๊ฑธ๊น?
์ด๋ฒ ํฌ์คํ
์์๋ ์น ๊ฐ๋ฐ์๋ผ๋ฉด ํ๋ฒ์ฏค์ ์ป์ด๋ง์ ๋ดค์ ๋ฒํ CORS(Cross-Origin Resource Sharing)
์ ์ฑ
์ ๋ํ ์ด์ผ๊ธฐ๋ฅผ ํด๋ณด๋ ค๊ณ ํ๋ค. ์ฌ์ค ์น ๊ฐ๋ฐ์ ํ๋ค๋ณด๋ฉด CORS ์ ์ฑ
์๋ฐ์ผ๋ก ์ธํด ์๋ฌ๊ฐ ๋ฐ์ํ๋ ์ํฉ์ ๊ต์ฅํ ํํด์ ๋๊ตฌ๋ ํ ๋ฒ ์ ๋๋ ๊ฒช๊ฒ ๋๋ค๊ณ ํด๋ ๊ณผ์ธ์ด ์๋๋ค.
ํ์๋ ๋ํ์ ๋ ์น๊ตฌ๋ค๊ณผ ํ ์ด ํ๋ก์ ํธ๋ฅผ ๋ง๋ค๋ ๊ณผ์ ์ ์ด ์ด์๋ฅผ ์ฒ์ ๊ฒช์์๋ค. ๋น์ ํ์๋ ๋ก์ปฌ ํ๊ฒฝ์์ ํด๋ผ์ด์ธํธ ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค๊ณ ์์๊ณ , ์น๊ตฌ๊ฐ ๋ฏธ๋ฆฌ ๋ง๋ค์ด์ ๋ฐฐํฌํด๋์ ๊ฐ๋ฐ ํ๊ฒฝ API ์๋ฒ์ ํต์ ์ ์๋ํ์๋ค.
API ์๋ฒ์ ํต์ ์ ์งํํด์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ฉด ๋๋ ๋จ์ํ ์์ ์ด์๊ธฐ ๋๋ฌธ์ ์๋ฌด ์๊ฐ์์ด ํต์ ์ ์งํํ๋๋ฐ, ๊ฐ์๊ธฐ ์ฝ์์ด ๋นจ๊ฐ์ง๋๋ ๋นํฉ์ค๋ฌ์ด ๋ฉ์ธ์ง๋ฅผ ๋ฑ์ด๋๋ค.
๐จ Access to fetch at โhttps://api.lubycon.com/meโ from origin โhttp://localhost:3000โ 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.
์ง๊ธ ๋ณด๋ฉด ๋๋ฆ ์น์ ํ๊ฒ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ ์๋ ค์ฃผ๊ณ ์๋ ์๋ฌ ๋ฉ์ธ์ง์ด์ง๋ง, ์น ์ดํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ ๊ฒฝํ์ด ์ ๋ฌดํ๋ ๋น์ ํ์๋ ์ด ๋ฉ์ธ์ง๋ฅผ ๋ณด๊ณ ๋ ๋ญ ์ด๋ป๊ฒ ํด์ผํ๋์ง ํ์ฐธ ํค๋งธ๋ ๊ธฐ์ต์ด ๋๋ค.
CORS์ ๋ํ ๊ธฐ๋ณธ์ ์ธ ๋ด์ฉ
์ด๋ ๋ฏ ์ฐ๋ฆฌ๊ฐ ๊ฒช๋ CORS ๊ด๋ จ ์ด์๋ ๋ชจ๋ CORS ์ ์ฑ ์ ์๋ฐํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ ๊ฒ์ด๋ค. ๊ฐ๋ฐํ๋ ์ ์ฅ์์๋ ์ ์ ์ฑ ๋๋ฌธ์ ์ ๊ฒฝ์จ์ผ ํ๋ ๊ฒ๋ค์ด ๋์ด๋๋ ๊ท์ฐฎ์ ์๋ ์์ง๋ง, ์ฌ์ค CORS๋ผ๋ ๋ฐฉ์ด๋ง์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๊ฐ ์ด ๊ณณ ์ ๊ณณ์์ ๊ฐ์ ธ์ค๋ ๋ฆฌ์์ค๊ฐ ์์ ํ๋ค๋ ์ต์ํ์ ๋ณด์ฅ์ ๋ฐ์ ์ ์๋ ๊ฒ์ด๋ค.
CORS๋ Cross-Origin Resource Sharing
์ ์ค์๋ง๋ก, ํ๊ตญ์ด๋ก ์ง์ญํ๋ฉด ๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ ๋ผ๊ณ ํด์ํ ์ ์๋ค. ์ฌ๊ธฐ์ โ๊ต์ฐจ ์ถ์ฒโ๋ผ๊ณ ํ๋ ๊ฒ์ โ๋ค๋ฅธ ์ถ์ฒโ๋ฅผ ์๋ฏธํ๋ ๊ฒ์ธ๋ฐ, ์๋ฌด๋๋ Cross
๋ผ๋ ์๋จ์ด๊ฐ ๊ฐ์ง๋ ๋์์ค๊ฐ ํ๊ตญ์ด์ ์กฐ๊ธ์ ๋ค๋ฅด๋ค๋ณด๋ CORS๋ฅผ ๊ทธ๋๋ก ์ง์ญํ ๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ ๋ผ๋ ๋ง๋ง ๋ณด๊ณ ๋ ์ด๋ค ์๋ฏธ์ธ์ง ๊ฐ์ ์ก๊ธฐ๊ฐ ์กฐ๊ธ์ ์ด๋ ค์ด ๊ฒ ๊ฐ๋ค.
๊ทธ๋์ ํ์๋ ์กฐ๊ธ ๋ ์ฌ์ด ์ดํด๋ฅผ ์ํด ๊ต์ฐจ ์ถ์ฒ๋ผ๋ ๋ง ๋์ โ๋ค๋ฅธ ์ถ์ฒโ๋ผ๋ ๋จ์ด๋ฅผ ์ฌ์ฉํด์ ์ด ํฌ์คํ ์ ํ์ด๋๊ฐ๊น ํ๋ค.
์ผ๋จ ๋ค๋ฅธ ์ถ์ฒ๊ฐ์ ๋ฆฌ์์ค ๊ณต์ ์ ๋ํด์ ์์๋ณด๊ธฐ์ ์์ ๊ฐ๋จํ๊ฒ ์ด ์ถ์ฒ(Origin)
๋ผ๋ ๊ฒ์ด ์ ํํ ๋ญ ์๋ฏธํ๋์ง๋ถํฐ ํ๋ฒ ์ง๊ณ ๋์ด๊ฐ๋๋ก ํ์.
์ถ์ฒ(Origin)๊ฐ ๋ฌด์์ธ๊ฐ์?
์๋ฒ์ ์์น๋ฅผ ์๋ฏธํ๋ https://google.com
๊ณผ ๊ฐ์ URL๋ค์ ๋ง์น ํ๋์ ๋ฌธ์์ด ๊ฐ์ ๋ณด์ฌ๋, ์ฌ์ค์ ์ฌ๋ฌ ๊ฐ์ ๊ตฌ์ฑ ์์๋ก ์ด๋ฃจ์ด์ ธ์๋ค.
์ด๋ ์ถ์ฒ๋ Protocol
๊ณผ Host
, ๊ทธ๋ฆฌ๊ณ ์ ๊ทธ๋ฆผ์๋ ๋์์์ง ์์ง๋ง :80
, :443
๊ณผ ๊ฐ์ ํฌํธ ๋ฒํธ๊น์ง ๋ชจ๋ ํฉ์น ๊ฒ์ ์๋ฏธํ๋ค. ์ฆ, ์๋ฒ์ ์์น๋ฅผ ์ฐพ์๊ฐ๊ธฐ ์ํด ํ์ํ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๊ฒ๋ค์ ํฉ์ณ๋์ ๊ฒ์ด๋ค.
๋ํ ์ถ์ฒ ๋ด์ ํฌํธ ๋ฒํธ๋ ์๋ต์ด ๊ฐ๋ฅํ๋ฐ, ์ด๋ ๊ฐ ์น์์ ์ฌ์ฉํ๋ HTTP
, HTTPS
ํ๋กํ ์ฝ์ ๊ธฐ๋ณธ ํฌํธ ๋ฒํธ๊ฐ ์ ํด์ ธ์๊ธฐ ๋๋ฌธ์ด๋ค. HTTP๊ฐ ์ ์๋ RFC 2616 ๋ฌธ์๋ฅผ ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๊ธฐ๋ณธ ํฌํธ ๋ฒํธ๊ฐ ํจ๊ป ์ ์๋์ด์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
3.3.2 http URL
โฆ
If the port is empty or not given, port 80 is assumed. The semantics are that the identified resource is located at the server listening for TCP connections on that port of that host, and the Request-URI for the resource is abs_path (section 5.1.2).
โฆ
๊ทธ๋ฌ๋ ๋ง์ฝ https://google.com:443
๊ณผ ๊ฐ์ด ์ถ์ฒ์ ํฌํธ ๋ฒํธ๊ฐ ๋ช
์์ ์ผ๋ก ํฌํจ๋์ด ์๋ค๋ฉด ์ด ํฌํธ ๋ฒํธ๊น์ง ๋ชจ๋ ์ผ์นํด์ผ ๊ฐ์ ์ถ์ฒ๋ผ๊ณ ์ธ์ ๋๋ค. ํ์ง๋ง ์ด ์ผ์ด์ค์ ๋ํ ๋ช
ํํ ์ ์๊ฐ ํ์ค์ผ๋ก ์ ํด์ง ๊ฒ์ ์๋๊ธฐ ๋๋ฌธ์, ๋ ์ ํํ ์ด์ผ๊ธฐํ์๋ฉด ์ด๋ค ๊ฒฝ์ฐ์๋ ๊ฐ์ ์ถ์ฒ, ๋ ์ด๋ค ๊ฒฝ์ฐ์๋ ๋ค๋ฅธ ์ถ์ฒ๋ก ํ๋จ๋ ์๋ ์๋ค. (์ง๋ฆฌ์ ์ผ๋ฐ์ผ)
์ฐ๋ฆฌ๋ ๋ธ๋ผ์ฐ์ ์ ๊ฐ๋ฐ์ ๋๊ตฌ์ ์ฝ์์์ Location
๊ฐ์ฒด๊ฐ ๊ฐ์ง๊ณ ์๋ origin
ํ๋กํผํฐ์ ์ ๊ทผํจ์ผ๋ก์จ ์ ์ฝ๊ฒ ์ดํ๋ฆฌ์ผ์ด์
์ด ์คํ๋๊ณ ์๋ ์ถ์ฒ๋ฅผ ์์๋ผ ์๋ ์๋ค.
console.log(location.origin);
"https://evan-moon.github.io"
SOP(Same-Origin Policy)
์น ์ํ๊ณ์๋ ๋ค๋ฅธ ์ถ์ฒ๋ก์ ๋ฆฌ์์ค ์์ฒญ์ ์ ํํ๋ ๊ฒ๊ณผ ๊ด๋ จ๋ ๋ ๊ฐ์ง ์ ์ฑ
์ด ์กด์ฌํ๋ค. ํ ๊ฐ์ง๋ ์ด ํฌ์คํ
์ ์ฃผ์ ์ธ CORS, ๊ทธ๋ฆฌ๊ณ ๋ ํ ๊ฐ์ง๋ SOP(Same-Origin Policy)
์ด๋ค.
SOP๋ ์ง๋ 2011๋ , RFC 6454์์ ์ฒ์ ๋ฑ์ฅํ ๋ณด์ ์ ์ฑ ์ผ๋ก ๋ง ๊ทธ๋๋ก โ๊ฐ์ ์ถ์ฒ์์๋ง ๋ฆฌ์์ค๋ฅผ ๊ณต์ ํ ์ ์๋คโ๋ผ๋ ๊ท์น์ ๊ฐ์ง ์ ์ฑ ์ด๋ค.
๊ทธ๋ฌ๋ ์น์ด๋ผ๋ ์คํ์คํ์ด์ค ํ๊ฒฝ์์ ๋ค๋ฅธ ์ถ์ฒ์ ์๋ ๋ฆฌ์์ค๋ฅผ ๊ฐ์ ธ์์ ์ฌ์ฉํ๋ ์ผ์ ๊ต์ฅํ ํํ ์ผ์ด๋ผ ๋ฌด์์ ๋ง์ ์๋ ์๋ ๋ ธ๋ฆ์ด๋ ๋ช ๊ฐ์ง ์์ธ ์กฐํญ์ ๋๊ณ ์ด ์กฐํญ์ ํด๋นํ๋ ๋ฆฌ์์ค ์์ฒญ์ ์ถ์ฒ๊ฐ ๋ค๋ฅด๋๋ผ๋ ํ์ฉํ๊ธฐ๋ก ํ๋๋ฐ, ๊ทธ ์ค ํ๋๊ฐ โCORS ์ ์ฑ ์ ์งํจ ๋ฆฌ์์ค ์์ฒญโ์ด๋ค. (์ฐธ๊ณ ๋ก CORS๋ผ๋ ์ด๋ฆ์ด ์ฒ์ ๋ฑ์ฅํ ๊ฒ์ 2009๋ ์ด๋ผ, SOP์ ๋ฑ์ฅ๋ณด๋ค ๋น ๋ฅด๋ค)
Access to network resources varies depending on whether the resources are in the same origin as the content attempting to access them.
Generally, reading information from another origin is forbidden. However, an origin is permitted to use some kinds of resources retrieved from other origins. For example, an origin is permitted to execute script, render images, and apply style sheets from any origin. Likewise, an origin can display content from another origin, such as an HTML document in an HTML frame. Network resources can also opt into letting other origins read their information, for example, using Cross-Origin Resource Sharing.
์ฐ๋ฆฌ๊ฐ ๋ค๋ฅธ ์ถ์ฒ๋ก ๋ฆฌ์์ค๋ฅผ ์์ฒญํ๋ค๋ฉด SOP ์ ์ฑ ์ ์๋ฐํ ๊ฒ์ด ๋๊ณ , ๊ฑฐ๊ธฐ๋ค๊ฐ SOP์ ์์ธ ์กฐํญ์ธ CORS ์ ์ฑ ๊น์ง ์งํค์ง ์๋๋ค๋ฉด ์์ ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ ๊ฒ์ด๋ค.
์ฆ, ์ด๋ ๊ฒ ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ ํํ๋ ํ์๋ ํ๋์ ์ ์ฑ ๋ง์ผ๋ก ๊ฒฐ์ ๋ ์ฌํญ์ด ์๋๋ผ๋ ์๋ฏธ๊ฐ ๋๋ฉฐ, SOP์์ ์ ์๋ ์์ธ ์กฐํญ๊ณผ CORS๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ผ์ด์ค๋ค์ด ๋ง๋ฌผ๋ฆฌ์ง ์์ ๊ฒฝ์ฐ์๋ ์์ ๋ฆฌ์์ค ์์ฒญ์ ํ ์ ์๋ ์ผ์ด์ค๋ ์กด์ฌํ ์ ์๋ค.
๊ทผ๋ฐ ์ ์ด๋ ๊ฒ ๊ท์ฐฎ์ ์ ์ฑ ์ ๋ง๋ค์ด์ ๊ฐ๋ฐ์๋ค์ ๊ดด๋กญํ๋ ๊ฒ์ผ๊น? ์ด์ฐจํผ ๊ฐ๋ฐ์๋ ์ ํด์ง ์๋ฒํ๊ณ ๋ง ํต์ ์ ํ๋๋ก ์ดํ๋ฆฌ์ผ์ด์ ์ ์์ฑํ ํ ๋ฐ ๋ง์ด๋ค.
ํ์ง๋ง ์ ์๊ฐํด๋ณด๋ฉด ์ด๋ ๊ฒ ์ถ์ฒ๊ฐ ๋ค๋ฅธ ๋ ๊ฐ์ ์ดํ๋ฆฌ์ผ์ด์ ์ด ๋ง์๋๋ก ์ํตํ ์ ์๋ ํ๊ฒฝ์ ๊ฝค ์ํํ ํ๊ฒฝ์ด๋ค.
์ ์ด์ ํด๋ผ์ด์ธํธ ์ดํ๋ฆฌ์ผ์ด์ , ํนํ๋ ์น์์ ๋์๊ฐ๋ ํด๋ผ์ด์ธํธ ์ดํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉ์์ ๊ณต๊ฒฉ์ ๋๋ฌด๋๋ ์ทจ์ฝํ ์น๊ตฌ๋ผ๋ ์ฌ์ค์ ์์ง๋ง์. ๋น์ฅ ๋ธ๋ผ์ฐ์ ์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ง ์ด์ด๋ DOM์ด ์ด๋ป๊ฒ ์์ฑ๋์ด์๋์ง, ์ด๋ค ์๋ฒ์ ํต์ ํ๋์ง, ๋ฆฌ์์ค์ ์ถ์ฒ๋ ์ด๋์ธ์ง์ ๊ฐ์ ๊ฐ์ข ์ ๋ณด๋ค์ ์๋ฌด๋ฐ ์ ์ฌ์์ด ์ด๋ํ ์ ์์ง ์์๊ฐ?
์ต๊ทผ์๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ค ์ฝ๋๋ฅผ ๋๋
ํํด์ ์ฝ๊ธฐ ์ด๋ ต๋ค๊ณ ํ์ง๋ง, ๋๋
ํ๋ ์ด๋๊น์ง๋ ๋๋
ํ์ผ ๋ฟ์ด์ง ์ํธํ๊ฐ ์๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ฌด๋ฆฌ ๋๋
ํ๋์ด์๋ค๊ณ ํด๋ ์ฌ๋์ด ๋ฐ๋ก ์ดํดํ ์ ์๋ ์ ๋๋ ์๋๋ฐ๋ค๊ฐ, ์์ค ์ฝ๋๋ฅผ ์ง์ ๋ณผ ์ ์๋ค๋ ๊ฒ ์์ฒด๊ฐ ๋ณด์์ ์ผ๋ก ์๋นํ ์ทจ์ฝํ ๋ถ๋ถ์ด๋ค. ์ฌ์ง์ด ์์ง๊น์ง๋ ์์ค ์ฝ๋์ ๋๋
ํ๊ฐ ์๋์ด ๊ฐ๋ฐ์ ๋๊ตฌ๋ง ์ด๋ฉด <script>
ํ๊ทธ ์์ ๋ ๊ฒ ๊ทธ๋๋ก์ ์์ค ์ฝ๋๊ฐ ๋กํ๋ ๋
ธ์ถ๋๋ ์ฌ์ดํธ๋ค๋ ๋ง๋ค.
์ด๋ฐ ์ํฉ ์์์ ๋ค๋ฅธ ์ถ์ฒ์ ์ดํ๋ฆฌ์ผ์ด์ ์ด ์๋ก ํต์ ํ๋ ๊ฒ์ ๋ํด ์๋ฌด๋ฐ ์ ์ฝ๋ ์กด์ฌํ์ง ์๋๋ค๋ฉด, ์ ์๋ฅผ ๊ฐ์ง ์ฌ์ฉ์๊ฐ ์์ค ์ฝ๋๋ฅผ ์ฑ ๊ตฌ๊ฒฝํ ํ CSRF(Cross-Site Request Forgery)๋ XSS(Cross-Site Scripting)์ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ๋ถ์ ์ดํ๋ฆฌ์ผ์ด์ ์์ ์ฝ๋๊ฐ ์คํ๋ ๊ฒ์ฒ๋ผ ๊พธ๋ฉฐ์ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ํ์ทจํ๊ธฐ๊ฐ ๋๋ฌด๋๋ ์ฌ์์ง๋ค. (๊ทธ๋ฆฌ๊ณ ๊ฐ๋ฐ์๊ฐ ์ ๊ฒฝ์จ์ผ ํ ์ผ์ ๋ ๋ง์์ง๋คโฆ)
์, ์ง๊ธ๊น์ง ๊ณ์ ๊ฐ์ ์ถ์ฒ, ๋ค๋ฅธ ์ถ์ฒ์ ๋ํ ์ด์ผ๊ธฐ๋ฅผ ์ค์ฌ์ผ๋ก ํฌ์คํ ์ ํ์ด๋๊ฐ๊ณ ์๋๋ฐ, ๊ทธ๋ ๋ค๋ฉด ์ ํํ ์ด๋ค ๊ฒฝ์ฐ์ ์ถ์ฒ๊ฐ ๊ฐ๋ค๊ณ ํ๋จํ๊ณ , ์ด๋ค ๊ฒฝ์ฐ์ ์ถ์ฒ๊ฐ ๋ค๋ฅด๋ค๊ณ ํ๋จํ๋ ๊ฒ์ผ๊น?
๊ฐ์ ์ถ์ฒ์ ๋ค๋ฅธ ์ถ์ฒ์ ๊ตฌ๋ถ
์ฌ์ค ๋ ๊ฐ์ ์ถ์ฒ๊ฐ ์๋ก ๊ฐ๋ค๊ณ ํ๋จํ๋ ๋ก์ง ์์ฒด๋ ๊ต์ฅํ ๊ฐ๋จํ๋ฐ, ๋ URL์ ๊ตฌ์ฑ ์์ ์ค Scheme
, Host
, Port
, ์ด 3๊ฐ์ง๋ง ๋์ผํ๋ฉด ๋๋ค.
https://evan-moon.github.io:80
๋ผ๋ ์ถ์ฒ๋ฅผ ์๋ก ๋ค๋ฉด https://
์ด๋ผ๋ ์คํด์ evan-moon.github.io
ํธ์คํธ๋ฅผ ๊ฐ์ง๊ณ :80
๋ฒ ํฌํธ๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ ๊ฒ๋ง ๊ฐ๋ค๋ฉด ๋๋จธ์ง๋ ์ ๋ถ ๋ค๋ฅด๋๋ผ๋ ๊ฐ์ ์ถ์ฒ๋ก ์ธ์ ์ด ๋๋ค๋ ๊ฒ์ด๋ค.
ํ์์ ๋ธ๋ก๊ทธ ์ถ์ฒ์ธ https://evan-moon.github.io
์ ๊ฐ์ ์ถ์ฒ๋ก ์ธ์ ๋๋ ์์๋ ๋๋ต ์ด๋ฐ ๋๋์ด๋ค.
URL | ๊ฐ์ ์ถ์ฒ | ์ด์ |
---|---|---|
https://evan-moon.github.io/about | O | ์คํด, ํธ์คํธ, ํฌํธ๊ฐ ๋์ผ |
https://evan-moon.github.io/about?q=์๋ฝ | O | ์คํด, ํธ์คํธ, ํฌํธ๊ฐ ๋์ผ |
https://user:password@evan-moon.github.io | O | ์คํด, ํธ์คํธ, ํฌํธ๊ฐ ๋์ผ |
http://evan-moon.github.io | X | ์คํด์ด ๋ค๋ฆ |
https://api.github.io | X | ํธ์คํธ๊ฐ ๋ค๋ฆ |
https://evan-moon.naver.com | X | ํธ์คํธ๊ฐ ๋ค๋ฆ |
https://evan-moon.github.com | X | ํธ์คํธ๊ฐ ๋ค๋ฆ |
https://evan-moon.github.io:8000 | ? | ๋ธ๋ผ์ฐ์ ์ ๊ตฌํ์ ๋ฐ๋ผ ๋ค๋ฆ |
๋งจ ๋ง์ง๋ง์ ์๋ ์ผ์ด์ค์ ๊ฒฝ์ฐ, ๋ง์ฝ ์ถ์ฒ์ https://evan-moon.github.io:80
์ฒ๋ผ ํฌํธ ๋ฒํธ๊ฐ ๋ช
์๋์ด ์๋ค๋ฉด ๋ช
๋ฐฑํ๊ฒ ๋ค๋ฅธ ์ถ์ฒ๋ก ์ธ์ ๋๋ ๋ถ๋ถ์ด์ง๋ง, ์์๋ก ๋ ์ถ์ฒ์ ๊ฒฝ์ฐ ํฌํธ ๋ฒํธ๊ฐ ํฌํจ๋์ง ์์๊ธฐ ๋๋ฌธ์ ํ๋จํ๊ธฐ๊ฐ ์ ๋งคํ๋ค. RFC 6454์ Comparing Origins ์น์
์๋ โ๋ง์ฝ ์ถ์ฒ๊ฐ ์คํด/ํธ์คํธ/ํฌํธ์ ์ผ์ค ์ฒด๊ณ๋ผ๋ฉดโฆโ ์ด๋ผ๋ ์ ์ ๊ฐ ๋ถ์ด์๊ธฐ ๋๋ฌธ์ ์ด๋ป๊ฒ ํด์ํ๋์ ๋ฐ๋ผ ๊ตฌํ์ด ๋ฌ๋ผ์ง ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋์ ์ด๋ฐ ๊ฒฝ์ฐ์๋ ๊ฐ ๋ธ๋ผ์ฐ์ ๋ค์ ๋ ์์ ์ธ ์ถ์ฒ ๋น๊ต ๋ก์ง์ ๋ฐ๋ผ๊ฐ๊ฒ ๋๋ค.
그러니 이제 그만 관짝으로 보내주도록 하자
[출처] memdroid
์ฌ๊ธฐ์ ์ค์ํ ์ฌ์ค ํ ๊ฐ์ง๋ ์ด๋ ๊ฒ ์ถ์ฒ๋ฅผ ๋น๊ตํ๋ ๋ก์ง์ด ์๋ฒ์ ๊ตฌํ๋ ์คํ์ด ์๋๋ผ ๋ธ๋ผ์ฐ์ ์ ๊ตฌํ๋์ด ์๋ ์คํ์ด๋ผ๋ ๊ฒ์ด๋ค.
๋ง์ฝ ์ฐ๋ฆฌ๊ฐ CORS ์ ์ฑ ์ ์๋ฐํ๋ ๋ฆฌ์์ค ์์ฒญ์ ํ๋๋ผ๋ ํด๋น ์๋ฒ๊ฐ ๊ฐ์ ์ถ์ฒ์์ ๋ณด๋ธ ์์ฒญ๋ง ๋ฐ๊ฒ ๋ค๋ ๋ก์ง์ ๊ฐ์ง๊ณ ์๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด ์๋ฒ๋ ์ ์์ ์ผ๋ก ์๋ต์ ํ๊ณ , ์ดํ ๋ธ๋ผ์ฐ์ ๊ฐ ์ด ์๋ต์ ๋ถ์ํด์ CORS ์ ์ฑ ์๋ฐ์ด๋ผ๊ณ ํ๋จ๋๋ฉด ๊ทธ ์๋ต์ ์ฌ์ฉํ์ง ์๊ณ ๊ทธ๋ฅ ๋ฒ๋ฆฌ๋ ์์์ธ ๊ฒ์ด๋ค.
์ฆ, CORS๋ ๋ธ๋ผ์ฐ์ ์ ๊ตฌํ ์คํ์ ํฌํจ๋๋ ์ ์ฑ ์ด๊ธฐ ๋๋ฌธ์, ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํ์ง ์๊ณ ์๋ฒ ๊ฐ ํต์ ์ ํ ๋๋ ์ด ์ ์ฑ ์ด ์ ์ฉ๋์ง ์๋๋ค. ๋ํ CORS ์ ์ฑ ์ ์๋ฐํ๋ ๋ฆฌ์์ค ์์ฒญ ๋๋ฌธ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค๊ณ ํด๋ ์๋ฒ ์ชฝ ๋ก๊ทธ์๋ ์ ์์ ์ผ๋ก ์๋ต์ ํ๋ค๋ ๋ก๊ทธ๋ง ๋จ๊ธฐ ๋๋ฌธ์, CORS๊ฐ ๋์๊ฐ๋ ๋ฐฉ์์ ์ ํํ ๋ชจ๋ฅด๋ฉด ์๋ฌ ํธ๋ ์ด์ฑ์ ๋ํญ์ ๊ฒช์ ์๋ ์๋ค.
CORS๋ ์ด๋ป๊ฒ ๋์ํ๋์?
๊ทธ๋ผ ๋ณธ๊ฒฉ์ ์ผ๋ก ์ด๋ค ๋ฐฉ๋ฒ์ ํตํด ์๋ก ๋ค๋ฅธ ์ถ์ฒ๋ฅผ ๊ฐ์ง ๋ฆฌ์์ค๋ฅผ ์์ ํ๊ฒ ์ฌ์ฉํ ์ ์๋์ง ์์๋ณด๋๋ก ํ์.
๊ธฐ๋ณธ์ ์ผ๋ก ์น ํด๋ผ์ด์ธํธ ์ดํ๋ฆฌ์ผ์ด์
์ด ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ ๋๋ HTTP ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ฌ ์์ฒญ์ ๋ณด๋ด๊ฒ ๋๋๋ฐ, ์ด๋ ๋ธ๋ผ์ฐ์ ๋ ์์ฒญ ํค๋์ Origin
์ด๋ผ๋ ํ๋์ ์์ฒญ์ ๋ณด๋ด๋ ์ถ์ฒ๋ฅผ ํจ๊ป ๋ด์๋ณด๋ธ๋ค.
Origin: https://evan-moon.github.io
์ดํ ์๋ฒ๊ฐ ์ด ์์ฒญ์ ๋ํ ์๋ต์ ํ ๋ ์๋ต ํค๋์ Access-Control-Allow-Origin
์ด๋ผ๋ ๊ฐ์ โ์ด ๋ฆฌ์์ค๋ฅผ ์ ๊ทผํ๋ ๊ฒ์ด ํ์ฉ๋ ์ถ์ฒโ๋ฅผ ๋ด๋ ค์ฃผ๊ณ , ์ดํ ์๋ต์ ๋ฐ์ ๋ธ๋ผ์ฐ์ ๋ ์์ ์ด ๋ณด๋๋ ์์ฒญ์ Origin
๊ณผ ์๋ฒ๊ฐ ๋ณด๋ด์ค ์๋ต์ Access-Control-Allow-Origin
์ ๋น๊ตํด๋ณธ ํ ์ด ์๋ต์ด ์ ํจํ ์๋ต์ธ์ง ์๋์ง๋ฅผ ๊ฒฐ์ ํ๋ค.
๊ธฐ๋ณธ์ ์ธ ํ๋ฆ์ ์ด๋ ๊ฒ ๊ฐ๋จํ์ง๋ง, ์ฌ์ค CORS๊ฐ ๋์ํ๋ ๋ฐฉ์์ ํ ๊ฐ์ง๊ฐ ์๋๋ผ ์ธ ๊ฐ์ง์ ์๋๋ฆฌ์ค์ ๋ฐ๋ผ ๋ณ๊ฒฝ๋๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ๋ถ์ ์์ฒญ์ด ์ด๋ค ์๋๋ฆฌ์ค์ ํด๋น๋๋์ง ์ ํ์ ํ๋ค๋ฉด CORS ์ ์ฑ ์๋ฐ์ผ๋ก ์ธํ ์๋ฌ๋ฅผ ๊ณ ์น๋ ๊ฒ์ด ํ๊ฒฐ ์ฌ์ธ ๊ฒ์ด๋ค.
Preflight 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 ์ ์ฑ ์๋ฐ ์ฌ๋ถ๋ฅผ ๊ฒ์ฌํ๊ธฐ๋ ํ๋ค.
Simple Request
์ด ์๋๋ฆฌ์ค์ ๋ํ ์ ์ ๋ช
์นญ์ ์์ง๋ง MDN์ CORS ๋ฌธ์์์๋ ์ด ์๋๋ฆฌ์ค๋ฅผ Simple Request๋ผ๊ณ ๋ถ๋ฅด๊ณ ์์ผ๋, ํ์๋ ๊ทธ๋ฅ ๋จ์ ์์ฒญ(Simple Request)
์ด๋ผ๊ณ ๋ถ๋ฅด๋๋ก ํ๊ฒ ๋ค.
๋จ์ ์์ฒญ์ ์๋น ์์ฒญ์ ๋ณด๋ด์ง ์๊ณ ๋ฐ๋ก ์๋ฒ์๊ฒ ๋ณธ ์์ฒญ๋ถํฐ ๋๋ ค๋ฐ์ ํ, ์๋ฒ๊ฐ ์ด์ ๋ํ ์๋ต์ ํค๋์ 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
์ปจํ
์ธ ํ์
์ ๊ฐ์ง๋๋ก ์ค๊ณ๋๊ธฐ ๋๋ฌธ์ ์ฌ์ค ์ ์ด ์กฐ๊ฑด๋ค์ ๋ชจ๋ ๋ง์กฑ์ํค๋ ์ํฉ์ ๋ง๋ค๊ธฐ๋ ๊ทธ๋ ๊ฒ ์ฝ์ง ์์ ๊ฒ์ด ํ์ค์ด๋ค.
Credentialed Request
3๋ฒ์งธ ์๋๋ฆฌ์ค๋ ์ธ์ฆ๋ ์์ฒญ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ด ์๋๋ฆฌ์ค๋ CORS์ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ์์ด๋ผ๊ธฐ ๋ณด๋ค๋ ๋ค๋ฅธ ์ถ์ฒ ๊ฐ ํต์ ์์ ์ข ๋ ๋ณด์์ ๊ฐํํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๋ธ๋ผ์ฐ์ ๊ฐ ์ ๊ณตํ๋ ๋น๋๊ธฐ ๋ฆฌ์์ค ์์ฒญ API์ธ XMLHttpRequest
๊ฐ์ฒด๋ fetch
API๋ ๋ณ๋์ ์ต์
์์ด ๋ธ๋ผ์ฐ์ ์ ์ฟ ํค ์ ๋ณด๋ ์ธ์ฆ๊ณผ ๊ด๋ จ๋ ํค๋๋ฅผ ํจ๋ถ๋ก ์์ฒญ์ ๋ด์ง ์๋๋ค. ์ด๋ ์์ฒญ์ ์ธ์ฆ๊ณผ ๊ด๋ จ๋ ์ ๋ณด๋ฅผ ๋ด์ ์ ์๊ฒ ํด์ฃผ๋ ์ต์
์ด ๋ฐ๋ก credentials
์ต์
์ด๋ค.
์ด ์ต์ ์๋ ์ด 3๊ฐ์ง์ ๊ฐ์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ๊ฐ ๊ฐ๋ค์ด ๊ฐ์ง๋ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ๋ค.
์ต์ ๊ฐ | ์ค๋ช |
---|---|
same-origin (๊ธฐ๋ณธ๊ฐ) | ๊ฐ์ ์ถ์ฒ ๊ฐ ์์ฒญ์๋ง ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ด์ ์ ์๋ค |
include | ๋ชจ๋ ์์ฒญ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ด์ ์ ์๋ค |
omit | ๋ชจ๋ ์์ฒญ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ด์ง ์๋๋ค |
๋ง์ฝ ์ฌ๋ฌ๋ถ์ด same-origin
์ด๋ include
์ ๊ฐ์ ์ต์
์ ์ฌ์ฉํ์ฌ ๋ฆฌ์์ค ์์ฒญ์ ์ธ์ฆ ์ ๋ณด๊ฐ ํฌํจ๋๋ค๋ฉด, ์ด์ ๋ธ๋ผ์ฐ์ ๋ ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ ๋ ๋จ์ํ Access-Control-Allow-Origin
๋ง ํ์ธํ๋ ๊ฒ์ด ์๋๋ผ ์ข ๋ ๋นก๋นกํ ๊ฒ์ฌ ์กฐ๊ฑด์ ์ถ๊ฐํ๊ฒ ๋๋ค.
๋ฐฑ๋ฌธ์ด๋ถ์ฌ์ผ๊ฒฌ์ด๋ ํ์๊ฐ ์ง๊ธ ์ด ํฌ์คํ ์ ์์ฑํ๊ณ ์๋ ๋ก์ปฌ ํ๊ฒฝ๊ณผ ํ์์ ๋ธ๋ก๊ทธ๋ฅผ ํธ์คํ ํ๊ณ ์๋ Github ์๋ฒ์์ ํต์ ์ ํตํด, ์ด๋ค ์ ์ฝ์ด ์ถ๊ฐ๋์๋์ง ์ง์ ์ดํด๋ณด๋ ๊ฒ์ด ์ข์ ๊ฒ ๊ฐ๋ค.
ํ์์ ๋ธ๋ก๊ทธ๋ 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://evan-moon.github.io
๋ก ๋ณด๋ด๋ ๋ฆฌ์์ค ์์ฒญ์๋ ๋น์ฐํ ๋ธ๋ผ์ฐ์ ์ ์ฟ ํค์ ๊ฐ์ ์ธ์ฆ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์์ง ์๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ธ๋ผ์ฐ์ ๋ ๋จ์ํ Access-Control-Allow-Origin: *
์ด๋ผ๋ ๊ฐ๋ง ๋ณด๊ณ โ์ด ์์ฒญ์ ์์ ํ๊ตฌ๋งโ์ด๋ผ๋ ๊ฒฐ๋ก ์ ๋ด๋ฆฌ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ ํ์๊ฐ credentials
์ต์
์ ๋ชจ๋ ์์ฒญ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ํฌํจํ๊ฒ ๋ค๋ ์๋ฏธ๋ฅผ ๊ฐ์ง 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๋ฅผ ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ
์ง๊ธ๊น์ง CORS๊ฐ ๋ฌด์์ธ์ง, ์ด๋ค ์ํฉ์์ CORS ์ ์ฑ ์ด ์ ์ฉ๋๊ณ ์๋ฐ๋๋ ๊ฒ์ธ์ง ์์๋ดค๋ค๋ฉด ์ด๋ฒ ์น์ ์์๋ ์ค์ง์ ์ผ๋ก CORS ์ ์ฑ ์๋ฐ์ผ๋ก ์ธํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๊ฒฝ์ฐ์ ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ์ ์์๋ณด๋๋ก ํ์.
Access-Control-Allow-Origin ์ธํ ํ๊ธฐ
CORS ์ ์ฑ
์๋ฐ์ผ๋ก ์ธํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฐ์ฅ ๋ํ์ ์ธ ๋ฐฉ๋ฒ์, ๊ทธ๋ฅ ์ ์๋๋ก ์๋ฒ์์ Access-Control-Allow-Origin
ํค๋์ ์๋ง์ ๊ฐ์ ์ธํ
ํด์ฃผ๋ ๊ฒ์ด๋ค.
์ด๋ ์์ผ๋์นด๋์ธ *
์ ์ฌ์ฉํ์ฌ ์ด ํค๋๋ฅผ ์ธํ
ํ๊ฒ ๋๋ฉด ๋ชจ๋ ์ถ์ฒ์์ ์ค๋ ์์ฒญ์ ๋ฐ์๋จน๊ฒ ๋ค๋ ์๋ฏธ์ด๋ฏ๋ก ๋น์ฅ์ ํธํ ์ ์๊ฒ ์ง๋ง, ๋ฐ๊ฟ์ ์๊ฐํ๋ฉด ์ ์ฒด๋ ๋ชจ๋ฅด๋ ์ด์ํ ์ถ์ฒ์์ ์ค๋ ์์ฒญ๊น์ง ๋ชจ๋ ๋ฐ์๋จน๊ฒ ๋ค๋ ์คํ ๋ง์ธ๋์ ๋ค๋ฅผ ๊ฒ ์์ผ๋ฏ๋ก ๋ณด์์ ์ผ๋ก ์ฌ๊ฐํ ์ด์๊ฐ ๋ฐ์ํ ์๋ ์๋ค.
๊ทธ๋ฌ๋ ๊ฐ๊ธ์ ์ด๋ฉด ๊ท์ฐฎ๋๋ผ๋ Access-Control-Allow-Origin: https://evan.github.io
์ ๊ฐ์ด ์ถ์ฒ๋ฅผ ๋ช
์ํด์ฃผ๋๋ก ํ์.
์ด ํค๋๋ Nginx๋ Apache์ ๊ฐ์ ์๋ฒ ์์ง์ ์ค์ ์์ ์ถ๊ฐํ ์๋ ์์ง๋ง, ์๋ฌด๋๋ ๋ณต์กํ ์ธํ ์ ํ๊ธฐ๋ ๋ถํธํ๊ธฐ ๋๋ฌธ์ ์์ค ์ฝ๋ ๋ด์์ ์๋ต ๋ฏธ๋ค์จ์ด ๋ฑ์ ์ฌ์ฉํ์ฌ ์ธํ ํ๋ ๊ฒ์ ์ถ์ฒํ๋ค. Spring, Express, Django์ ๊ฐ์ด ์ด๋ฆ์๋ ๋ฐฑ์๋ ํ๋ ์์ํฌ์ ๊ฒฝ์ฐ์๋ ๋ชจ๋ CORS ๊ด๋ จ ์ค์ ์ ์ํ ์ธํ ์ด๋ ๋ฏธ๋ค์จ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตํ๊ณ ์์ผ๋ ์ธํ ์์ฒด๊ฐ ์ด๋ ต์ง๋ ์์ ๊ฒ์ด๋ค.
Webpack Dev Server๋ก ๋ฆฌ๋ฒ์ค ํ๋ก์ฑํ๊ธฐ
์ฌ์ค 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-middleware์ 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
์ ๊ฐ์ ๋น๋ ํ๊ฒฝ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ถ๊ธฐ ๋ก์ง์ ์์ฑํ๋ ๋ฐฉ๋ฒ๋ ์์ง๋ง, ๊ฐ์ธ์ ์ผ๋ก ๋น์ฆ๋์ค ๋ก์ง์ ์ด๋ฐ ๊ฐ๋ฐ ํ๊ฒฝ ์ ์ฉ ์์ค๊ฐ ํฌํจ๋๋ ๊ฒ์ ๋ณ๋ก ์ข์ง ์๋ค๊ณ ์๊ฐํด์ ํผํ๋ ํธ์ด๋ค.
์์ฒญ์ img ํ๊ทธ์ ๋ฃ์ผ๋ฉด ์ด๋จ๊น?
ํ์๋ ์์ SOP(Same-Origin Policy)
์ ์ฑ
์๋ ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์๋ ๋ช ๊ฐ์ง ์์ธ์กฐํญ์ด ์กด์ฌํ๊ณ , ๊ทธ ์ค ํ๋๊ฐ CORS ์ ์ฑ
์ ์งํจ ์์ฒญ์ด๋ผ๊ณ ์ด์ผ๊ธฐํ์๋ค. ๊ทธ๋ฆฌ๊ณ CORS ์ ์ฑ
์ ์งํจ ์์ฒญ์ ์ ์ธํ SOP์ ์์ธ ์กฐํญ์ ์คํ ๊ฐ๋ฅํ ์คํฌ๋ฆฝํธ, ๋ ๋๋ ์ด๋ฏธ์ง, ์คํ์ผ ์ํธ ์ ๋๊ฐ ์๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ค๋ฅธ ์์ธ ์กฐํญ์ด ์ ์ฉ๋ ์์ฒญ์ ๋ณด๋ด๋ฉด CORS๋ฅผ ์ฐํํ ์ ์์ง ์์๊นโฆ? ์ด๋ ๊ฒ ๋ง์ด๋ค!
<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๋ฅผ ์ฐํํ๋ ค๋ ์๋๋ ๊ทธ๋ฅ ๊น๋ํ๊ฒ ํฌ๊ธฐํ๊ณ ๋๋ํ ์์ ์จ๋ค์ด ์ํค๋ ๋๋ก CORS ์ ์ฑ ์ ์งํค๋๋ก ํ์.
๋ง์น๋ฉฐ
์๋ฌด๋๋ CORS ์ ์ฑ ์๋ฐ์ผ๋ก ์ธํด ์๊ธฐ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ ๊ฐ์ฅ ๋ฒ๊ฑฐ๋ก์ด ์ ์ ๋ฌธ์ ๋ฅผ ๊ฒช๋ ์ฌ๋๊ณผ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผํ๋ ์ฌ๋์ด ๋ค๋ฅด๋ค๋ ๊ฒ์ด๋ค.
์์ ์ด์ผ๊ธฐํ๋ฏ CORS ์ ์ฑ
์ ๋ธ๋ผ์ฐ์ ์ ๊ตฌํ ์คํ์ด๊ธฐ ๋๋ฌธ์ ์ ์ฑ
์๋ฐ์ผ๋ก ์ธํด ๋ฌธ์ ๋ฅผ ๊ฒช๋ ์ฌ๋์ ๋๋ถ๋ถ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์์ด์ง๋ง, ์ ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๋ฐฑ์๋ ๊ฐ๋ฐ์๊ฐ ์๋ฒ ์ดํ๋ฆฌ์ผ์ด์
์ ์๋ต ํค๋์ ์ฌ๋ฐ๋ฅธ Acccess-Control-Allow-Origin
์ด ๋ด๋ ค์ฌ ์ ์๋๋ก ์ธํ
ํด์ค์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฌผ๋ก ํ์๊ฐ ์ด์ผ๊ธฐํ๋ webpack-dev-server
์ ํ๋ก์ฑ ์ต์
์ ์ฌ์ฉํ์ฌ ์์ฒด์ ์ผ๋ก ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ๋ ์์ง๋ง, ์ด ๋ฐฉ๋ฒ์ ๋ก์ปฌ ๊ฐ๋ฐ ํ๊ฒฝ์์๋ง ํตํ๋ ๋ฐฉ๋ฒ์ธ๋ฐ๋ค๊ฐ, ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ตญ ์ด์ ํ๊ฒฝ์์ CORS ์ ์ฑ
์๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๋ฐฑ์๋ ๊ฐ๋ฐ์์ ๋์์ด ํ์ํ ์ ๋ฐ์ ์๋ค.
์ฌ์ค CORS ์ ์ฑ ์๋ฐ์ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ ์์ฒด๊ฐ ๊ทธ๋ ๊ฒ ์ด๋ ต๊ณ ๋ณต์กํ ํธ์ ์๋๋ผ์ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ ๋ฐฑ์๋ ๊ฐ๋ฐ์ ์ค ํ ๋ช ์ด๋ผ๋ ์ด๋ฌํ ์ ์ฑ ์ ๋ํด์ ์ ์๊ณ ์๋ ๊ฒฝ์ฐ๋ผ๋ฉด ์๊ฐ๋ณด๋ค ๋น ๋ฅด๊ณ ์์ํ๊ฒ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
๊ทธ๋ฌ๋ ํ์๊ฐ ๋ํ์ ๋ ์ฒ์ CORS ์ ์ฑ ์๋ฐ์ ๊ฒฝํํ๋ ๊ฒ์ฒ๋ผ ํ๋ก ํธ์๋์ ๋ฐฑ์๋ ๋ ๋ค ์ด๋ฐ ๋ฌธ์ ์ ๋ํ ๊ฒฝํ์ด ์๋ ๊ฒฝ์ฐ์๋ ์ข์ฒ๋ผ ๊ฐ์ ์ก๊ธฐ๊ฐ ํ๋ , ์ฐธ ๋ฌํ ๋ฌธ์ ์ธ ๊ฒ ๊ฐ๋ค.
์ด์์ผ๋ก CORS๋ ์ ์ด๋ ๊ฒ ์ฐ๋ฆฌ๋ฅผ ํ๋ค๊ฒ ํ๋๊ฑธ๊น? ํฌ์คํ ์ ๋ง์น๋ค.
- CORS
- Cross-Origin Resource Sharing
- ๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์
- ๋คํธ์ํฌ
- Web
- ๋ณด์ ์ ์ฑ
- Access-Control-Allow-Origin