Для нового проекта node.js, над которым я работаю, я думаю о переключении с подхода, основанного на cookie-сеансе (я имею в виду, что он хранит идентификатор в хранилище ключей, содержащих пользовательские сеансы в пользовательском браузере) к подходу на основе токенов (без сохранения значения ключа) с использованием JSON Web Tokens (jwt).
Проект - это игра, в которой используется socket.io - наличие сеанса на основе токенов было бы полезно в таком сценарии, где в течение одного сеанса будет использоваться несколько каналов связи (web и socket.io)
Как бы обеспечить аннулирование токена/сеанса с сервера с помощью подхода jwt?
Я также хотел понять, какие общие (или необычные) подводные камни/атаки я должен искать с такой парадигмой. Например, если эта парадигма уязвима к тем же/различным типам атак, что и метод хранения сеанса /cookie.
Итак, скажем, у меня есть следующее (адаптировано из this и this):
Вход в магазин сессий:
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});
});
}
Вход на основе токена:
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});
});
}
-
Выход из системы (или недействительный) для подхода к хранилищу сеансов потребует обновления для KeyValueStore базы данных с указанным токеном.
Похоже, что такой механизм не будет существовать в подходе, основанном на токенах, поскольку сам токен будет содержать информацию, которая обычно существует в хранилище значений ключа.