Middlewares

Middlewares são funções que tem acesso aos objetos req (request) e res (response), respectivamente requisição e resposta. Os middlewares podem executar qualquer tipo de código e realizar alterações nos objetos req e res, entre outros.

Segurança

O Express é apenas um framework de aplicação que disponibiliza um servidor Web com um conjunto de recursos necessários para a criação de uma API. Esse servidor precisa ser protegido e é tarefa do desenvolvedor configurar alguns middlewares para elevar o nível de segurança do Express.

Helmet

Helmet é um middleware de segurança que ajuda a proteger o Express, fazendo ajustes nos cabeçalhos HTTP. Por padrão, o Helmet possui as seguintes proteções:

Para mais informações sobre o Helmet, acesse https://helmetjs.github.io/.

Cabeçalho padrão do Express

Para visualizar os cabeçalhos da resposta, abra o Postman e faça uma requisição GET em http://localhost:3000 e inspecione a aba Headers.

Connection → keep-alive
Content-Length → 13
Content-Type → text/html; charset=utf-8
Date → Sat, 22 Sep 2018 21:07:27 GMT
ETag → W/"d-oPRzYb9qK1AQJa1lUfQSoZqXcws"
X-Powered-By → Express

Instalando o Helmet

Para instalar o Helmet, abra o Terminal e digite:

$ npm i helmet

Esse comando instala o Helmet como dependência no package.json.

  "dependencies": {
    "helmet": "3.13.0"
  }

Integração com o Express

Para integrar o Helmet no Express, edite o arquivo app.js.

const express = require('express');
const helmet = require('helmet'); // importar o Helmet

const app = express();

app.use(helmet()); // habilitar o Helmet

app.get('/', (req, res) => res.json({ message: 'Hello Express' }));

module.exports = app;

Para visualizar os cabeçalhos da resposta, abra o Postman e faça uma requisição GET em http://localhost:3000 e inspecione a aba Headers.

Connection → keep-alive
Content-Length → 13
Content-Type → text/html; charset=utf-8
Date → Sat, 22 Sep 2018 21:10:22 GMT
ETag → W/"d-oPRzYb9qK1AQJa1lUfQSoZqXcws"

--- Helmet ---

Strict-Transport-Security → max-age=15552000; includeSubDomains
X-Content-Type-Options → nosniff
X-DNS-Prefetch-Control → off
X-Download-Options → noopen
X-Frame-Options → SAMEORIGIN
X-XSS-Protection → 1; mode=block

O Helmet fez as alterações nos cabeçalhos e adicionou as proteções no Express. É importante notar que ele removeu o X-Powered-By: Express.

CORS

CORS é o acrônimo para Cross-Origin Resource Sharing que significa Compartilhamento de Recursos de Origem Cruzada. CORS é uma especificação que define quais e como os recursos de um servidor podem ser acessados. Devemos configurar o CORS para elevar o nível de segurança da API. O CORS permite definir:

  • Quais origens (domínios) podem realizar requisições
  • Quais métodos podem ser utilizados
  • Quais cabeçalhos são permitidos

Para mais informações sobre o CORS, acesse MDN - CORS.

Instalando o CORS

Para instalar o CORS, abra o Terminal e digite:

$ npm i @robertoachar/express-cors

Esse comando instala o CORS como dependência no package.json.

  "dependencies": {
    "@robertoachar/express-cors": "1.0.2"
  }

Integração com o Express

Para integrar o CORS no Express, edite o arquivo app.js.

const cors = require('@robertoachar/express-cors'); // importar o CORS
const express = require('express');
const helmet = require('helmet');

const app = express();

app.use(helmet());
app.use(cors()); // habilitar o CORS

app.get('/', (req, res) => res.json({ message: 'Hello Express' }));

module.exports = app;

Para visualizar os cabeçalhos da resposta, abra o Postman e faça uma requisição GET em http://localhost:3000 e inspecione a aba Headers.

Access-Control-Allow-Headers → Authorization, Content-Type
Access-Control-Allow-Methods → GET, POST, PUT, PATCH, DELETE
Access-Control-Allow-Origin → *

Esse middleware configura o CORS com as opções mais comuns utilizadas por APIs públicas. Ele permite acesso de quaquer origem (*), aceita os métodos GET, POST, PUT, PATCH e DELETE, e aceita os cabeçalhos Authorization e Content-Type.

Dica

Caso seu cenário não seja tão permissivo, você tem 02 opções:

  1. Utilizar outro middleware
  2. Configurar o CORS direto no Express

Desempenho

Outro fator que deve ser levado em conta na construção de uma aplicação é o desempenho. Existem diversas técnicas para melhorar o desempenho de uma aplicação. Uma delas é diminuir a quantidade de dados que é trafegado entre o cliente e o servidor.

compression

compression é um middleware de desempenho que auxilia o Express a comprimir os dados que são trafegados. O compression suporta deflate e gzip.

Para mais informações sobre o compression, acesse https://github.com/expressjs/compression.

Instalando o compression

Para instalar o compression, abra o Terminal e digite:

$ npm i compression

Esse comando instala o compression como dependência no package.json.

  "dependencies": {
    "compression": "1.7.3"
  }

Integração com o Express

Para integrar o compression no Express, edite o arquivo app.js.

const compression = require('compression'); // importar o compression
const cors = require('@robertoachar/express-cors');
const express = require('express');
const helmet = require('helmet');

const app = express();

app.use(helmet());
app.use(compression()); // habilitar o compression
app.use(cors());

app.get('/', (req, res) => res.json({ message: 'Hello Express' }));

module.exports = app;

Utilidade

Os middlewares não servem apenas para segurança e desempenho. Existem middlewares que estendem as funcionalidades do Express e facilitam algumas tarefas.

body-parser

body-parser é um middleware de utilidades. Ele analisa (parse) a requisição antes de chegar nas rotas e disponibiliza o objeto req.body com os dados que foram enviados através das requisições. Ele suporta application/json e application/x-www-form-urlencoded.

Para mais informações sobre o body-parser, acesse https://github.com/expressjs/body-parser.

Instalando o body-parser

Para instalar o body-parser, abra o Terminal e digite:

$ npm i body-parser

Esse comando instala o body-parser como dependência no package.json.

  "dependencies": {
    "body-parser": "1.18.3"
  }

Integração com o Express

Para integrar o body-parser no Express, edite o arquivo app.js.

const bodyParser = require('body-parser'); // importar o body-parser
const compression = require('compression');
const cors = require('@robertoachar/express-cors');
const express = require('express');
const helmet = require('helmet');

const app = express();

app.use(helmet());
app.use(compression());
app.use(cors());
app.use(bodyParser.urlencoded({ extended: false })); // application/x-www-form-urlencoded
app.use(bodyParser.json()); // application/json

app.get('/', (req, res) => res.json({ message: 'Hello Express' }));

module.exports = app;

Mundo Real

Nota

Não existe "bala de prata", mas os middlewares ajudam a melhorar a segurança.

É importante você entender que toda aplicação Web está suscetível à ataques. E é mais importante ainda entender que é sua responsabilidade manter a aplicação segura.

Procure manter os middlewares de segurança sempre atualizados.

Resumo

  • Configuramos alguns middlewares no servidor Web
  • Entendemos a importância de utilizar pelo menos os middlewares de segurança