🌐 CORS μ •μ±…, λͺ¨λ“  λ°±μ—”λ“œ κ°œλ°œμžκ°€ κΌ­ μ•Œμ•„μ•Ό ν•  것

λ°œν–‰: (2025λ…„ 12μ›” 18일 μ˜€μ „ 12:34 GMT+9)
4 min read
원문: Dev.to

Source: Dev.to

Cover image for 🌐 CORS Policies Every Backend Developer Must Know

CORSλž€ 무엇인가?

CORSλŠ” ν•œ 좜처(도메인)의 λ¦¬μ†ŒμŠ€κ°€ λ‹€λ₯Έ μΆœμ²˜μ— μ˜ν•΄ μ–΄λ–»κ²Œ 접근될 수 μžˆλŠ”μ§€λ₯Ό μ œμ–΄ν•˜λŠ” λΈŒλΌμš°μ € λ³΄μ•ˆ λ©”μ»€λ‹ˆμ¦˜μž…λ‹ˆλ‹€.

Important: CORSλŠ” λΈŒλΌμš°μ €μ— μ˜ν•΄ κ°•μ œ μ μš©λ˜μ§€λ§Œ, 섀정은 λ°±μ—”λ“œμ—μ„œ ν•©λ‹ˆλ‹€.

κ°€μž₯ ν”ν•œ CORS μ‹€μˆ˜

Access-Control-Allow-Origin: *

이 ν—€λ”λŠ” λͺ¨λ“  μ›Ήμ‚¬μ΄νŠΈκ°€ μ—¬λŸ¬λΆ„μ˜ APIλ₯Ό ν˜ΈμΆœν•  수 있게 ν•©λ‹ˆλ‹€. APIκ°€ μΏ ν‚€, 토큰, μ„Έμ…˜ 등을 μ‚¬μš©ν•œλ‹€λ©΄ μ΄λŠ” μ‹¬κ°ν•œ λ³΄μ•ˆ μœ„ν—˜μ΄ λ©λ‹ˆλ‹€.

μ•ˆμ „ν•œ CORS 섀정을 μœ„ν•œ λͺ¨λ²” 사둀

1️⃣ μ‹ λ’°ν•  수 μžˆλŠ” 좜처 ν—ˆμš© 리슀트 μ‚¬μš©

μ•Œλ €μ§„ λ„λ©”μΈλ§Œ ν—ˆμš©ν•©λ‹ˆλ‹€:

const allowedOrigins = [
  'https://app.example.com',
  'https://admin.example.com'
];

2️⃣ 자격 증λͺ…κ³Ό ν•¨κ»˜ μ™€μΌλ“œμΉ΄λ“œ μ‚¬μš© κΈˆμ§€

μΏ ν‚€, 헀더에 ν¬ν•¨λœ JWT, μ„Έμ…˜ 등을 μ‚¬μš©ν•  λ•ŒλŠ” μ •ν™•ν•œ 좜처λ₯Ό μ§€μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€:

Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://app.example.com

Access-Control-Allow-Credentialsκ°€ true일 경우 *λŠ” ν—ˆμš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

3️⃣ ν—ˆμš©ν•  HTTP λ©”μ„œλ“œ μ œν•œ

APIκ°€ μ‹€μ œλ‘œ ν•„μš”λ‘œ ν•˜λŠ” λ©”μ„œλ“œλ§Œ ν—ˆμš©ν•©λ‹ˆλ‹€:

Access-Control-Allow-Methods: GET, POST, PUT, DELETE

λΆˆν•„μš”ν•˜κ²Œ PATCHλ‚˜ OPTIONS와 같은 μ‚¬μš©λ˜μ§€ μ•ŠλŠ” λ©”μ„œλ“œλ₯Ό λ…ΈμΆœν•˜μ§€ λ§ˆμ„Έμš”.

4️⃣ ν—ˆμš© 헀더 μ œν•œ

