CORS

CORS๋ž€ ๊ต์ฐจ ์ถœ์ฒ˜ ์ž์› ๊ณต์œ  (Cross-Origin Resource Sharing) ๋ผ๋Š” ๋œป์ด๋‹ค. ์กฐ๊ธˆ ํ’€์–ด์„œ ์–˜๊ธฐํ•˜์ž๋ฉด, ํ•œ ์ž์›์˜ ์ถœ์ฒ˜์—์„œ ๋‹ค๋ฅธ ์ž์›์˜ ์ถœ์ฒ˜๋กœ ์ ‘๊ทผํ• ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ์ถœ์ฒ˜๋ž€ Protocol, Host, Port๋ฅผ ํ•ฉ์นœ ๊ฒƒ์ด๋‹ค.

์ฆ‰, ์œ„ 3๊ฐœ์˜ ํ•ญ๋ชฉ์ด ๊ฐ™๋‹ค๋ฉด ์ถœ์ฒ˜๊ฐ€ ๊ฐ™๋‹ค๊ณ  ํ•œ๋‹ค. http://test.com:80 ๊ณผ http://test.com์€ http์˜ ๊ธฐ๋ณธํฌํŠธ 80์ด ์ƒ๋žต๋˜์–ด ๊ฐ™์€ ์ถœ์ฒ˜๋ผ๊ณ  ํ• ์ˆ˜์žˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ €๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ SOP๋ฅผ ๋”ฐ๋ฅด๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์ถœ์ฒ˜์—์„œ ์˜จ ์ž์›๋“ค์˜ ์ ‘๊ทผ์„ ์ฐจ๋‹จํ•œ๋‹ค.

SOP : Same Origin Policy ๋™์ผํ•œ ์ถœ์ฒ˜์˜ ์ž์› ์ ‘๊ทผ๋งŒ ํ—ˆ์šฉํ•˜๋Š” ๋ณด์•ˆ ์ •์ฑ…

SOP๋ฅผ ์ง€ํ‚ค์ง€ ์•Š๋Š”๋‹ค๋ฉด XSS, XSRF๋“ฑ์˜ ๊ณต๊ฒฉ์„ ๋ฐ›์•„ ์‚ฌ์šฉ์ž์˜ ๊ฐœ์ธ์ •๋ณด๊ฐ€ ๋„๋‚œ ๋‹นํ•  ์šฐ๋ ค๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ํŠน์ •ํ•œ ์„ค์ •์—†์ด ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ์ž์›์— ์ ‘๊ทผํ•˜๋ คํ•˜๋ฉด ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์ด๋‹ค.

์ฆ‰, ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ์ž์›์— ์ ‘๊ทผ์„ ํ•ด์•ผ ํ• ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ๊ต์ฐจ ์ถœ์ฒ˜ ์ž์›๊ณต์œ ์ธ cors์ด๋‹ค

์ด cors๊ฐ€ ๋™์ž‘ํ•˜๋Š” ์›๋ฆฌ๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ดํŽด๋ณด์ž.

์šฐ๋ฆฌ๊ฐ€ ์›น์—์„œ ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ์ž์›์— ์ ‘๊ทผํ• ๋•Œ, http ํ—ค๋”์— ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค. ๋ฐ”๋กœ ์ด ์š”์ฒญ ํ—ค๋”์˜ Origin ํ•„๋“œ์— ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ์ถœ์ฒ˜๋ฅผ ์ž‘์„ฑํ•ด์„œ ๋ณด๋‚ธ๋‹ค.

์ดํ›„, ์„œ๋ฒ„์—์„œ ์‘๋‹ต์˜ Access-Control-Allow-Origin ํ—ค๋”์— ์„ค์ •๋œ Origin์˜ ๋ชฉ๋ก์— ์š”์ฒญ์˜ Origin ๊ฐ’์ด ์žˆ๋‚˜ ํ™•์ธํ•˜๊ณ , ์—†๋‹ค๋ฉด ์‘๋‹ต์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

๊ทธ๋Ÿผ api ํ˜ธ์ถœ์€ ์–ด๋–ป๊ฒŒ?

๊ทธ๋ ‡๋‹ค๋ฉด ํด๋ผ์ด์–ธํŠธ์—์„œ๋Š” api์š”์ฒญ์„ ์–ด๋–ป๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ? ํฌ๊ฒŒ 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•œ๋‹ค.

๋จผ์ € ๋กœ์ปฌํ™˜๊ฒฝ์—์„œ๋งŒ ํ•ด๊ฒฐํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๊ตฌ๊ธ€ ํฌ๋กฌ์˜ Allow CORS: Access-Control-Allow-Origin์„ ์„ค์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ง ๊ทธ๋Œ€๋กœ ๋กœ์ปฌ์—์„œ๋งŒ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ํ™˜๊ฒฝ์ด ๋‹ฌ๋ผ์ง€๋ฉด ์ ์šฉ์ด ์•ˆ๋˜๋ฏ€๋กœ ์ž„์‹œ๋ฐฉํŽธ์ด๋ผ๊ณ  ํ• ์ˆ˜ ์žˆ๋‹ค.

๋‘๋ฒˆ์งธ๋กœ๋Š” ์„œ๋ฒ„์—์„œ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ Access-Control-Allow-Origin ์‘๋‹ตํ—ค๋”๋ฅผ ์„ค์ •ํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

app.express.get("/example", (req, res) => {
  // ํŠน์ • ๋„๋ฉ”์ธ๋งŒ ํ—ˆ๋ฝํ•˜๋ฏ€๋กœ ์ถ”์ฒœ
  res.setHeader("Access-Control-Allow-origin", "https://localhost:1234");

  // ์ฟ ํ‚ค ์ฃผ๊ณ ๋ฐ›๊ธฐ ํ—ˆ์šฉ
  res.setHeader("Access-Control-Allow-Credentials", "true");
});
  • ๋˜๋Š” CORS ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์„ค์น˜ํ•˜์—ฌ ํ•ด๊ฒฐํ•œ๋‹ค. npm install cors

const cors = require("cors");
const app = express();

app.use(cors());

๋งˆ์ง€๋ง‰์œผ๋กœ๋Š” proxy๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์‚ฌ์‹ค์ƒ ํด๋ผ์ด์–ธํŠธ์—์„œ cors๋ฅผ ์ง์ ‘ ์„ค์ • ๊ฐ€๋Šฅํ•œ ๋ถ€๋ถ„์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž์ฃผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.

package.json

"proxy": "https://testUrl:3222.com",
// API Request

export const getAPI = async() => {
  try{
    const res = await customAxios.get("/later/url/123");
     console.log(res.data)
   } catch(err){
    console.log(err
   }
 }

์ฆ‰, ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ฐ”๋กœ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ํด๋ผ์ด์–ธํŠธ์—์„œ ํด๋ผ์ด์–ธํŠธ์„œ๋ฒ„๋กœ, ํด๋ผ์ด์–ธํŠธ ์„œ๋ฒ„์—์„œ ๋‹ค์‹œ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด๋‹ค.

Last updated