λ€λ₯Έ λλ©μΈ κ°μ μμ ν μλ°μ€ν¬λ¦½νΈ ν΅μ μ μν κ΅μ°¨ μΆμ² 리μμ€ κ³΅μ (CORS)λ₯Ό μ΄ν΄νκ³ κ΅¬ννλ μ’ ν© κ°μ΄λμ λλ€.
κ΅μ°¨ μΆμ² 보μ ꡬν: μλ°μ€ν¬λ¦½νΈ ν΅μ λͺ¨λ² μ¬λ‘
μ€λλ μνΈ μ°κ²°λ μΉ νκ²½μμ μλ°μ€ν¬λ¦½νΈ μ ν리μΌμ΄μ μ μ’ μ’ λ€λ₯Έ μΆμ²(λλ©μΈ, νλ‘ν μ½ λλ ν¬νΈ)μ 리μμ€μ μνΈ μμ©ν΄μΌ ν©λλ€. μ΄ μνΈ μμ©μ λΈλΌμ°μ μ λμΌ μΆμ² μ μ± (Same-Origin Policy)μ μν΄ μ μ΄λ©λλ€. μ΄λ μ μ± μ€ν¬λ¦½νΈκ° λλ©μΈ κ²½κ³λ₯Ό λμ΄ λ―Όκ°ν λ°μ΄ν°μ μ κ·Όνλ κ²μ λ°©μ§νκΈ° μν΄ μ€κ³λ μ€μν 보μ λ©μ»€λμ¦μ λλ€. νμ§λ§ ν©λ²μ μΈ κ΅μ°¨ μΆμ² ν΅μ μ΄ νμν κ²½μ°λ λ§μ΅λλ€. λ°λ‘ μ΄ μ§μ μμ κ΅μ°¨ μΆμ² 리μμ€ κ³΅μ (Cross-Origin Resource Sharing, CORS)κ° μ¬μ©λ©λλ€. μ΄ κΈμμλ CORSμ λν ν¬κ΄μ μΈ κ°μ, ꡬν λ°©λ², κ·Έλ¦¬κ³ μλ°μ€ν¬λ¦½νΈμμ μμ ν κ΅μ°¨ μΆμ² ν΅μ μ μν λͺ¨λ² μ¬λ‘λ₯Ό μ 곡ν©λλ€.
λμΌ μΆμ² μ μ± (Same-Origin Policy) μ΄ν΄νκΈ°
λμΌ μΆμ² μ μ± (SOP)μ μΉ λΈλΌμ°μ μ κ·Όλ³Έμ μΈ λ³΄μ κ°λ μ λλ€. μ΄ μ μ± μ ν μΆμ²μμ μ€νλλ μ€ν¬λ¦½νΈκ° λ€λ₯Έ μΆμ²μ 리μμ€μ μ κ·Όνλ κ²μ μ νν©λλ€. μΆμ²λ νλ‘ν μ½(μ: HTTP λλ HTTPS), λλ©μΈ μ΄λ¦(μ: example.com), ν¬νΈ λ²νΈ(μ: 80 λλ 443)μ μ‘°ν©μΌλ‘ μ μλ©λλ€. λ URLμ μ΄ μΈ κ°μ§ κ΅¬μ± μμκ° λͺ¨λ μ ννκ² μΌμΉν λλ§ λμΌν μΆμ²λ₯Ό κ°μ§λλ€.
μλ₯Ό λ€λ©΄ λ€μκ³Ό κ°μ΅λλ€:
http://www.example.comμhttp://www.example.com/path: λμΌ μΆμ²http://www.example.comμhttps://www.example.com: λ€λ₯Έ μΆμ² (νλ‘ν μ½μ΄ λ€λ¦)http://www.example.comμhttp://subdomain.example.com: λ€λ₯Έ μΆμ² (λλ©μΈμ΄ λ€λ¦)http://www.example.com:80μhttp://www.example.com:8080: λ€λ₯Έ μΆμ² (ν¬νΈκ° λ€λ¦)
SOPλ μΉμ¬μ΄νΈμ μ£Όμ λ μ μ± μ€ν¬λ¦½νΈκ° μ¬μ©μ λ°μ΄ν°λ₯Ό νμΉκ±°λ μ¬μ©μλ₯Ό λμ νμ¬ λ¬΄λ¨ μμ μ μνν μ μλ κ΅μ°¨ μ¬μ΄νΈ μ€ν¬λ¦½ν (XSS) 곡격μ λν μ€μν λ°©μ΄ μλ¨μ λλ€.
κ΅μ°¨ μΆμ² 리μμ€ κ³΅μ (CORS)λ 무μμΈκ°?
CORSλ HTTP ν€λλ₯Ό μ¬μ©νμ¬ μλ²κ° μ΄λ€ μΆμ²(λλ©μΈ, μ€ν΄ λλ ν¬νΈ)κ° μμ μ 리μμ€μ μ κ·Όν μ μλλ‘ νμ©ν μ§λ₯Ό λνλ΄λ λ©μ»€λμ¦μ λλ€. μ΄λ λ³Έμ§μ μΌλ‘ νΉμ κ΅μ°¨ μΆμ² μμ²μ λν΄ λμΌ μΆμ² μ μ± μ μννμ¬, μ μμ μΈ κ³΅κ²©μΌλ‘λΆν°λ 보νΈνλ©΄μ ν©λ²μ μΈ ν΅μ μ κ°λ₯νκ² ν©λλ€.
CORSλ νμ©λ μΆμ²μ κ΅μ°¨ μΆμ² μμ²μ νμ©λλ λ©μλ(μ: GET, POST, PUT, DELETE)λ₯Ό μ§μ νλ μλ‘μ΄ HTTP ν€λλ₯Ό μΆκ°νμ¬ μλν©λλ€. λΈλΌμ°μ κ° κ΅μ°¨ μΆμ² μμ²μ ν λ, μμ²κ³Ό ν¨κ» Origin ν€λλ₯Ό 보λ
λλ€. μλ²λ νμ©λ μΆμ²λ₯Ό μ§μ νλ Access-Control-Allow-Origin ν€λλ‘ μλ΅ν©λλ€. λ§μ½ μμ²μ μΆμ²κ° Access-Control-Allow-Origin ν€λμ κ°κ³Ό μΌμΉνκ±°λ κ°μ΄ *μ΄λ©΄, λΈλΌμ°μ λ μλ°μ€ν¬λ¦½νΈ μ½λκ° μλ΅μ μ κ·Όνλλ‘ νμ©ν©λλ€.
CORSμ μλ λ°©μ: μμΈ μ€λͺ
CORS νλ‘μΈμ€λ μΌλ°μ μΌλ‘ λ κ°μ§ μ νμ μμ²μ ν¬ν¨ν©λλ€:
- λ¨μ μμ²(Simple Requests): νΉμ κΈ°μ€μ μΆ©μ‘±νλ μμ²μ λλ€. μμ²μ΄ μ΄ μ‘°κ±΄λ€μ λ§μ‘±νλ©΄, λΈλΌμ°μ λ μμ²μ μ§μ 보λ λλ€.
- ν리νλΌμ΄νΈ μμ²(Preflighted Requests): λ 볡μ‘ν μμ²μΌλ‘, μ€μ μμ²μ 보λ΄λ μμ νμ§ νλ¨νκΈ° μν΄ λΈλΌμ°μ κ° λ¨Όμ μλ²μ "ν리νλΌμ΄νΈ" OPTIONS μμ²μ 보λ΄μΌ ν©λλ€.
1. λ¨μ μμ²
μμ²μ΄ λ€μμ λͺ¨λ 쑰건μ μΆ©μ‘±νλ©΄ "λ¨μ(simple)"νλ€κ³ κ°μ£Όλ©λλ€:
- λ©μλκ°
GET,HEAD, λλPOSTμ λλ€. - λ©μλκ°
POSTμΈ κ²½μ°,Content-Typeν€λλ λ€μ μ€ νλμ λλ€: application/x-www-form-urlencodedmultipart/form-datatext/plain- μ¬μ©μ μ μ ν€λκ° μ€μ λμ§ μμμ΅λλ€.
λ¨μ μμ²μ μ:
GET /resource HTTP/1.1
Origin: http://www.example.com
μΆμ²λ₯Ό νμ©νλ μλ² μλ΅μ μ:
HTTP/1.1 200 OK
Access-Control-Allow-Origin: http://www.example.com
Content-Type: application/json
{
"data": "Some data"
}
Access-Control-Allow-Origin ν€λκ° μ‘΄μ¬νκ³ κ·Έ κ°μ΄ μμ²μ μΆμ²μ μΌμΉνκ±°λ *λ‘ μ€μ λ κ²½μ°, λΈλΌμ°μ λ μ€ν¬λ¦½νΈκ° μλ΅ λ°μ΄ν°μ μ κ·Όνλλ‘ νμ©ν©λλ€. κ·Έλ μ§ μμΌλ©΄ λΈλΌμ°μ λ μλ΅μ λν μ κ·Όμ μ°¨λ¨νκ³ μ½μμ μ€λ₯ λ©μμ§λ₯Ό νμν©λλ€.
2. ν리νλΌμ΄νΈ μμ²
μμ²μ΄ λ¨μ μμ²μ κΈ°μ€μ μΆ©μ‘±νμ§ λͺ»νλ©΄ "ν리νλΌμ΄νΈ(preflighted)" μμ²μΌλ‘ κ°μ£Όλ©λλ€. μ΄λ μΌλ°μ μΌλ‘ μμ²μ΄ λ€λ₯Έ HTTP λ©μλ(μ: PUT, DELETE)λ₯Ό μ¬μ©νκ±°λ, μ¬μ©μ μ μ ν€λλ₯Ό μ€μ νκ±°λ, νμ©λ κ° μ΄μΈμ Content-Typeμ μ¬μ©νλ κ²½μ°μ λ°μν©λλ€.
μ€μ μμ²μ 보λ΄κΈ° μ μ, λΈλΌμ°μ λ λ¨Όμ μλ²μ OPTIONS μμ²μ 보λ
λλ€. μ΄ "ν리νλΌμ΄νΈ" μμ²μλ λ€μ ν€λκ° ν¬ν¨λ©λλ€:
Origin: μμ²νλ νμ΄μ§μ μΆμ².Access-Control-Request-Method: μ€μ μμ²μμ μ¬μ©λ HTTP λ©μλ (μ:PUT,DELETE).Access-Control-Request-Headers: μ€μ μμ²μμ μ μ‘λ μ¬μ©μ μ μ ν€λμ μΌνλ‘ κ΅¬λΆλ λͺ©λ‘.
ν리νλΌμ΄νΈ μμ²μ μ:
OPTIONS /resource HTTP/1.1
Origin: http://www.example.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: X-Custom-Header, Content-Type
μλ²λ OPTIONS μμ²μ λ€μ ν€λλ‘ μλ΅ν΄μΌ ν©λλ€:
Access-Control-Allow-Origin: μμ²μ λ³΄λΌ μ μλλ‘ νμ©λ μΆμ² (λλ λͺ¨λ μΆμ²λ₯Ό νμ©νλ*).Access-Control-Allow-Methods: κ΅μ°¨ μΆμ² μμ²μ νμ©λλ HTTP λ©μλμ μΌνλ‘ κ΅¬λΆλ λͺ©λ‘ (μ:GET,POST,PUT,DELETE).Access-Control-Allow-Headers: μμ²μ μ μ‘λ μ μλλ‘ νμ©λ μ¬μ©μ μ μ ν€λμ μΌνλ‘ κ΅¬λΆλ λͺ©λ‘.Access-Control-Max-Age: ν리νλΌμ΄νΈ μλ΅μ΄ λΈλΌμ°μ μ μν΄ μΊμλ μ μλ μκ°(μ΄).
ν리νλΌμ΄νΈ μμ²μ λν μλ² μλ΅μ μ:
HTTP/1.1 200 OK
Access-Control-Allow-Origin: http://www.example.com
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: X-Custom-Header, Content-Type
Access-Control-Max-Age: 86400
λ§μ½ ν리νλΌμ΄νΈ μμ²μ λν μλ²μ μλ΅μ΄ μ€μ μμ²μ΄ νμ©λ¨μ λνλ΄λ©΄, λΈλΌμ°μ λ μ€μ μμ²μ 보λ λλ€. κ·Έλ μ§ μμΌλ©΄ λΈλΌμ°μ λ μμ²μ μ°¨λ¨νκ³ μ€λ₯ λ©μμ§λ₯Ό νμν©λλ€.
μλ² μΈ‘μμ CORS ꡬννκΈ°
CORSλ μ£Όλ‘ μλ² μΈ‘μμ μλ΅μ μ μ ν HTTP ν€λλ₯Ό μ€μ νμ¬ κ΅¬νλ©λλ€. ꡬ체μ μΈ κ΅¬ν μΈλΆ μ¬νμ μ¬μ©λλ μλ² μΈ‘ κΈ°μ μ λ°λΌ λ¬λΌμ§λλ€.
Node.jsμ Expressλ₯Ό μ¬μ©ν μμ :
const express = require('express');
const cors = require('cors');
const app = express();
// λͺ¨λ μΆμ²μ λν΄ CORS νμ±ν
app.use(cors());
// λλ νΉμ μΆμ²μ λν΄ CORS ꡬμ±
// const corsOptions = {
// origin: 'http://www.example.com'
// };
// app.use(cors(corsOptions));
app.get('/resource', (req, res) => {
res.json({ message: 'This is a CORS-enabled resource' });
});
app.listen(3000, () => {
console.log('Server listening on port 3000');
});
cors λ―Έλ€μ¨μ΄λ Expressμμ CORS ν€λλ₯Ό μ€μ νλ κ³Όμ μ λ¨μνν©λλ€. cors()λ₯Ό μ¬μ©νμ¬ λͺ¨λ μΆμ²μ λν΄ CORSλ₯Ό νμ±ννκ±°λ, cors(corsOptions)λ₯Ό μ¬μ©νμ¬ νΉμ μΆμ²μ λν΄ κ΅¬μ±ν μ μμ΅λλ€.
Pythonκ³Ό Flaskλ₯Ό μ¬μ©ν μμ :
from flask import Flask
from flask_cors import CORS
app = Flask(__name__)
CORS(app)
@app.route("/resource")
def hello():
return {"message": "This is a CORS-enabled resource"}
if __name__ == '__main__':
app.run(debug=True)
flask_cors νμ₯μ Flask μ ν리μΌμ΄μ
μμ CORSλ₯Ό νμ±ννλ κ°λ¨ν λ°©λ²μ μ 곡ν©λλ€. CORS()μ appμ μ λ¬νμ¬ λͺ¨λ μΆμ²μ λν΄ CORSλ₯Ό νμ±νν μ μμ΅λλ€. νΉμ μΆμ²μ λν ꡬμ±λ κ°λ₯ν©λλ€.
Javaμ Spring Bootλ₯Ό μ¬μ©ν μμ :
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/resource")
.allowedOrigins("http://www.example.com")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("Content-Type", "X-Custom-Header")
.allowCredentials(true)
.maxAge(3600);
}
}
Spring Bootμμλ WebMvcConfigurerλ₯Ό μ¬μ©νμ¬ CORSλ₯Ό ꡬμ±ν μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ νμ©λ μΆμ², λ©μλ, ν€λ λ° κΈ°ν CORS μ€μ μ λν μΈλ°ν μ μ΄κ° κ°λ₯ν©λλ€.
μ§μ CORS ν€λ μ€μ νκΈ° (μΌλ°μ μΈ μμ )
νλ μμν¬λ₯Ό μ¬μ©νμ§ μλ κ²½μ°, μλ² μΈ‘ μ½λ(μ: PHP, Ruby on Rails λ±)μμ μ§μ ν€λλ₯Ό μ€μ ν μ μμ΅λλ€:
CORS λͺ¨λ² μ¬λ‘
μμ νκ³ ν¨μ¨μ μΈ κ΅μ°¨ μΆμ² ν΅μ μ 보μ₯νλ €λ©΄ λ€μ λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄μμμ€:
- νλ‘λμ
νκ²½μμ
Access-Control-Allow-Origin: *μ¬μ© νΌνκΈ°: λͺ¨λ μΆμ²κ° 리μμ€μ μ κ·Όνλλ‘ νμ©νλ κ²μ 보μ μνμ΄ λ μ μμ΅λλ€. λμ νμ©λλ μ νν μΆμ²λ₯Ό μ§μ νμμμ€. - HTTPS μ¬μ©: μ μ‘ μ€μΈ λ°μ΄ν°λ₯Ό 보νΈνκΈ° μν΄ μμ²νλ μΆμ²μ μ 곡νλ μΆμ² λͺ¨λμ νμ HTTPSλ₯Ό μ¬μ©νμμμ€.
- μ λ ₯ μ ν¨μ± κ²μ¬: μ£Όμ 곡격μ λ°©μ§νκΈ° μν΄ κ΅μ°¨ μΆμ² μμ²μΌλ‘λΆν° λ°μ λ°μ΄ν°λ₯Ό νμ κ²μ¦νκ³ μ΄κ· (sanitize)νμμμ€.
- μ μ ν μΈμ¦ λ° κΆν λΆμ¬ ꡬν: μΉμΈλ μ¬μ©μλ§ λ―Όκ°ν 리μμ€μ μ κ·Όν μ μλλ‘ νμμμ€.
- ν리νλΌμ΄νΈ μλ΅ μΊμ±:
Access-Control-Max-Ageλ₯Ό μ¬μ©νμ¬ ν리νλΌμ΄νΈ μλ΅μ μΊμνκ³OPTIONSμμ² μλ₯Ό μ€μ΄μμμ€. - μ격 μ¦λͺ
(Credentials) μ¬μ© κ³ λ €: APIκ° μΏ ν€λ HTTP μΈμ¦μ μꡬνλ κ²½μ°, μλ²μμ
Access-Control-Allow-Credentialsν€λλ₯Όtrueλ‘ μ€μ νκ³ , μλ°μ€ν¬λ¦½νΈ μ½λ(μ:fetchλλXMLHttpRequestμ¬μ© μ)μμcredentialsμ΅μ μ'include'λ‘ μ€μ ν΄μΌ ν©λλ€. μ΄ μ΅μ μ μ¬μ©ν λλ λ§€μ° μ μ€ν΄μΌ ν©λλ€. μ¬λ°λ₯΄κ² μ²λ¦¬νμ§ μμΌλ©΄ 보μ μ·¨μ½μ μ μ λ°ν μ μμ΅λλ€. λν, Access-Control-Allow-Credentialsκ° trueλ‘ μ€μ λλ©΄ Access-Control-Allow-Originμ "*"λ‘ μ€μ ν μ μμ΅λλ€. νμ©λ μΆμ²λ₯Ό λͺ μμ μΌλ‘ μ§μ ν΄μΌ ν©λλ€. - μ κΈ°μ μΌλ‘ CORS κ΅¬μ± κ²ν λ° μ λ°μ΄νΈ: μ ν리μΌμ΄μ μ΄ λ°μ ν¨μ λ°λΌ μ κΈ°μ μΌλ‘ CORS ꡬμ±μ κ²ν νκ³ μ λ°μ΄νΈνμ¬ λ³΄μμ μ μ§νκ³ μꡬ μ¬νμ μΆ©μ‘±νλμ§ νμΈνμμμ€.
- λ€μν CORS ꡬμ±μ μν₯ μ΄ν΄: λ€μν CORS ꡬμ±μ 보μμ μν₯μ μΈμ§νκ³ μ ν리μΌμ΄μ μ μ ν©ν ꡬμ±μ μ ννμμμ€.
- CORS ꡬν ν μ€νΈ: CORS ꡬνμ΄ μμλλ‘ μλνκ³ λ³΄μ μ·¨μ½μ μ μ λ°νμ§ μλμ§ μ² μ ν ν μ€νΈνμμμ€. λΈλΌμ°μ κ°λ°μ λꡬλ₯Ό μ¬μ©νμ¬ λ€νΈμν¬ μμ²κ³Ό μλ΅μ κ²μ¬νκ³ , μλνλ ν μ€νΈ λꡬλ₯Ό μ¬μ©νμ¬ CORS λμμ νμΈνμμμ€.
μμ : Fetch APIμ CORS μ¬μ©νκΈ°
λ€μμ fetch APIλ₯Ό μ¬μ©νμ¬ κ΅μ°¨ μΆμ² μμ²μ νλ μμ μ
λλ€:
fetch('https://api.example.com/data', {
method: 'GET',
mode: 'cors', // λΈλΌμ°μ μ μ΄κ²μ΄ CORS μμ²μμ μλ¦Ό
headers: {
'Content-Type': 'application/json',
'X-Custom-Header': 'value'
}
})
.then(response => {
if (!response.ok) {
throw new Error('Network response was not ok');
}
return response.json();
})
.then(data => {
console.log(data);
})
.catch(error => {
console.error('There was a problem with the fetch operation:', error);
});
mode: 'cors' μ΅μ
μ λΈλΌμ°μ μ μ΄κ²μ΄ CORS μμ²μμ μ립λλ€. μλ²κ° μΆμ²λ₯Ό νμ©νμ§ μμΌλ©΄ λΈλΌμ°μ λ μλ΅μ λν μ κ·Όμ μ°¨λ¨νκ³ μ€λ₯κ° λ°μν©λλ€.
μ격 μ¦λͺ
(μ: μΏ ν€)μ μ¬μ©νλ κ²½μ°, credentials μ΅μ
μ 'include'λ‘ μ€μ ν΄μΌ ν©λλ€:
fetch('https://api.example.com/data', {
method: 'GET',
mode: 'cors',
credentials: 'include', // μμ²μ μΏ ν€ ν¬ν¨
headers: {
'Content-Type': 'application/json'
}
})
.then(response => {
// ...
});
CORSμ JSONP
JSON with Padding (JSONP)λ λμΌ μΆμ² μ μ±
μ μ°ννκΈ° μν μ€λλ κΈ°μ μ
λλ€. λ€λ₯Έ λλ©μΈμμ λ°μ΄ν°λ₯Ό λ‘λνλ <script> νκ·Έλ₯Ό λμ μΌλ‘ μμ±νμ¬ μλν©λλ€. JSONPλ νΉμ μν©μμ μ μ©ν μ μμ§λ§, μ¬κ°ν 보μ μ νμ΄ μμΌλ―λ‘ κ°λ₯νλ©΄ νΌν΄μΌ ν©λλ€. CORSλ λ μμ νκ³ μ μ°ν λ©μ»€λμ¦μ μ 곡νλ―λ‘ κ΅μ°¨ μΆμ² ν΅μ μ μ νΈλλ μ루μ
μ
λλ€.
CORSμ JSONPμ μ£Όμ μ°¨μ΄μ :
- 보μ: CORSλ μλ²κ° μ΄λ€ μΆμ²κ° 리μμ€μ μ κ·Όν μ μλμ§ μ μ΄ν μ μκΈ° λλ¬Έμ JSONPλ³΄λ€ λ μμ ν©λλ€. JSONPλ μΆμ² μ μ΄λ₯Ό μ 곡νμ§ μμ΅λλ€.
- HTTP λ©μλ: CORSλ λͺ¨λ HTTP λ©μλ(μ:
GET,POST,PUT,DELETE)λ₯Ό μ§μνμ§λ§, JSONPλGETμμ²λ§ μ§μν©λλ€. - μ€λ₯ μ²λ¦¬: CORSλ JSONPλ³΄λ€ λ λμ μ€λ₯ μ²λ¦¬λ₯Ό μ 곡ν©λλ€. CORS μμ²μ΄ μ€ν¨νλ©΄ λΈλΌμ°μ λ μμΈν μ€λ₯ λ©μμ§λ₯Ό μ 곡ν©λλ€. JSONPμ μ€λ₯ μ²λ¦¬λ μ€ν¬λ¦½νΈκ° μ±κ³΅μ μΌλ‘ λ‘λλμλμ§ κ°μ§νλ κ²μΌλ‘ μ νλ©λλ€.
CORS λ¬Έμ ν΄κ²°νκΈ°
CORS λ¬Έμ λ λλ²κΉ νκΈ° μ΄λ €μΈ μ μμ΅λλ€. λ€μμ μΌλ°μ μΈ λ¬Έμ ν΄κ²° νμ λλ€:
- λΈλΌμ°μ μ½μ νμΈ: λΈλΌμ°μ μ½μμ μΌλ°μ μΌλ‘ CORS λ¬Έμ μ λν μμΈν μ€λ₯ λ©μμ§λ₯Ό μ 곡ν©λλ€.
- λ€νΈμν¬ μμ² κ²μ¬: λΈλΌμ°μ μ κ°λ°μ λꡬλ₯Ό μ¬μ©νμ¬ μμ²κ³Ό μλ΅ λͺ¨λμ HTTP ν€λλ₯Ό κ²μ¬νμμμ€.
Originκ³ΌAccess-Control-Allow-Originν€λκ° μ¬λ°λ₯΄κ² μ€μ λμλμ§ νμΈνμμμ€. - μλ² μΈ‘ κ΅¬μ± νμΈ: μλ² μΈ‘ CORS ꡬμ±μ λ€μ νμΈνμ¬ μ¬λ°λ₯Έ μΆμ², λ©μλ, ν€λλ₯Ό νμ©νκ³ μλμ§ νμΈνμμμ€.
- λΈλΌμ°μ μΊμ μ§μ°κΈ°: λλλ‘ μΊμλ ν리νλΌμ΄νΈ μλ΅μ΄ CORS λ¬Έμ λ₯Ό μΌμΌν¬ μ μμ΅λλ€. λΈλΌμ°μ μΊμλ₯Ό μ§μ°κ±°λ μν¬λ¦Ώ λΈλΌμ°μ§ μ°½μ μ¬μ©ν΄ 보μμμ€.
- CORS νλ‘μ μ¬μ©: κ²½μ°μ λ°λΌ CORS μ νμ μ°ννκΈ° μν΄ CORS νλ‘μλ₯Ό μ¬μ©ν΄μΌ ν μλ μμ΅λλ€. κ·Έλ¬λ CORS νλ‘μλ₯Ό μ¬μ©νλ©΄ 보μ μνμ΄ λ°μν μ μλ€λ μ μ μ μνμμμ€.
- μλͺ»λ κ΅¬μ± νμΈ:
Access-Control-Allow-Originν€λ λλ½, μλͺ»λAccess-Control-Allow-MethodsλλAccess-Control-Allow-Headersκ°, μμ²μ μλͺ»λOriginν€λμ κ°μ μΌλ°μ μΈ μλͺ»λ ꡬμ±μ μ°Ύμ보μμμ€.
κ²°λ‘
κ΅μ°¨ μΆμ² 리μμ€ κ³΅μ (CORS)λ μλ°μ€ν¬λ¦½νΈ μ ν리μΌμ΄μ μμ μμ ν κ΅μ°¨ μΆμ² ν΅μ μ κ°λ₯νκ² νλ νμμ μΈ λ©μ»€λμ¦μ λλ€. κ°λ°μλ λμΌ μΆμ² μ μ± , CORS μν¬νλ‘μ°, κ·Έλ¦¬κ³ κ΄λ ¨λ λ€μν HTTP ν€λλ₯Ό μ΄ν΄ν¨μΌλ‘μ¨, ν©λ²μ μΈ κ΅μ°¨ μΆμ² μμ²μ νμ©νλ©΄μλ 보μ μ·¨μ½μ μΌλ‘λΆν° μ ν리μΌμ΄μ μ 보νΈνκΈ° μν΄ CORSλ₯Ό ν¨κ³Όμ μΌλ‘ ꡬνν μ μμ΅λλ€. CORS ꡬμ±μ λν λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄κ³ μ κΈ°μ μΌλ‘ ꡬνμ κ²ν νλ κ²μ μμ νκ³ κ²¬κ³ ν μΉ μ ν리μΌμ΄μ μ μ μ§νλ λ° λ§€μ° μ€μν©λλ€.
μ΄ μ’ ν© κ°μ΄λλ CORSλ₯Ό μ΄ν΄νκ³ κ΅¬ννκΈ° μν κ²¬κ³ ν κΈ°λ°μ μ 곡ν©λλ€. CORSλ₯Ό μ ννκ³ μμ νκ² κ΅¬ννλ €λ©΄ μ¬μ© μ€μΈ νΉμ μλ² μΈ‘ κΈ°μ μ λν 곡μ λ¬Έμμ μλ£λ₯Ό μ°Έμ‘°νλ κ²μ μμ§ λ§μμμ€.