一尘不染

无效的JSON Web令牌

node.js

对于我正在研究的一个新的node.js项目,我正在考虑从基于cookie的会话方法切换(我的意思是,将ID存储到包含用户会话的键值存储中的用户浏览器中)到使用JSON
Web令牌(jwt)的基于令牌的会话方法(无键值存储)。

该项目是一个利用socket.io的游戏-在单个会话(web和socket.io)中会有多个通信渠道的情况下,使用基于令牌的会话将非常有用。

如何使用jwt方法从服务器提供令牌/会话无效?

我还想了解我应该用这种范例寻找哪些常见(或不常见)的陷阱/攻击。例如,如果此范例易受与基于会话存储/ Cookie的方法相同/不同类型的攻击的影响。

所以,说我有以下内容(适应了thisthis):

会话商店登录:

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数据库。

在基于令牌的方法中似乎不存在这样的机制,因为令牌本身将包含通常存在于键值存储中的信息。


阅读 249

收藏
2020-07-07

共1个答案

一尘不染

我也一直在研究这个问题,尽管以下所有想法都不是完整的解决方案,但它们可能会帮助其他人排除想法或提供其他想法。

1)只需从客户端删除令牌

显然,这对服务器端安全没有任何帮助,但是它确实通过删除令牌来阻止攻击者(即,在注销之前,他们必须窃取了令牌)。

2)创建一个令牌黑名单

您可以存储无效令牌,直到它们的初始到期日期为止,然后将它们与传入请求进行比较。但是,这似乎可以消除完全基于令牌的原因,因为您需要为每个请求触摸数据库。不过,存储空间可能会更小,因为您只需要存储注销和到期时间之间的令牌(这是一种直觉,并且绝对取决于上下文)。

3)保持令牌到期时间短并经常轮换

如果您将令牌的到期时间保持在足够短的时间间隔内,并让运行中的客户端在必要时跟踪并请求更新,则数字1将有效地用作完整的注销系统。此方法的问题在于,它使得无法在关闭客户端代码之间保持用户登录状态(取决于您设置到期间隔的时间)。

临时计划

如果发生紧急情况或用户令牌被盗,您可以做的一件事是允许用户使用其登录凭据更改基础用户查找ID。这将使所有关联的令牌无效,因为将不再能够找到关联的用户。

我还想指出,在令牌中包含上次登录日期是个好主意,这样您就可以在很长一段时间后强制重新登录。

关于使用令牌进行攻击的相似性/差异性,本文讨论了以下问题:https :
//github.com/dentarg/blog/blob/master/_posts/2014-01-07-angularjs-
authentication-with-cookies -vs-
token.markdown

2020-07-07