κ΄λ ¨ ν€μλ
λμΌμΆμ²μ μ± (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 μ μ± μ μ μ΄ν μλ μμ΅λλ€.
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'; # λ€λ₯Έ μ€μ ... } }