๋„ค์ด๋ฒ„ api๋ฅผ ์ด์šฉํ•ด ๊ฒ€์ƒ‰๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋˜ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

Access to XMLHttpRequest at 'https://openapi.naver.com/v1/search/movie.json?query=starwars&display=10' 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(Cross-origin resource sharing)๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ๊ตฌํ˜„ ์ŠคํŽ™์— ํฌํ•จ๋˜๋Š” ์ •์ฑ…์ด๋ฉฐ ๋ณด์•ˆ์ƒ ๊ฐ™์€ ํ˜ธ์ŠคํŠธ์˜ ์ •๋ณด๋งŒ ํ—ˆ์šฉํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.
๋ธŒ๋ผ์šฐ์ € ์ •์ฑ…์ด๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„-์„œ๋ฒ„๊ฐ„ ํ†ต์‹ ํ•  ๋•Œ๋Š” ๋ฌธ์ œ ๋˜์ง€ ์•Š๋Š”๋‹ค.
์ด ์˜ค๋ฅ˜๋Š” ๊ฐœ๋ฐœ์ž๋ฅผ ๋ถˆํŽธํ•˜๊ฒŒ ํ•˜๋‚˜ ์‚ฌ์‹ค ๊ณ ๋งˆ์šด ๋…€์„์ด๋‹ค.
๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค๋ฉด ๋ชป๋œ ๋งˆ์Œ์„ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž๊ฐ€ ์งˆ ๋‚˜์œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹ฌ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ ๊ทธ๊ฒƒ์„ ๊ฑธ๋Ÿฌ์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.


ํ†ต์‹ ๊ณผ์ •์„ ๊ทธ๋ฆผ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋ณด์•˜๋‹ค.

์ด ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ช‡๊ฐ€์ง€ ์ž‘์—…์„ ํ•ด์ค˜์•ผํ•œ๋‹ค.
๋’ท๋‹จ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ ์•ž๋‹จ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด์ฃผ๋Š” ๊ฒŒ ์ข‹๋‹ค๋Š”๋ฐ
ํ•„์ž๋Š” ๋ฐฑ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„ ํ”„๋ก ํŠธ์„œ๋ฒ„์—์„œ ํ”„๋ก์‹œ ์„ค์ •์„ ํ•ด์ฃผ์–ด์•ผ ํ–ˆ๋‹ค ๐Ÿ˜ข

React ์— ๋ชจ๋“ˆ์„ ํ•˜๋‚˜ ์„ค์น˜ํ•ด์ฃผ์ž

Npm I http-proxy-middleware --save๏ปฟ
src
โ”ฃ assets
โ”ƒ โ”ฃ css
โ”ƒ โ”ฃ bootstrap.css
โ”ƒ โ”ฃ reset.css
โ”ƒ โ”— style.css
โ”ฃ component
โ”ƒ โ”ฃ MovieList.js
โ”ƒ โ”— MovieSearch.js
โ”ฃ pages
โ”ƒ โ”— Main.js
โ”ฃ App.css
โ”ฃ App.js
โ”ฃ index.css
โ”ฃ index.js
โ”ฃ reportWebVitals.js
โ”ฃ setupProxy.js
โ”— setupTests.js

์ž‘์—…์ค‘์ธ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ
setupProxy.js ํŒŒ์ผ์„ src ํ•˜๋‹จ์— ์ƒ์„ฑ ํ›„ ์•„๋ž˜ ๋‚ด์šฉ ๊ทธ๋Œ€๋กœ ์ž…๋ ฅํ•ด์ค€๋‹ค.

const { createProxyMiddleware } = require('http-proxy-middleware');

module.exports = function(app){
    app.use(
        createProxyMiddleware( '/naver', { target: 'https://openapi.naver.com',
        changeOrigin: true,
        pathRewrite:{ '^/naver/':'/' }
    }) )
};

Target์— ์šฐํšŒํ•  origin ์„ ์ž‘์„ฑํ•œ๋‹ค.
Origin์€ URL์—์„œ ํ”„๋กœํ† ์ฝœ, ๋„๋ฉ”์ธ, ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ํ•ฉ์นœ ๋ถ€๋ถ„์ด๋‹ค.
ํ•„์ž๋Š” ๋„ค์ด๋ฒ„API๋ฅผ ์ด์šฉํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋„ค์ด๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋Š” ์ฃผ์†Œ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์—ˆ๋‹ค.


origin์˜ ๊ตฌ์กฐ

https://yi-jeong.github.com:80/
ํ”„๋กœํ† ์ฝœ https://
๋„๋ฉ”์ธ yi-jeong.github.com
ํฌํŠธ๋ฒˆํ˜ธ :80



๋„ค์ด๋ฒ„ ์˜ํ™” API ์ฝ”๋“œ ๋ณด๊ธฐ ๐Ÿ“

โ€‹ ์œ„ ํ”„๋กœ์ ํŠธ์—์„œ http-proxy-middleware ์„ ์‚ฌ์šฉํ•ด cors ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค.
ํ˜„์žฌ ์ž‘์—…์ค‘์ธ ํ”„๋กœ์ ํŠธ์ด๋ฏ€๋กœ ์™„์„ฑ๋‹จ๊ณ„๋Š” ์•„๋‹ˆ์ง€๋งŒ API๋Š” ์ œ๋Œ€๋กœ ๋ถˆ๋ ค์™€์ง„๋‹ค!