๊ด€๋ฆฌ ๋ฉ”๋‰ด

\(@^0^@)/

[์ด๋ก ] CORS & CORS ERROR ๋ณธ๋ฌธ

STUDYING/์ด๋ก  ๊ณต๋ถ€

[์ด๋ก ] CORS & CORS ERROR

minjuuu 2022. 11. 8. 12:23
728x90

๐Ÿ’ฅ CORS?

๋‹ค๋ฅธ ๋„๋ฉ”์ธ(domains (en-US))์—์„œ์˜ ์ž์›์„ ํ˜ธ์ถœํ•˜๋Š” ํ–‰์œ„์— ์ œํ•œ์ด ์—†์„ ๊ฒฝ์šฐ ์•ˆ์ „ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 
CORS (Cross-Origin Resource Sharing)๋Š” ์ด๋ ‡๊ฒŒ ์‹œ์Šคํ…œ ์ˆ˜์ค€์—์„œ ํƒ€ ๋„๋ฉ”์ธ ๊ฐ„ ์ž์› ํ˜ธ์ถœ์„ ์Šน์ธํ•˜๊ฑฐ๋‚˜ ์ฐจ๋‹จํ•˜๋Š” ๊ฒƒ์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

[ ์ถœ์ฒ˜ : https://developer.mozilla.org/ko/docs/Glossary/CORS ]

Client - localhost:3000
Server - localhost:4000์ด๋ผ๋ฉด 
port ๋ฒˆํ˜ธ๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์—ฐํžˆ ๋‘ ์„œ๋ฒ„์˜ Origin์ด ๋‹ค๋ฅด๋‹ค.
ex) naver.com์™€ google.com์˜ Origin์€ ๋‹ค๋ฅด๋‹ค.
๊ทธ๋ž˜์„œ ์„œ๋กœ์˜ origin์ด ๋‹ค๋ฅด๋ฉด ์ž์›์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด ๋‹น์—ฐํ•˜๋‹ค.

