Cross Origin Resource Sharing
cross origin에서 리소스(서버자원)을 요청하여 사용하는 것. 하지만 보안 상의 이유로 브라우저들은 스크립트 내에서 초기화되는 cross-origin HTTP 요청을 제한하는데 서버가 허용한 범위 내에서는 요청이 허용된다.
const defaultCorsHeaders = {
'access-control-allow-origin' : '*',
'access-control-allow-method' : 'GET, POST, PUT, DELETE, OPTIONS',
'access-control-allow-headers' : 'content-type, accept',
'access-control-max-age' : 10
};
- 모든 도메인을 허용한다
- 메소드는 GET, POST, PUT, DELETE, OPTIONS를 허용한다
- 헤더에는 content-type, accept를 허용한다
- preflight request는 10초까지 허용한다
OPTIONS라는 preflight request를 통해 서버에 CORS Origin에 대한 Request 정보를 확인하고 허가를 받음.
Express.js는 Node.js 환경에서 웹 서버, 또는 API 서버를 제작하기 위해 사용되는 인기 있는 프레임워크이다. Express로 서버를 구현했을 때, http 모듈로 작성한 서버보다 좋은 점은 다음과 같다.
미들웨어를 사용하는 상황
미들웨어는 말 그대로 프로세스 중간에 관여하여 특정 역할을 수행한다. 미들웨어 내부에서는 아무런 작업을 하지 않고, 그저 next 함수를 호출하여 다음 미들웨어로 데이터를 전달할 뿐이다.
const express = require('express');
const app = express();
const myLogger = function (request, response, next) {
next();
};
app.use(myLogger);
app.get('/', function (request, response) {
response.send('Hello');
});
app.listen(3000);
node.js로 HTTP body를 받을 때에는 Buffer를 조합해서 다소 복잡한 방식으로 body를 얻어낼 수 있다.
let body = [];
request.on('data', (chunk) => {
body.push(chunk);
}).on('end', () => {
body = Buffer.concat(body).toString();
});
body-parser 미들웨어를 사용하면 이 과정이 한결 간단해진다.
const bodyParser = require('body-parser')
const jsonParser = bodyParser.json()
// 생략
app.post('/api/users', jsonParser, function (request, response) {
// request.body에는 JSON 형태로 payload가 담김.
}
// node.js 에 CORS를 적용
const defaultCorsHeaders = {
'access-control-allow-origin' : '*',
'access-control-allow-method' : 'GET, POST, PUT, DELETE, OPTIONS',
'access-control-allow-headers' : 'content-type, accept',
'access-control-max-age' : 10
};
// 생략
if (request.method === 'OPTIONS') {
response.writeHead(201, defaultCorsHeader);
response.end();
}
// cors 모듈을 이용
const cors = require('cors')
// 생략
app.use(cors()); // 모든 요청에 대해 CORS 허용
-------
app.get('/products/:id', cors(), function(request, response, next) {
response.json({msg : 'This is CORS-enabled for a Single Route'});
}); // 특정 요청에만 CORS 모듈 적용
// 토큰을 통해 로그인 여부를 확인
app.use((request, response, next) => {
if (request.headers.token) {
request.isLoggedIn = true;
next();
}
else {
response.status(400).send('invalid user');
}
})
메소드와 URL(/lower, /upper 등)로 분기점을 만드는 것을 라우팅이라 한다. 클라이언트는 특정한 HTTP 요청 메소드나 서버의 특정 URI로 HTTP 요청을 보낸다. 라우팅은 클라이언트의 요청에 해당하는 메소드와 Endpoint에 따라 서버가 응답하는 방법을 결정하는 것이다.
// Node.js 코드로 구현한 라우팅
const requestHandler = (request, response) => {
if (request.url === '/경로') {
if (request.method === 'GET') {
response.end(data);
}
else if (request.method === 'POST')
request.on('data', (request, response) => {
// 무엇이든 동작
});
}
}
}
// Express의 라우터로 구현한 라우팅
const router = express.Router()
router.get('/경로', (request, response) => {
response.send(data);
});
router.post('/경로', (request, response) => {
// 무엇이든 동작
})