cefet_web

Server-side parte 5

Sessão, cookies, autenticação e autorização


Roteiro

  1. Cookies
  2. Sessões
  3. Autenticação e autorização

Cookies

🍪🍪🍪


Interação cliente x servidor com estado



Como os cookies são enviados

  1. Passo 1: o navegador solicita uma página. Passo 2: servidor envia página + cookie. Passo3: navegador solcita outra página e envia o cookie junto da requisição O navegador faz uma requisição
  2. O servidor pode enviar cookies de volta
    • O navegador pode salvar o dado em arquivo (eg, .txt) ou não
  3. Havendo cookies salvos para um domínio, o navegador os enviará de volta ao servidor nas requisições seguintes

Modelo alternativo: também é possível criar e usar cookies a partir do lado cliente, usando JavaScript


Mitos sobre cookies








  1. Cookie persistente
    • Fica armazenado no computador do cliente
    • Pode armazenar informação a longo prazo
    • Menos seguro: usuários (ou qualquer programa) podem abrir os arquivos dos cookies, ver/alterar valores etc.

O Chrome, por exemplo, armazena cookies persistentes com valores criptografados em um banco SQLite (~/.config/chromium/Default/Cookies)


Consertando nosso exemplo (1/2)


Consertando nosso exemplo (2/2)


Cookies no Express.js


Definindo cookies no Express.js (1/2)


Definindo cookies no Express.js (2/2)


Adendo: web storage vs cookies


Sessões

Servidores usando estado


O que é uma sessão?


Como sessões são estabelecidas

  1. O navegador faz requisição inicial ao servidor
  2. Servidor guarda o endereço IP/navegador do cliente, gera um identificador único de sessão e envia um cookie de volta
    • Cookies em PHP Em PHP, esse cookie tem o nome PHPSESSID
    • Em Java, JSESSIONID
    • Express.js, connect.sid
  3. O cliente envia o mesmo ID da sessão de volta ao servidor
  4. Servidor usa o ID recebido para recuperar os dados da sessão do cliente

Sessões no Express.js (1/2)


Sessões no Express.js (2/2)


Autenticação e Autorização

Identificação e permissões


Autenticação e autorização

Autenticação ~ Quem é você? Prove! ~ Tipicamente: usuário e senha ~ Mas também: one-time passwords, 2 fatores

Autorização ~ Ok, e o que você tem permissão pra fazer? ~ Tipicamente, definido em “papéis de usuário”


Autenticação HTTP básica

  1. Cliente desconhecido requisita um recurso protegido
  2. Servidor responde 401 Unauthorized com cabeçalho HTTP WWW-Authenticate: Basic
  3. Cliente lê esse cabeçalho e mostra janelinha pedindo usuário e senha
  4. Usuário digita e navegador inclui cabeçalho Authorization: Basic dcdvcmQ=
    • dcdvcmQ= está ilustrando que o navegador codifica os valores digitados usuario:senha em Base64

Bom: simples. Ruim: muito inseguro, péssima experiência de uso, difícil fazer “logout”.


Autenticação com sessão

  1. Cliente desconhecido provê suas credenciais
  2. Servidor as valida (autentica) apenas uma vez e cria sessão
  3. Cliente inclui identificação da sessão nas requisições subsequentes
  4. Servidor apenas avalia se a sessão ainda está válida a cada requisição
    • Convém expirar a sessão com o tempo

Bom: ainda simples, boa UX. Ruim: mantém estado (dificulta distribuição), cookies enviados em toda requisição, suscetível a session hijacking.


Autenticação com tokens


Partes do JWT: (1) Header


Partes do JWT: (2) Payload


Partes do JWT: (3) Signature


Funcionamento do JWT

  1. Cliente provê suas credenciais
  2. Servidor valida e retorna um JWT
  3. Cliente envia o cabeçalho para próximas requisições

    Authorization: Bearer <token>
    
  4. Servidor recebe requisição para recurso protegido, verifica se está conforme esperado e responde normalmente

Bom: sem estado, bom para serviços. Ruim: ainda suscetível a session hijacking, tokens não podem ser excluídos (devem expirar), não armazenar dados sensíveis.


Referências

  1. Seções 7.1, 7.2 e 9.1 do livro “Node.js in Action”
  2. Introdução a JWT em jwt.io
  3. Passport: pacote para autenticação e autorização p/ Express
  4. Boas práticas usando JWT e GraphQL em hasura.io