[ ์ถœ์ฒ˜ : https://www.youtube.com/watch?v=d6suykcsNeY


 

๐Ÿ’ฅ CORS ERROR?

 CORS ์„ค์ •์ด ์ œ๋Œ€๋กœ ์„ธํŒ…๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด, ๋ธŒ๋ผ์šฐ์ € ์ฝ˜์†”์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋œ๋‹ค.

 "Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at $somesite"

ํ•ด๋‹น ๋ฉ”์‹œ์ง€๋Š”  CORS ๋ณด์•ˆ ๊ทœ์น™ ์œ„๋ฐ˜์œผ๋กœ ์ธํ•ด ์š”์ฒญ์ด ์ฐจ๋‹จ๋˜์—ˆ๋‹ค๋Š” ์˜๋ฏธ๋กœ,

ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์—๊ฒŒ ์ž์›์„ ์š”๊ตฌํ•ด๋„ origin์ด ๋‹ค๋ฅด๋ฉด Cors ์ •์ฑ…์— ์˜ํ•ด ์ฐจ๋‹จํ•˜๋ฉด์„œ Cors Error๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ!
ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ด๊ฐ€๊ณ  ์š”์ฒญ์„ ํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—,
๊ฒฐ๊ตญ Cors Error๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์„œ๋ฒ„์—์„œ Cors์˜ ์ •์ฑ…์„ ํ—ˆ์šฉํ•ด์•ผ ํ•จ.



๐Ÿ”… CORS ์„ค์ • ๋ฐฉ๋ฒ•

1๏ธโƒฃ ์„œ๋ฒ„์—์„œ Cors์˜ ์ •์ฑ… ํ—ˆ์šฉ์„ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜

npm์—์„œ cors ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์„ค์น˜ ํ›„, ์‚ฌ์šฉ๋ž€์˜ ์ฝ”๋“œ๋ฅผ ๋ณต๋ถ™ ํ•˜์—ฌ ์ž…๋ง›์— ๋งž๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.
https://www.npmjs.com/package/cors

 

cors

Node.js CORS middleware. Latest version: 2.8.5, last published: 4 years ago. Start using cors in your project by running `npm i cors`. There are 11376 other projects in the npm registry using cors.

www.npmjs.com

// cors ์„ค์น˜
$ npm install cors
/* cors ์‚ฌ์šฉ๋ฐฉ๋ฒ• */

// cors import
const cors = require('cors')

// ๊ด„ํ˜ธ์•ˆ์— ์•„๋ฌด๊ฒƒ๋„ ๋„ฃ์ง€ ์•Š์„ ๊ฒฝ์šฐ, ์–ด๋–ค origin์ด๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป.
app.use(cors())

json-server๋กœ ๋งŒ๋“  ์„œ๋ฒ„์˜ ๊ฒฝ์šฐ์—” ๋ชจ๋“  ๋„๋ฉ”์ธ์„ ํ—ˆ์šฉํ•ด์ฃผ๋Š” CORS ๊ทœ์น™์ด ์ ์šฉ๋˜์–ด์žˆ๋‹ค.
ํ•˜์ง€๋งŒ, Open API๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด ๋ชจ๋“  ๋„๋ฉ”์ธ์„ ํ—ˆ์šฉํ•˜๋ฉด ์•ˆ ๋จ. ํŠน์ • ๋„๋ฉ”์ธ๋งŒ ํ—ˆ์šฉ์„ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.


2๏ธโƒฃ ์›นํŒฉ ๊ฐœ๋ฐœ์„œ๋ฒ„์—์„œ ์ œ๊ณตํ•˜๋Š” Proxy๋ผ๋Š” ๊ธฐ๋Šฅ ์ด์šฉ

์›นํŒฉ ๊ฐœ๋ฐœ์„œ๋ฒ„์˜ ํ”„๋ก์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด, ๋ธŒ๋ผ์šฐ์ € API๋ฅผ ์š”์ฒญํ•  ๋•Œ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์— ์ง์ ‘์ ์œผ๋กœ ์š”์ฒญ์„ ํ•˜์ง€ ์•Š๊ณ ,
ํ˜„์žฌ ๊ฐœ๋ฐœ์„œ๋ฒ„์˜ ์ฃผ์†Œ๋กœ ์š”์ฒญ์„ ํ•˜๊ฒŒ ๋œ๋‹ค.
๊ทธ๋Ÿฌ๋ฉด ์›นํŒฉ ๊ฐœ๋ฐœ ์„œ๋ฒ„์—์„œ ํ•ด๋‹น ์š”์ฒญ์„ ๋ฐ›์•„ ๊ทธ๋Œ€๋กœ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋กœ ์ „๋‹ฌํ•˜๊ณ , ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์—์„œ ์‘๋‹ตํ•œ ๋‚ด์šฉ์„ ๋‹ค์‹œ ๋ธŒ๋ผ์šฐ์ €์ชฝ์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
์›นํŒฉ ๊ฐœ๋ฐœ์„œ๋ฒ„์˜ proxy ์„ค์ •์€ ์›๋ž˜ ์›นํŒฉ ์„ค์ •์„ ํ†ตํ•ด์„œ ์ ์šฉ์„ ํ•˜์ง€๋งŒ, CRA๋ฅผ ํ†ตํ•ด ๋งŒ๋“  ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” package.json ์—์„œ "proxy" ๊ฐ’์„ ์„ค์ •ํ•˜์—ฌ ์‰ฝ๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

json-server๋กœ ๋ชจ์˜ API ์„œ๋ฒ„ ๊ฐ™์€ json-server๋ฅผ ๋งŒ๋“ค๊ฒฝ์šฐ์—๋„ Proxy๋ฅผ ์ด์šฉํ•ด์„œ Cors๋ฅผ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Proxy ๊ธฐ๋Šฅ์„ ์–ด๋–ค ์‹์œผ๋กœ ํ™œ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ™•์ธํ•ด๋ณด์ž.

123๋ฒˆ์งธ๋กœ ์ ์€ todo๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ๊ณ  ์‹ถ๋‹ค๊ณ  ๊ฐ€์ •.
ํด๋ผ์ด์–ธํŠธ : http://localhost:3000/todo/123
์„œ๋ฒ„ : http://localhost:4000/todo/123

$ npx json-server ./data.json --port 4000

๋‚˜์˜ ๊ฒฝ์šฐ์—๋Š” port 4000์œผ๋กœ json-server๋ฅผ ์—ด ๊ฒƒ์ด๋‹ค.

/* package.json์—์„œ proxy ๊ฐ’ ์„ค์ • */

"proxy": "http://localhost:4000"

package.json์—์„œ ํ•ด๋‹น ๊ฐ’์„ ์„ค์ •ํ•ด์ฃผ๊ณ ,

import axios from 'axios';

export const getTodoByNum = async num => {
  const response = await axios.get(`/todo/${num}`);
  return response.data;
};

ํ•ด๋‹น ํŒŒ์ผ์—์„œ http://localhost:4000/todo ๋Œ€์‹ ์— /todo URL๋กœ ์š”์ฒญ์„ ํ•  ๊ฒฝ์šฐ ์ฃผ์†Œ์˜ ๋„๋ฉ”์ธ์ด ์ƒ๋žต๋œ ๊ฒฝ์šฐ, ํ˜„์žฌ ํŽ˜์ด์ง€์˜ ๋„๋ฉ”์ธ์„ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค.

๋‹ค์‹œ ๋งํ•˜์ž๋ฉด, api ์š”์ฒญํ•  ๋•Œ ์›๋ž˜ http://localhost:4000/todo/${num} ๊ฐ™์€ ์ „์ฒด ๋„๋ฉ”์ธ์„ ์ ์–ด์ค˜์•ผ ํ•˜์ง€๋งŒ,
์š”์ฒญํ•˜๋Š” ์ฃผ์†Œ์˜ ๋„๋ฉ”์ธ์ด ์ƒ๋žต๋œ ๊ฒฝ์šฐ์—๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ํ˜„์žฌ ํŽ˜์ด์ง€ ๋„๋ฉ”์ธ http://localhost:3000์„ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค.

ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๊ฒฝ์šฐ, ๋ฆฌ์•กํŠธ๋กœ ๋งŒ๋“  ์„œ๋น„์Šค์™€ API๊ฐ€ ๋™์ผํ•œ ๋„๋ฉ”์ธ์—์„œ ์ œ๊ณต์ด ๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์œ„์™€ ๊ฐ™์ด ๊ณ„์† ์ง„ํ–‰์„ ํ•˜๋ฉด ๋˜์ง€๋งŒ, ๋งŒ์•ฝ API์˜ ๋„๋ฉ”์ธ๊ณผ ์„œ๋น„์Šค์˜ ๋„๋ฉ”์ธ์ด ๋‹ค๋ฅด๋‹ค๋ฉด axios์˜ ๊ธ€๋กœ๋ฒŒ baseURL์„ ์„ค์ •ํ•˜๋ฉด ๋œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์„œ๋น„์Šค๋Š” todo.com, API๋Š” today-todo.com์ด๋ผ๋ฉด index.js์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.

axios.defaults.baseURL = process.env.NODE_ENV === 'development' ? '/' : 'https://today-todo.com/';

์œ„์™€ ๊ฐ™์€ ์„ค์ •์„ ๋งŒ์•ฝ ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด,
๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„  ํ”„๋ก์‹œ ์„œ๋ฒ„ ์ชฝ์œผ๋กœ ์š”์ฒญํ•˜๊ณ , ํ”„๋กœ๋•์…˜์—์„  ์‹ค์ œ API ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ํ•˜๊ฒŒ ๋œ๋‹ค.

CORS ์„ค์ • ๋ฐฉ๋ฒ•์˜ 2๋ฒˆ์งธ์ธ Proxy๋ผ๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ํ•„์ˆ˜์ ์ธ ๊ฑด ์•„๋‹ˆ์ง€๋งŒ,
์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๋ฐฑ์—”๋“œ ์ชฝ์—์„œ CORS ์„ค์ •์„ ์•ˆ ํ•ด๋„ ๋˜๋‹ˆ๊นŒ ๊ฝค๋‚˜ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์ด๋‹ˆ, ๋‹ค์Œ์— ํ•œ๋ฒˆ ํ™œ์šฉํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

[ ์ถœ์ฒ˜ : https://react.vlpt.us/redux-middleware/09-cors-and-proxy.html ]

728x90