μš”μ²­ 헀더 쀑 ν—ˆμš©ν•  ν•­λͺ©μ„ λͺ…μ‹œν•©λ‹ˆλ‹€:

Access-Control-Allow-Headers: Content-Type, Authorization

5️⃣ ν”„λ¦¬ν”ŒλΌμ΄νŠΈ(OPTIONS) μš”μ²­μ„ μ˜¬λ°”λ₯΄κ²Œ 처리

λΈŒλΌμš°μ €λŠ” νŠΉμ • API 호좜 전에 OPTIONS μš”μ²­μ„ λ³΄λƒ…λ‹ˆλ‹€.

λͺ¨λ²” 사둀:

  • λΉ λ₯΄κ²Œ μ‘λ‹΅ν•©λ‹ˆλ‹€(예: 204 No Content).
  • ν”„λ¦¬ν”ŒλΌμ΄νŠΈ 응닡에 인증을 μš”κ΅¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • μ μ ˆν•œ CORS 헀더λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

6️⃣ ν™˜κ²½λ³„ CORS κ·œμΉ™

ν™˜κ²½μ •μ±…
Developmentlocalhost ν—ˆμš©
Stagingν…ŒμŠ€νŠΈ 도메인 ν—ˆμš©
Productionμ—„κ²©ν•œ ν—ˆμš© 리슀트 적용

이 접근법은 κ°œλ°œμ„ νŽΈλ¦¬ν•˜κ²Œ ν•˜λ©΄μ„œλ„ ν”„λ‘œλ•μ…˜μ—μ„œλŠ” λ³΄μ•ˆμ„ μœ μ§€ν•©λ‹ˆλ‹€.

7️⃣ CORSλ₯Ό λ³΄μ•ˆ λ©”μ»€λ‹ˆμ¦˜μœΌλ‘œ μ˜€μΈν•˜μ§€ 말 것

CORSλŠ” λ‹€μŒμ„ λŒ€μ²΄ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€:

  • 인증
  • 인가
  • 속도 μ œν•œ
  • μž…λ ₯ 검증

κ³΅κ²©μžλŠ” μ—¬μ „νžˆ Postmanμ΄λ‚˜ curl 같은 도ꡬλ₯Ό μ‚¬μš©ν•΄ APIλ₯Ό 직접 ν˜ΈμΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ˜ˆμ‹œ: μ•ˆμ „ν•œ Node.js CORS μ„€μ •

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

app.use(cors({
  origin: ['https://app.example.com'],
  methods: ['GET', 'POST', 'PUT', 'DELETE'],
  allowedHeaders: ['Content-Type', 'Authorization'],
  credentials: true,
  maxAge: 86400 // seconds
}));

λ©΄μ ‘ 팁

Q: CORSλŠ” ν”„λ‘ νŠΈμ—”λ“œ λ³΄μ•ˆ κΈ°λŠ₯μΈκ°€μš”, λ°±μ—”λ“œ λ³΄μ•ˆ κΈ°λŠ₯μΈκ°€μš”?
A: CORSλŠ” λΈŒλΌμš°μ €μ— μ˜ν•΄ κ°•μ œ μ μš©λ˜μ§€λ§Œ, 섀정은 λ°±μ—”λ“œμ—μ„œ μ œμ–΄ν•©λ‹ˆλ‹€.

마무리 생각

ν›Œλ₯­ν•œ λ°±μ—”λ“œ κ°œλ°œμžλŠ”:

  • μ΅œμ†Œ κΆŒν•œ 원칙에 λ§žλŠ” CORS 섀정을 μ‚¬μš©ν•©λ‹ˆλ‹€.
  • ν”„λ‘œλ•μ…˜μ—μ„œλŠ” μ™€μΌλ“œμΉ΄λ“œλ₯Ό ν”Όν•©λ‹ˆλ‹€.
  • ν™˜κ²½λ³„ 섀정을 κ΅¬λΆ„ν•©λ‹ˆλ‹€.
  • CORSκ°€ μ‹€μ œ λ³΄μ•ˆ μ œμ–΄λ₯Ό λŒ€μ²΄ν•  수 μ—†λ‹€λŠ” 것을 μ΄ν•΄ν•©λ‹ˆλ‹€.

