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

这个项目是一个利用套接字的游戏.io——在一个会话中有多个通信通道(web和socket.io)的情况下,使用基于令牌的会话将非常有用

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

我还想了解在这种模式下,我应该注意哪些常见(或不常见)的trap /攻击.例如,如果这种模式容易受到与基于会话存储/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

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

推荐答案

我也一直在研究这个问题,虽然下面的想法都不是完全的解决方案,但它们可能会帮助其他人排除想法,或者提供更多的想法.

1) Simply remove the token from the client

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

2) Create a token blocklist

您可以将无效令牌存储到其初始到期日,并将其与传入的请求进行比较.不过,这似乎否定了一开始就完全基于令牌的原因,因为每个请求都需要触碰数据库.不过,存储空间可能会更小,因为您只需要存储注销和注销之间的 token ;过期时间(这是一种直觉,而且肯定取决于上下文).

3) Just keep token expiry times short and rotate them often

如果您将令牌到期时间保持在足够短的时间间隔内,并让正在运行的客户端跟踪并在必要时请求更新,那么1号将有效地作为一个完整的注销系统工作.这种方法的问题在于,它使得用户无法在客户端代码关闭之间保持登录(取决于您的到期时间间隔).

Contingency Plans

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

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

关于使用 token 的攻击的相似性/差异,这篇文章提出了一个问题:https://github.com/dentarg/blog/blob/master/_posts/2014-01-07-angularjs-authentication-with-cookies-vs-token.markdown

Javascript相关问答推荐

在nodejs中渲染网页时永远不会结束加载图标

获取但只获取状态?

以Angular 删除 beforeunload 事件

用于访问 svg transform translate 的 x/y 值的 Javascript

如何使数组中的向量不改变其值?

react js中的搜索过滤器

React Native FlatList 项目消失

如何将下拉菜单与按钮对齐

为什么我的 React.useEffect() 中有太多的重新渲染?

使用 jquery-confirm 确认框停止回发,似乎无法获得返回值(webform 项目)

如何将对象键设置为公分母?

如何让 Javascript 跟踪我的分数增量?

onclick 更改所有映射的项目,而不仅仅是一个

删除芥末 CDN 存储桶 204 错误未删除

我不能用 useEffect 在 React 中添加类名还是?

为什么这个二维数组过滤不起作用?

Form.IO - 如何使 DataGrid 中的下拉选择变得可见

如何在react 路由dom中将不存在的路由重定向到主页?

findIndex 方法在值存在时不检索索引

如何使用 html 中的 select 元素创建 javascript 测验并将结果粘贴到 main