- ν리νλΌμ΄νΈ μμ²
- μ€μ μμ²μ 보λ΄κΈ° μ , OPTIONS λ©μλλ‘ μ¬μ μμ²μ λ³΄λ΄ ν΄λΉ μΆμ² 리μμ€μ μ κ·Ό κΆνμ΄ μλμ§λΆν° νμΈνλ κ²
ν리νλΌμ΄νΈ μμ²μ΄ νμν μ΄μ
- μ€μ μμ²μ 보λ΄κΈ° μ μ 미리 κΆν νμΈμ ν μ μκΈ° λλ¬Έμ, μ€μ μμ²μ μ²μλΆν° ν΅μ§Έλ‘ 보λ΄λ κ²λ³΄λ€ ν¨μ¨μ μ΄λ€.
- CORSμ λλΉκ° λμ΄μμ§ μμ μλ²λ₯Ό 보νΈν μ μμ΅λλ€.
- λ¨μ μμ²
- νΉμ μ‘°κ±΄μ΄ λ§μ‘± λλ©΄ ν리νλΌμ΄νΈ μμ²μ μλ΅νκ³ μμ²μ 보λ΄λ κ²μ λ§ν©λλ€.
λ¨μ μμ² μ‘°κ±΄
- GET, HEAD, POST μμ² μ€ νλλ μ‘΄μ¬
- Accept, Accept-Language, Content-Language, Content-Type ν€λμ κ°λ§ μλμ μ€μ ν μ μλ€.
- μΈμ¦ μ 보λ₯Ό ν¬ν¨ν μμ²
- μμ² ν€λμ μΈμ¦ μ 보λ₯Ό λ΄μ 보λ΄λ μμ²
CORS μ€μ
- νλ‘ νΈ μΈ‘ : μμ² ν€λ withCredentials : true
- μλ² μΈ‘ : μλ΅ ν€λ : Access-Control-Allow-Credentials : true
- μλ² μΈ‘μμ Access-Control-Allow-Originμ μ€μ ν λ, λͺ¨λ μΆμ²λ₯Ό νμ©νλ€λ λ»μ (*)λ‘ μ€μ νλ©΄ μλ¬κ° λ°μ, μΆμ² μ ννκ² νκΈ°
https://nodejs.org/ko/docs/guides/anatomy-of-an-http-transaction/
μλ² μμ±
const http = require('http');
const server = http.createServer((request, response) => {
// μμ
μ€ν
});
μμ² λ°λ
let body = [];
request.on('data', (chunk) => {
body.push(chunk);
}).on('end', () => {
body = Buffer.concat(body).toString();
// μ¬κΈ°μ `body`μ μ 체 μμ² λ°λκ° λ¬Έμμ΄λ‘ λ΄κ²¨μμ΅λλ€.
});
HTTP μνμ½λ
response.statusCode = 404; // ν΄λΌμ΄μΈνΈμκ² λ¦¬μμ€λ₯Ό μ°Ύμ μ μλ€κ³ μλ €μ€λλ€.
basic-server.js
const server = http.createServer((request, response) => {
// CORS κ΄λ ¨ ν€λλ₯Ό OPTIONS μλ΅μ μ μ©ν΄μΌ ν©λλ€.
if (request.method === 'OPTIONS') {
response.writeHead(200, defaultCorsHeader);
response.end();
return;
}
let body = [];
if(request.method === 'POST' && request.url === '/lower') {
request.on('data', (chunk) => {
body.push(chunk);
}).on('end', () => {
body = Buffer.concat(body).toString().toLowerCase();
response.writeHead(200, defaultCorsHeader);
response.end(body);
return;
});
}
if(request.method === 'POST' && request.url === '/upper') {
request.on('data', (chunk) => {
body.push(chunk);
}).on('end', () => {
body = Buffer.concat(body).toString().toUpperCase();
response.writeHead(200, defaultCorsHeader);
response.end(body);
return;
});
}
else {
response.statusCode = 404;
response.end();
}
}).listen(PORT, ip, () => {
console.log(`http server listen on ${ip}:${PORT}`);
});
const defaultCorsHeader = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type, Accept',
'Access-Control-Max-Age': 10
};
// CORS κ΄λ ¨ ν€λλ₯Ό OPTIONS μλ΅μ μ μ©ν΄μΌ ν©λλ€.
if (request.method === 'OPTIONS') {
response.writeHead(200, defaultCorsHeader);
response.end();
return;
}
let body = [];
if(request.method === 'POST' && request.url === '/lower') {
request.on('data', (chunk) => {
body.push(chunk);
}).on('end', () => {
body = Buffer.concat(body).toString().toLowerCase();
response.writeHead(200, defaultCorsHeader);
response.end(body);
return;
});
}
if(request.method === 'POST' && request.url === '/upper') {
request.on('data', (chunk) => {
body.push(chunk);
}).on('end', () => {
body = Buffer.concat(body).toString().toUpperCase();
response.writeHead(200, defaultCorsHeader);
response.end(body);
return;
});
} else { // elseμμ statusCode μλ¬νμ
response.statusCode = 404;
response.end();
}
response.writeHead(200, defaultCorsHeader);