W przypadku nowego projektu node.js, nad którym pracuję, zastanawiam się nad przejściem z sesji opartej na plikach cookie (mam na myśli przechowywanie identyfikatora w magazynie kluczy i wartości zawierającym sesje użytkownika w przeglądarce użytkownika) do sesji opartej na tokenach (bez magazynu kluczy i wartości) przy użyciu tokenów WWW JSON (jwt).
Projekt jest grą wykorzystującą socket.io - posiadanie sesji tokena byłoby przydatne w takim scenariuszu, w którym w jednej sesji będzie wiele kanałów komunikacji (web i socket.io)
W jaki sposób można zapewnić unieważnienie tokena / sesji z serwera przy użyciu metody jwt?
Chciałem również zrozumieć, na jakie częste (lub nietypowe) pułapki / ataki powinienem uważać przy tego rodzaju paradygmacie. Na przykład, jeśli ten paradygmat jest podatny na te same / różne rodzaje ataków co podejście oparte na przechowywaniu sesji / plikach cookie.
Powiedzmy, że mam następujące (dostosowane z tego i tego ):
Logowanie do sklepu sesyjnego:
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});
});
}
Logowanie tokena:
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});
});
}
-
Wylogowanie (lub unieważnienie) dla podejścia Session Store wymagałoby aktualizacji bazy danych KeyValueStore o podany token.
Wydaje się, że taki mechanizm nie istniałby w podejściu opartym na tokenach, ponieważ sam token zawierałby informacje, które normalnie istniałyby w magazynie klucz-wartość.
isRevoked
opcję lub spróbować replikować tę samą funkcjonalność. github.com/auth0/express-jwt#revoked-tokens