[TECH-QA] CORSλž€

κ΄€λ ¨ ν‚€μ›Œλ“œ

λ™μΌμΆœμ²˜μ •μ±…(Same-Origin Policy: ν”„λ‘œν† μ½œ/도메인/ν¬νŠΈκ°€ λͺ¨λ‘ κ°™μŒ)

λ³΄μ•ˆλͺ©μ 

CORS(Cross-Origin Resource Sharing)λŠ” μ›Ή λΈŒλΌμš°μ €μ—μ„œ μ‹€ν–‰λ˜λŠ” μŠ€ν¬λ¦½νŠΈκ°€ 도메인 ν˜Ήμ€ ν¬νŠΈκ°€ λ‹€λ₯Έ 좜처(origin)μ—μ„œ μ™ΈλΆ€μ„œλ²„μ˜ μžμ›μ„ μš”μ²­ν• λ•Œ 생긴닀.

πŸ“ 좜처(Origin) μ£Όμš” κ°œλ…

  • ν”„λ‘œν† μ½œ(http, https)
  • 도메인(example.com)
  • 포트(예: 80, 443)
의 μ‘°ν•©μœΌλ‘œ μ •μ˜λ©λ‹ˆλ‹€. 예: https://example.com:443
λ™μΌμΆœμ²˜ 정책에 μ˜ν•΄ λΈŒλΌμš°μ €λŠ” μ™ΈλΆ€μ„œλ²„μ— μš”μ²­ν•œ 데이타λ₯Ό λ³΄μ•ˆλͺ©μ μœΌλ‘œ μ°¨λ‹¨ν•˜λ©° ν•΄λ‹Ή 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ„œλ²„μ˜ response헀더에 Access-Control-Allow-Origin 같은 ν—€λ”λ‘œ μ–΄λ–€ 좜처λ₯Ό ν—ˆμš©ν• μ§€ μ‘λ‹΅ν•©λ‹ˆλ‹€.

CORSλŠ” μ„œλ²„ μΈ‘μ—μ„œ 크둜슀 μ˜€λ¦¬μ§„ μš”μ²­μ„ ν—ˆμš©ν•˜κ±°λ‚˜ μ œν•œν•˜λŠ” 정책을 μ •μ˜ν•˜λŠ” λ©”μ»€λ‹ˆμ¦˜μœΌλ‘œ μ„œλ²„μ˜ 응닡(response)에 ν¬ν•¨λ˜μ–΄μ•Ό ν•˜λ©° ν”„λ‘ νŠΈμ—”λ“œλŠ” μš”μ²­μ„ λ³΄λ‚΄λŠ” μ—­ν• λ§Œ ν•˜κ³ , CORS 정책을 μ œμ–΄ν•  μˆ˜λŠ” μ—†μŠ΅λ‹ˆλ‹€.

ν”„λ‘ νŠΈ μš”μ²­

ν”„λ‘ νŠΈμ—”λ“œ(ν΄λΌμ΄μ–ΈνŠΈ)μ—μ„œ μš”μ²­μ„ 보낼 λ•Œ Origin 헀더λ₯Ό ν¬ν•¨μ‹œμΌœ μžμ‹ μ˜ 좜처λ₯Ό μ„œλ²„μ— μ•Œλ¦½λ‹ˆλ‹€.
GET https://api.other.com/data
Origin: https://example.com

μ„œλ²„ 응닡

μ„œλ²„λŠ” 이 μš”μ²­μ„ λ°›κ³ , ν•΄λ‹Ή 좜처λ₯Ό ν—ˆμš©ν• μ§€ μ—¬λΆ€λ₯Ό νŒλ‹¨ν•œ ν›„ 응닡 헀더에 Access-Control-Allow-Origin을 μΆ”κ°€ν•©λ‹ˆλ‹€.
Access-Control-Allow-Origin: https://example.com

πŸ“ Node.js (Express)

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

app.use((req, res, next) => {
  res.setHeader('Access-Control-Allow-Origin', 'https://example.com'); // νŠΉμ • 좜처 ν—ˆμš©
  // λ˜λŠ” '*'둜 λͺ¨λ“  좜처 ν—ˆμš© (λ³΄μ•ˆμƒ 주의 ν•„μš”)
  // res.setHeader('Access-Control-Allow-Origin', '*');
  next();
});

app.get('/data', (req, res) => {
  res.json({ message: 'Hello from server!' });
});

app.listen(3000);

πŸ“ Nginx (μ›Ή μ„œλ²„ μ„€μ •)

server {
    listen 80;
    server_name api.example.com;

    location / {
        add_header 'Access-Control-Allow-Origin' 'https://example.com';
        # λ‹€λ₯Έ μ„€μ •...
    }
}