TIL [Web Server 기초]

김은혁·2021년 7월 2일
0

CORS

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

OPTIONS라는 preflight request를 통해 서버에 CORS Origin에 대한 Request 정보를 확인하고 허가를 받음.


Express 라이브러리

Express.js는 Node.js 환경에서 웹 서버, 또는 API 서버를 제작하기 위해 사용되는 인기 있는 프레임워크이다. Express로 서버를 구현했을 때, http 모듈로 작성한 서버보다 좋은 점은 다음과 같다.

  • 미들웨어 추가가 편리하다.
  • 자체 라우터를 제공한다.

미들웨어

미들웨어를 사용하는 상황

  1. 모든 요청에 대해 URL이나 메소드를 확인할 때

미들웨어는 말 그대로 프로세스 중간에 관여하여 특정 역할을 수행한다. 미들웨어 내부에서는 아무런 작업을 하지 않고, 그저 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);
  1. POST 요청 등에 포함된 body(payload)를 구조화 할 때 (쉽게 얻어내고자 할 때)

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가 담김.
}
  1. 모든 요청 / 응답에 CORS 헤더를 붙여야 할 때
// 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 모듈 적용
  1. 요청 헤더에 사용자 인증 정보가 담겨있는지 확인할 때
// 토큰을 통해 로그인 여부를 확인
app.use((request, response, next) => {
  if (request.headers.token) {
    request.isLoggedIn = true;
    next();
  }
  else {
    response.status(400).send('invalid user');
  }
})

라우팅과 API

라우팅

메소드와 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) => {
  // 무엇이든 동작
})

0개의 댓글