μ˜¬λ°”λ₯Έ CORS 섀정은 μ „λ¬Έ λ°±μ—”λ“œ 개발자의 μ„±μˆ™λ„λ₯Ό λ³΄μ—¬μ€λ‹ˆλ‹€.

Back to Blog

κ΄€λ ¨ κΈ€

더 보기 Β»

MERNμ—μ„œ CORS 였λ₯˜λ₯Ό ν•΄κ²°ν•˜λŠ” 방법 (μ•ˆμ „ν•œ 방법)

MERN μŠ€νƒμ—μ„œ CORS 였λ₯˜μ— 더 이상 κ³ μƒν•˜μ§€ λ§ˆμ„Έμš”: μ‹œκ°μ  κ°€μ΄λ“œ μ΄λŠ” λͺ¨λ“  ν’€μŠ€νƒ κ°œλ°œμžμ—κ²Œ 톡과 μ˜μ‹κ³Όλ„ κ°™μŠ΅λ‹ˆλ‹€. 당신은 Express…에 μ‹œκ°„μ„ λ“€μ—¬ κ΅¬μΆ•ν•©λ‹ˆλ‹€.

당신은 TailwindCSSλ₯Ό 잘λͺ» μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€

λ‚˜λŠ” 이전에 μ™œ 일반적으둜 λ‚΄ ν”„λ‘œμ νŠΈμ—μ„œ Tailwind CSSλ₯Ό μ£Όμš” μŠ€νƒ€μΌλ§ μ ‘κ·Ό λ°©μ‹μœΌλ‘œ μ‚¬μš©ν•˜λŠ” 것을 ꢌμž₯ν•˜μ§€ μ•ŠλŠ”μ§€ μ–ΈκΈ‰ν–ˆμœΌλ©°, κ·Έ μž…μž₯을 μ„€λͺ…ν–ˆμŠ΅λ‹ˆλ‹€β€¦

인도 λ„μ‹œλ₯Ό μœ„ν•œ λ©”νŠΈλ‘œ 경둜 ν”Œλž˜λ„ˆ μ›Ήμ‚¬μ΄νŠΈ ꡬ좕

μ†Œκ°œ: μΈλ„μ—μ„œ MetroYatra λ˜λŠ” β€œmetro travel”은 λΉ λ₯΄κ³  μ €λ ΄ν•˜λ©° 널리 μ‚¬μš©λ©λ‹ˆλ‹€ β€” ν•˜μ§€λ§Œ 여행을 κ³„νšν•˜λŠ” 것이 항상 κ°„λ‹¨ν•œ 것은 μ•„λ‹™λ‹ˆλ‹€. 노선이 ν˜Όλž€μŠ€λŸ¬μšΈ 수 μžˆμŠ΅λ‹ˆλ‹€,…

μ›Ήμ‚¬μ΄νŠΈ λ³΄μ•ˆ κ°μ‚¬λŠ” μ–΄λ–»κ²Œ μˆ˜ν–‰ν•˜λ‚˜μš”? (체크리슀트 + 도ꡬ)

μ •λ¦¬λœ Markdown μ™œ μ›Ήμ‚¬μ΄νŠΈ λ³΄μ•ˆμ΄ 더 이상 선택 사항이 μ•„λ‹Œκ°€ μ†Œκ·œλͺ¨ λΉ„μ¦ˆλ‹ˆμŠ€ μ‚¬μ΄νŠΈμ΄λ“ , 개인 λΈ”λ‘œκ·Έμ΄λ“ , 온라인 μŠ€ν† μ–΄μ΄λ“ , λ³΄μ•ˆμ€ …