Para um novo projeto node.js em que estou trabalhando, estou pensando em mudar de uma abordagem de sessão baseada em cookie (com isso, quero dizer, armazenar um ID em um armazenamento de valores-chave que contém sessões do usuário no navegador do usuário) para uma abordagem de sessão baseada em token (sem armazenamento de valores-chave) usando JSON Web Tokens (jwt).
O projeto é um jogo que utiliza o socket.io - ter uma sessão baseada em token seria útil em um cenário em que haverá vários canais de comunicação em uma única sessão (web e socket.io)
Como fornecer uma invalidação de token / sessão do servidor usando a abordagem jwt?
Eu também queria entender que armadilhas / ataques comuns (ou incomuns) eu deveria procurar com esse tipo de paradigma. Por exemplo, se esse paradigma estiver vulnerável aos mesmos / diferentes tipos de ataques que a abordagem de armazenamento de sessão / cookie.
Então, digamos que tenho o seguinte (adaptado disso e deste ):
Login da Loja de Sessão:
app.get('/login', function(request, response) {
var user = {username: request.body.username, password: request.body.password };
// Validate somehow
validate(user, function(isValid, profile) {
// Create session token
var token= createSessionToken();
// Add to a key-value database
KeyValueStore.add({token: {userid: profile.id, expiresInMinutes: 60}});
// The client should save this session token in a cookie
response.json({sessionToken: token});
});
}
Login baseado em token:
var jwt = require('jsonwebtoken');
app.get('/login', function(request, response) {
var user = {username: request.body.username, password: request.body.password };
// Validate somehow
validate(user, function(isValid, profile) {
var token = jwt.sign(profile, 'My Super Secret', {expiresInMinutes: 60});
response.json({token: token});
});
}
-
Um logout (ou invalidação) da abordagem de Armazenamento de Sessão exigiria uma atualização no banco de dados KeyValueStore com o token especificado.
Parece que esse mecanismo não existiria na abordagem baseada em token, pois o próprio token conteria as informações que normalmente existiriam no armazenamento de valores-chave.
isRevoked
opção ou tentar replicar a mesma funcionalidade. github.com/auth0/express-jwt#revoked-tokens