๐จ Access to XMLHttpRequest at 'https://api.test.com/auth/token' from origin 'http://localhost:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
์ฝ์์์ ์๊ฐ์ ๋นจ๊ฐ ์๋ฌ๋ฉ์ธ์ง๋ฅผ ๋ณธ ์ ์ด ๋ค๋ค ํ ๋ฒ์ฏค์ ์์ ๊ฒ ๊ฐ๋ค. CORS?? CORS๊ฐ ๋ญ๊ธธ๋, ๋ญ๊ฐ ์๋๋ค๊ณ ๋ป๊ฒ๊ฒ ์๊ธฐ์ฃผ์ฅ์ ํด๋๋ ๊ฑธ๊น?
Cross
Origin
Resource
Sharing
๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ ๋ผ๋ ๋ป์ด๋ค.
๊ทธ๋๊น ๊ทธ๊ฒ ๋ญ๋?
๋์ผํ ์ถ์ฒ๊ฐ ์๋ ๋ค๋ฅธ ์ถ์ฒ์์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๊ฒ์ ํ์ฉํ๋ ์ ์ฑ ์ด๋ค.
์ฝ๊ฒ ๋งํ์๋ฉด ์ฐ๋ฆฌ๊ฐ ์ฝ์์ฐฝ์์ ๋ง๋ CORS์๋ฌ๋ CORS ์ ์ฑ ์ ์๋ฐํ๋ค๊ณ ์๋ ค์ค ๊ฒ์ด๋ค.
๊ทธ๋ผ ์ถ์ฒ๋ ๋ญ ๋ปํ๋ ๊ฑธ๊น?
์ฌ๊ธฐ์ ์ถ์ฒ๋ ์์ฃผ ์ฝ๊ฒ ๋งํ๋ฉด URL์ฃผ์ ์ด๋ค.
๊ทธ๋ผ URL์ด ํ ์จํ๋ ์ํ๋ฆฌ๊ณ ๋๊ฐ์์ผ ๋์ผ ์ถ์ฒ๊ณ , ํ ๊ธ์๋ผ๋ ํ๋ฆฌ๋ฉด ๋ค๋ฅธ ์ถ์ฒ์ผ๊น?
์๋๋ค. URL์์ ํ๋กํ ์ฝ, ํธ์คํธ, ํฌํธ๋ฒํธ๊ฐ ๊ฐ์ผ๋ฉด ๋์ผ ์ถ์ฒ๋ผ๊ณ ํ๋ค.
์ URL์ ๊ตฌ์ฑ์์๋ณ๋ก ๋ถ๋ฆฌํ๋ฉด ์๋์ฒ๋ผ ๋๋ค.
https:// - Protocol
www.bubbletap.com - Host
/users - Path
?page=1 - Query String
์ถ์ฒ ๋ด์ ํฌํธ ๋ฒํธ๋ ์๋ต์ด ๊ฐ๋ฅํ๋ค. ๊ฐ ์น์์ ์ฌ์ฉํ๋ HTTP, HTTPS ํ๋กํ ์ฝ์ ๊ธฐ๋ณธ ํฌํธ ๋ฒํธ๊ฐ ์ ํด์ ธ์๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ง๋ง https://naver.com:123 ์ฒ๋ผ ํฌํธ ๋ฒํธ๊ฐ ๋ช ์์ ์ผ๋ก ํฌํจ๋์ด ์๋ค๋ฉด ํฌํธ ๋ฒํธ๊น์ง ์ผ์นํด์ผ ๋์ผ ์ถ์ฒ๋ก ์ธ์ ๋๋ค.
์๊พธ ๋์ผ์ถ์ฒ ๋์ผ์ถ์ฒ ๊ฑฐ๋ฆฌ๋๋ฐ ๊ทธ๋ผ ๋์ผ ์ถ์ฒ ๊ด๋ จ ์ ์ฑ ๋ ์์๊น?
SOP๋ผ๊ณ ์๋ค.
Same
Origin
Policy
๊ฐ์ ์ถ์ฒ์์๋ง ๋ฆฌ์์ค๋ฅผ ๊ณต์ ํ ์ ์๋ค ๋ผ๋ ๊ท์น์ ๊ฐ์ง ์ ์ฑ ์ด๋ค.
์? ๊ทธ๋ผ ๋ค๋ฅธ ์ถ์ฒ์์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๊ฒ์ ํ์ฉํ๋ ์ ์ฑ
์ธ CORS๋ ๋ถ๋ชํ์ง์๋? ์ค๋ ํ์ฉํ๋ค๋๋ฐ... ์๋ ๊ฐ์๋ฐ์๋ง ๊ณต์ ํ๋ผ๊ทธ๋ฌ๊ณ ... ๋์ฒด ๋๊ตฌ ๋ง์ ๋ค์ผ๋ผ๋๊ฑด์ง...
๊ฐ์ ์ถ์ฒ์์๋ง ๋ฆฌ์์ค ๊ณต์ ๊ฐ ๊ฐ๋ฅํ๋ค๋ ์ ์ฑ ์ด๊ธด ํ์ง๋ง, ์น์ด๋ผ๋ ํ๊ฒฝ์์ ๋ค๋ฅธ ์ถ์ฒ์ ์๋ ๋ฆฌ์์ค๋ฅผ ๊ฐ์ ธ์์ ์ฌ์ฉํ๋ ์ผ์ ๊ต์ฅํ ํํด์ก๊ธฐ ๋๋ฌธ์ ๋ฌด์์ ๋ง์ ์๋ ์์ผ๋ ๋ช ๊ฐ์ง ์์ธ ์กฐํญ์ ๋๊ณ ์ด ์กฐํญ์ ํด๋นํ๋ ๋ฆฌ์์ค ์์ฒญ์ ์ถ์ฒ๊ฐ ๋ค๋ฅด๋๋ผ๋ ํ์ฉํ๊ธฐ๋ก ํ๋ค.
๊ทธ ์ค ํ๋๊ฐ ๋ฐ๋ก CORS ์ ์ฑ ์ ์งํจ ๋ฆฌ์์ค ์์ฒญ์ด๋ค.
๋ค๋ฅธ ์ถ์ฒ์์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๊ฒ์ ํ์ฉํ๋ ์ ์ฑ ์ธ CORS๊ฐ SOP ์ ์ฑ ์ ์์ธ ์ ์ฑ ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
์ฐ๋ฆฌ๊ฐ ๋ค๋ฅธ ์ถ์ฒ๋ก ๋ฆฌ์์ค๋ฅผ ์์ฒญํ๋ฉด SOP ์ ์ฑ
์ ์๋ฐํ ๊ฒ์ด๊ณ ,
SOP ์์ธ ์กฐํญ์ธ CORS ์ ์ฑ
๋ง์ ์งํค์ง ์์ผ๋ฉด ์์ ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด๋ค.
์ด๋ฐ ์ ์ฑ ๋ค์ ๊น๋ค๋กญ๊ณ ๊ท์ฐฎ๊ธฐ๋งํ ๊ฑฐ๋ผ๊ณ ์๊ฐํ๋ฉด ์๋๋ค.
๋ค๋ฅธ ์ถ์ฒ์ ์ดํ๋ฆฌ์ผ์ด์
์ด ์๋ก ํต์ ํ๋ ๊ฒ์ ๋ํด ์๋ฌด๋ฐ ์ ์ฝ๋ ์กด์ฌํ์ง ์๋๋ค๋ฉด
์
์๋ฅผ ๊ฐ์ง ๋๊ตฐ๊ฐ๊ฐ CSRF(Cross-Site Request Forgery)๋ XSS(Cross-Site Scripting)์ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ํ์ทจํ๊ธฐ๊ฐ ๋๋ฌด๋๋ ์ฌ์์ง๋ค.
CORS๋ผ๋ ๋ฐฉ์ด๋ง์ด ์๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๊ฐ ์ฌ๊ธฐ์ ๊ธฐ์ ๊ฐ์ ธ์ค๋ ๋ฆฌ์์ค๊ฐ ์์ ํ๋ค๋ ์ต์ํ์ ๋ณด์ฅ์ ๋ฐ์ ์ ์๋ ๊ฒ์ด๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ ๋๋ HTTP ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ฌ ์์ฒญ์ ๋ณด๋ด๊ฒ ๋๋๋ฐ, ์ด๋ ๋ธ๋ผ์ฐ์ ๋ ์์ฒญ ํค๋์ Origin์ด๋ผ๋ ํ๋์ ์์ฒญ์ ๋ณด๋ด๋ ์ถ์ฒ๋ฅผ ํจ๊ป ๋ด์๋ณด๋ธ๋ค.
์ดํ ์๋ฒ๊ฐ ์ด ์์ฒญ์ ๋ํ ์๋ต ํค๋์ Access-Control-Allow-Origin์ด๋ผ๋ ๊ฐ์ ํ์ฉ๋ ์ถ์ฒ๊ฐ์ ๋ด๋ ค์ฃผ๊ณ , ๋ธ๋ผ์ฐ์ ๋ Origin๊ณผ ์๋ฒ๊ฐ ๋ด๋ ค์ค Access-Control-Allow-Origin์ ๋น๊ตํด ์ ํจํ ์๋ต์ธ์ง ์๋์ง ๊ฒฐ์ ํ๋ค.
์ด๊ฑด ๊ธฐ๋ณธ์ ์ธ ํ๋ฆ์ด๊ณ , CORS๊ฐ ๋์ํ๋ ๋ฐฉ์์ 3๊ฐ์ง ์๋๋ฆฌ์ค์ ๋ฐ๋ผ ๋ณ๊ฒฝ๋๋ค.
- Preflight Request
์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ฅ ์์ฃผ ๋ง์ถ์ง๋ ์๋๋ฆฌ์ค๋ก, ์ด๋ฆ์ฒ๋ผ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋น ์์ฒญ๊ณผ ๋ณธ ์์ฒญ์ผ๋ก ๋๋์ด์ ์๋ฒ๋ก ์ ์กํ๋ ๋ฐฉ์์ด๋ค. ๋ธ๋ผ์ฐ์ ์ค์ค๋ก ์ด ์์ฒญ์ด ์์ ํ์ง ํ์ธํ๋ ๊ฒ์ด๋ค. ์ฌ๊ธฐ์ ์๋น ์์ฒญ์ Preflight๋ผ๊ณ ๋ถ๋ฅด๊ณ , ์๋น ์์ฒญ์๋ HTTP ๋ฉ์๋ ์ค OPTION ๋ฉ์๋๊ฐ ์ฌ์ฉ๋๋ค.
1. fetch ๋ช
๋ น
2. ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ์๊ฒ ์๋น ์์ฒญ์ ๋ณด๋
3. ์๋ฒ๊ฐ ํ์ฉ ๋๋ ๊ธ์ง ์ ๋ณด๋ฅผ ์๋ต ํค๋์ ๋ด์ ๋ธ๋ผ์ฐ์ ์๊ฒ ์๋ต
4. ๋ธ๋ผ์ฐ์ ๊ฐ ์์ ์ด ๋ณด๋ธ ์๋น ์์ฒญ๊ณผ ์๋ฒ๊ฐ ์๋ตํด์ค ํ์ฉ ์ ์ฑ
์ ๋น๊ตํด ์์ ํ๋ค๊ณ ํ๋จ๋๋ฉด ๋ณธ ์์ฒญ์ ๋ณด๋
5. ์๋ฒ๊ฐ ๋ณธ ์์ฒญ์ ๋ํด ์๋ต
6. ๋ธ๋ผ์ฐ์ ๊ฐ ์ต์ข
์ ์ผ๋ก ์๋ต ๋ฐ์ดํฐ๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ์๊ฒ ๋๊ฒจ์ค
๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ด๋ ๊ฒ ์๋น ์์ฒญ, ๋ณธ ์์ฒญ์ ๋๋์ด ๋ณด๋ด๋ ํ๋ฆฌํ๋ผ์ดํธ ๋ฐฉ์์ ์ฌ์ฉํ๊ธฐ๋ ํ์ง๋ง, ๋ชจ๋ ์ํฉ์์ ์ด๋ ๊ฒ ๋ ๋ฒ์ฉ ์์ฒญ์ ๋ณด๋ด๋ ๊ฒ์ ์๋๋ค. ์ด๋ค ๊ฒฝ์ฐ์๋ ์๋น ์์ฒญ์์ด ๋ณธ ์์ฒญ๋ง์ผ๋ก ๊ฒ์ฌํ๊ธฐ๋ ํ๋ค. ๊ทธ ๊ฒฝ์ฐ์ ๋ฐฉ์์ ์๋์์ ์ดํด๋ณด๋๋ก ํ์.
- Simple Request
์ ์ ๋ช ์นญ์ ์๋์ง๋ง MDN ๋ฌธ์์์ Simple Request๋ผ๊ณ ๋ถ๋ฅด๊ณ ์๋ค.
์๋น ์์ฒญ์ ๋ณด๋ด์ง ์๊ณ ์๋ฒ์๊ฒ ๋ณธ ์์ฒญ๋ง ๋ณด๋ธ ๋ค, ์๋ฒ๊ฐ ์ด์ ๋ํ ์๋ต ํค๋์ Access-Control-Allow-Origin๊ณผ ๊ฐ์ ๊ฐ์ ๋ณด๋ด์ฃผ๋ฉด, ๊ทธ ๋ ๋ธ๋ผ์ฐ์ ๊ฐ CORS ์ ์ฑ ์๋ฐ ์ฌ๋ถ๋ฅผ ๊ฒ์ฌํ๋ ๋ฐฉ์์ด๋ค.
1๋ฒ ํ๋ฆฌํ๋ผ์ดํธ ๋ฐฉ์๊ณผ ์๋น ์์ฒญ ์ ๋ฌด๋ง ๋ค๋ฅด๋ค.
์ค? ๊ทธ๋ผ ์๋น์์ฒญ ๋ณด๋ด๊ธฐ ๊ท์ฐฎ์ํ ๋ฐ ํญ์ ์ด๋ ๊ฒ ํ๋ฉด ๋๋๊ฑฐ ์๋๊ฐ?
์๋ฌด๋๋ ๊ฐ๋ฅํ ๊ฑด ์๋๊ณ ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ ์์๋ง ์๋น ์์ฒญ ์๋ต์ด ๊ฐ๋ฅํ๋ค.
๊ทธ ์กฐ๊ฑด์ 3๊ฐ์ง์ธ๋ฐ, ๋ชจ๋ ๋ง์กฑ ์ํค๊ธฐ์๋ ์ฝ์ง ์๋ค.
1. ์์ฒญ์ ๋ฉ์๋๋ GET, HEAD, POST ์ค ํ๋์ฌ์ผ ํ๋ค.
2. Accept, Accept-Language, Content-Language, Content-Type,
DPR, Downlink, Save-Data, Viewport-Width, Width๋ฅผ ์ ์ธํ ํค๋๋ฅผ ์ฌ์ฉํ๋ฉด ์๋๋ค.
3. ๋ง์ฝ Content-Type๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ application/x-www-form-urlencoded,
multipart/form-data, text/plain๋ง ํ์ฉ๋๋ค.
๊ฐ๋ฅํ๊ฐ?
1. PUT์ด๋ DELETE ๊ฐ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ๊ฐ๋ฅํ๋ค.
2. ๋ช
์๋ ํค๋๋ค์ ์ ๋ง ๊ธฐ๋ณธ์ ์ธ ํค๋๋ค์ด๊ธฐ ๋๋ฌธ์ ๋ณต์กํ ์์ฉ ์น ์ดํ๋ฆฌ์ผ์ด์
์์ ์ด ํค๋๋ค ์ธ์
์ถ๊ฐ์ ์ธ ํค๋๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ๋ ๋งค์ฐ ์ ๋ค. Authorization ํค๋ ์กฐ์ฐจ ์ฌ์ฉํ๋ฉด ์๋๋ค.
3. ๋๋ถ๋ถ์ HTTP API๋ text/xml์ด๋ application/json ์ปจํ
์ธ ํ์
์
๊ฐ์ง๋๋ก ์ค๊ณ๋๊ธฐ ๋๋ฌธ์ ์ฌ์ค์ ์ด ์กฐ๊ฑด์ ๋ง์กฑ์ํค๋ ์ํฉ์ ๋ง๋ค๊ธฐ๋ ์ฝ์ง ์๋ค.
์์ฒ๋ผ ์กฐ๊ฑด์ด ๋ง์ด ๊น๋ค๋กญ๊ธฐ ๋๋ฌธ์ ์ ์ฐ์ง ์๋๋ค.
- Credentialed Request
์์ฒญ ํค๋์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ด์ ๋ณด๋ด๋ ๋ฐฉ์์ผ๋ก, CORS์ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ์๋ณด๋ค ๋ค๋ฅธ ์ถ์ฒ ๊ฐ ํต์ ์์ ์ข ๋ ๋ณด์์ ๊ฐํํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค. ์ด ๊ฒฝ์ฐ์๋ ํ๋ก ํธ, ์๋ฒ ์์ธก ๋ชจ๋ CORS ์ค์ ์ด ํ์ํ๋ค.
ํ๋ก ํธ ์ธก์์๋ ์์ฒญ ํค๋์ withCredentials : true
๋ฅผ, ์๋ฒ ์ธก์์๋ ์๋ต ํค๋์ Access-Control-Allow-Credentials : true
๋ฅผ ๋ฃ์ด์ค์ผ ํ๋ค.
์์ฒญ์ ์ธ์ฆ๊ณผ ๊ด๋ จ๋ ์ ๋ณด๋ฅผ ๋ด์ ์ ์๊ฒ ํด์ฃผ๋ credentials ์ต์
๊ฐ์ผ๋ก ๊ฒ์ฌ ์กฐ๊ฑด์ ์ถ๊ฐํ ์ ์๋ค.
same-origin (๊ธฐ๋ณธ๊ฐ) - ๊ฐ์ ์ถ์ฒ ๊ฐ ์์ฒญ์๋ง ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ด์ ์ ์๋ค
include - ๋ชจ๋ ์์ฒญ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ด์ ์ ์๋ค
omit - ๋ชจ๋ ์์ฒญ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ด์ง ์๋๋ค
Access-Control-Allow-Origin ๊ฐ์ผ๋ก ๋ชจ๋ ์ถ์ฒ๋ฅผ ํ์ฉํ๋ค๋ ์๋ฏธ์ธ *๋ฅผ ์ค์ ํ๋ค๋ฉด ๋ค๋ฅธ ์ถ์ฒ์์ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ ๋ CORS ์ ์ฑ
์๋ฐ์ผ๋ก ์ธํ ์ ์ฝ์ ๋ฐ์ง ์๋๋ค.
๊ทธ๋์ http://localhost:8000๊ณผ ๊ฐ์ ๋ก์ปฌ์ ๊ฐ๋ฐ ํ๊ฒฝ์์๋ fetch API๋ฅผ ์ฌ์ฉํ์ฌ ๋ง์๋๋ก ๋ฆฌ์์ค๋ฅผ ์์ฒญํ๊ฑฐ๋ ๋ฐ์์ฌ ์ ์๋ค.
ํ์ง๋ง credentials ์ต์
์ ๋ชจ๋ ์์ฒญ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ํฌํจํ๊ฒ ๋ค๋ ์๋ฏธ๋ฅผ ๊ฐ์ง include
๋ก ์ ์ฉํ๋ค๋ฉด, ์๋ฒ ์ธก์์ Access-Control-Allow-Origin ์ ์ค์ ํ ๋, *๋ก ์ค์ ํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ค๋ฃจ๋ ๋งํผ ์ถ์ฒ๋ฅผ ์ ํํ๊ฒ ์ค์ ํด์ฃผ์ด์ผํ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ธ๋ผ์ฐ์ ์ธ์ฆ ๋ชจ๋๊ฐ include์ผ ๊ฒฝ์ฐ, Access-Control-Allow-Origin์๋ *๋ฅผ ์ฌ์ฉํ ์ ์๊ณ , ๋ช ์์ ์ธ URL์ด์ด์ผํ๋ค.
Access-Control-Allow-Origin ์ค์ ํ๊ธฐ
*๋ฅผ ์ฌ์ฉํ๋ฉด ํธํ๊ธฐ์ผ ํ๊ฒ ์ง๋ง ์ด๋์ ์ค๋ ์ง๋ ๋ชจ๋ฅด๋ ์์ฒญ๊น์ง ๋ค ํ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ณด์ ์ด์๊ฐ ๋ฐ์ํ ์ ์๋ค. ๊ท์ฐฎ๋๋ผ๋ ์ถ์ฒ๋ฅผ ๋ช ์ํ๋ ๊ฒ์ด ์ข๋ค.
Webpack Dev Server๋ก ๋ฆฌ๋ฒ์ค ํ๋ก์ฑ ํ๊ธฐ.
ํ๋ก ํธ์ชฝ ๋ก์ปฌ์์ CORS ์ ์ฑ ์ ์ฐํํ๋ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
module.exports = {
devServer: {
proxy: {
'/api': {
target: 'https://api.example.com',
changeOrigin: true,
pathRewrite: { '^/api': '' },
},
}
}
}
์ด ์ฝ๋๋ฅผ ํ์ดํ๋ฉด, ๋ค์์ ์นํฉ์ด https://api.example.com์ผ๋ก ์์ฒญ์ ํ๋ก์ฑํด์ ๋ง์น CORS ์ ์ฑ ์ ์งํจ ๊ฒ์ฒ๋ผ ๋ธ๋ผ์ฐ์ ๋ฅผ ์์ด๋ ๊ฒ์ด๋ค. ์ฆ, ํ๋ก์ฑ์ ํตํด CORS ์ ์ฑ ์ ์ฐํํ๋ ๊ฒ์ด๋ค.
๋ฌผ๋ก ์ฃผ์ํด์ผํ๋ค. ํ๋ก์ ํธ๋ฅผ ๋ฐฐํฌํ๋ ๊ฒฝ์ฐ, ๋ฆฌ์กํธ๋ก ๋ง๋ ์๋น์ค์ api๊ฐ ๋์ผํ ๋๋ฉ์ธ์์ ์ ๊ณต ๋๋ ๊ฒฝ์ฐ์๋ ์ด๋๋ก ๊ณ์ ์งํํ๋ฉด ๋์ง๋ง, ๋ง์ฝ์ api์ ๋๋ฉ์ธ๊ณผ ์๋น์ค์ ๋๋ฉ์ธ์ด ๋ค๋ฅด๋ค๋ฉด ๊ธ๋ก๋ฒ baseURL์ ๋ฐ๋ก ์ค์ ํด์ฃผ์ด์ผ ํ๋ค.
API ์๋ฒ์ ์ถ์ฒ๋ https://api.example.com์ด๊ณ ํด๋ผ์ด์ธํธ ์ดํ๋ฆฌ์ผ์ด์ ์ ์๋นํ๋ ์๋ฒ์ ์ถ์ฒ๋ https://www.example.com์ด๋ผ๋ฉด
fetch('/api/test');๋ฅผ ํ์ ๋ ์๋์ ๊ฐ์ ์ด์๊ฐ ๋ฐ์ํ ์ ์๋ค.
๋ก์ปฌํ๊ฒฝ์์๋
GET https://api.example.com/test 200 OK
์ค์ ์๋ฒ
GET https://www.example.com/api/test 404 Not Found
์ด ์ด์๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด process.env.NODE_ENV์ ๊ฐ์ ๋น๋ ํ๊ฒฝ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ถ๊ธฐ ๋ก์ง์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
ํ๋ก์ ํธ๋ฅผ ๊ฐ๋ฐ ํ ๋ proxy ๋ฅผ ํ์์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ์๋์ง๋ง, ๋ง์ฝ ์ฌ์ฉํ๋ฉด ๋ฐฑ์๋ ์ชฝ์์ ๊ฐ๋ฐ์๋ฒ๋ฅผ ์ํ CORS ์ค์ ์ผ๋ก ๋ถํ์ํ ์ฝ๋ ์์ฑ์ ๋ฐฉ์งํ ์ ์์ผ๋ ๊ฝค๋ ์ ์ฉํ ๊ธฐ๋ฅ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
ํ์ง๋ง ์ด์ ํ๊ฒฝ๋ณด๋ค ๋ก์ปฌ ๊ฐ๋ฐ ํ๊ฒฝ์์ ์ฐ๊ธฐ์ ์ฉ์ดํ๊ณ , ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์๋๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ตญ ์ด์ ํ๊ฒฝ์์ CORS ์ ์ฑ ์๋ฐ ๋ฌธ์ ๋ฅผ ํ๋ก ํธ์์๋ง ํด๊ฒฐํ๊ธฐ์ ์ด๋ ค์์ด ์๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ CORS๋ ๋ฐฑ์๋์ ํ๋ก ํธ ์ด๋ ํ ์ชฝ๋ง ์ ๊ฒฝ์จ์ผ๋ ๊ฒ ์๋๋ผ, ๋ชจ๋ CORS์ ๋ํด ์ ์๊ณ ์๋ ๊ฒ์ด ์ค์ํ๋ค๊ณ ์๊ฐํ๋ค.