λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ‘¨‍πŸ’» web.dev/node

Node.js CORS μ„€μ •ν•˜κΈ°

by HandHand 2021. 3. 2.

CORS?

CORS(Cross Origin Resource Sharing) λŠ” 좔가적인 HTTP 헀더λ₯Ό μ‚¬μš©ν•΄μ„œ
ν•œ μΆœμ²˜μ—μ„œ μ‹€ν–‰ 쀑인 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ λ‹€λ₯Έ 좜처의 μžμ›μ— μ ‘κ·Όν•  수 μžˆλŠ” κΆŒν•œμ„ κ΄€λ¦¬ν•˜λŠ” μ²΄μ œμž…λ‹ˆλ‹€.

즉 μœ„μ™€ 같이 domain-a.com μ—μ„œ 같은 μ£Όμ†Œμ˜ domain-a.com 에 μ ‘κ·Όν•˜μ—¬ μžμ›μ„ μš”μ²­ν• λ•ŒλŠ” λ¬Έμ œκ°€ λ°œμƒν•˜μ§€ μ•Šμ§€λ§Œ,
domain-b.com 에 μš”μ²­ν•  경우 도메인이 λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— λ³΄μ•ˆμƒμ˜ 이유둜 μ œν•œλ©λ‹ˆλ‹€.

λ§Œμ•½ μ„œλ²„μ—μ„œ μ˜¬λ°”λ₯Έ CORS 헀더λ₯Ό ν¬ν•¨ν•œ 응닡을 λ°˜ν™˜ν•˜μ§€ μ•ŠμœΌλ©΄ μœ„μ™€ 같은 였λ₯˜κ°€ λ°œμƒν•˜κ²Œ λ©λ‹ˆλ‹€.

μœ„ μ˜ˆμ‹œμ—μ„œλŠ” μžμ›μ„ 가지고 μžˆλŠ” μ„œλ²„λ‹¨μ˜ 도메인인 http://127.0.0.1:3000 κ³Ό μžμ›μ„ μš”μ²­ν•œ http://localhost:8080 의 μΆœμ²˜κ°€ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— λ°œμƒν•œ 였λ₯˜μž…λ‹ˆλ‹€.

Node.jsμ—μ„œ CORS μ„€μ •

CORS νŒ¨ν‚€μ§€ μ„€μΉ˜

μš°μ„  CORS 미듀웨어λ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄ νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ν•©λ‹ˆλ‹€.

$npm i cors

λͺ¨λ“  CORS Request ν—ˆμš©ν•˜κΈ°

λͺ¨λ“  μš”μ²­μ„ ν—ˆμš©ν•  경우 λ‹€μŒκ³Ό 같이 κ°„λ‹¨ν•˜κ²Œ 미듀웨어λ₯Ό λΆˆλŸ¬μ™€μ„œ μΆ”κ°€ν•΄μ£ΌλŠ” κ²ƒμœΌλ‘œ ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

app.js

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

app.use(cors()); // CORS 미듀웨어 등둝

// ...

Whitelist둜 νŠΉμ • μ£Όμ†Œλ§Œ ν—ˆμš©ν•˜κΈ°

λͺ¨λ“  CORS μš”μ²­μ„ ν—ˆμš©ν•΄μ£ΌλŠ” 것이 λ•Œλ‘œλŠ” λ³΄μ•ˆμƒμ˜ 문제둜 μ΄μ–΄μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.

λ§Œμ•½ νŠΉμ • 호슀트만 CORS μš”μ²­μ„ ν—ˆμš©ν•΄μ£Όκ³  μ‹Άλ‹€λ©΄ λ‹€μŒκ³Ό 같이 whitelist λ₯Ό μΆ”κ°€ν•΄μ„œ κ²€μ¦ν•˜λŠ” 방법이 μžˆμŠ΅λ‹ˆλ‹€.
μš”μ²­μ„ ν—ˆμš©ν•  μ£Όμ†Œλ₯Ό 담은 whitelist λ₯Ό 생성해주고 μš”μ²­ HTTP ν—€λ”μ˜ Origin 속성을 ν™•μΈν•΄μ„œ
μΌμΉ˜ν•˜λŠ” ν•­λͺ©μ΄ μžˆμ„ 경우 ν—ˆμš©ν•΄μ£ΌλŠ” λ°©μ‹μž…λ‹ˆλ‹€.

app.js

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

const whitelist = ["http://localhost:8080"];
const corsOptions = {
  origin: function (origin, callback) {
    if (whitelist.indexOf(origin) !== -1) {
      callback(null, true);
    } else {
      callback(new Error("Not Allowed Origin!"));
    }
  },
};

app.use(cors(corsOptions)); // μ˜΅μ…˜μ„ μΆ”κ°€ν•œ CORS 미듀웨어 μΆ”κ°€

// ...

참고 자료

λ°˜μ‘ν˜•

πŸ’¬ λŒ“κΈ€