php - 在这种情况下,jwts 会降低性能并且不会改善任何东西吗?
问题描述
正如标题所说,我在问 JWT 是否是一个很好的补充,或者在这种情况下是否不需要或最好不要使用它们。我已经阅读了很多信息,但仍然无法给出完整的答案。
我正在考虑以下几点:
- 安全。
- 速度/响应时间/性能。
- 服务器中使用的资源(CPU、RAM 等)。
- 禁用多重登录(每个帐户不超过 1 个客户)。
我的情况客户端:
- 用 C++ 编写的桌面应用程序,需要持续的互联网连接。
- 1 打开应用程序时登录,然后每隔 X 秒发出一次请求,告诉服务器用户仍在使用该应用程序。(因为应用程序可能会崩溃,并且服务器不会知道用户不再使用该应用程序)。
- 浏览器从未使用过。
我的情况服务器端:
- 低资源云主机。
- 处理身份验证的登录 API。(PHP 和 MySQL)
- 每 X 秒检查一次处理这些请求的 API。(PHP 和 MySQL)
- 大约 50-70 个用户。
我现在是怎么做的:
- 首先:用户登录,使用 random_bytes() 创建一个 Token,存储在 db 中并发送给客户端。(检查下面的代码)
- 第二:客户端每 X 秒发送一次用户、密码和令牌。
- 第三:服务器检查令牌对该用户是否有效,并让用户继续使用应用程序,直到下一次检查。
- 第四:在用户没有请求 x+5 秒后,令牌过期。
对于“第一”和“第二”,我正在使用:
<?php
.
.
.
$token = bin2hex(random_bytes(32));
$stmt = $con->prepare("UPDATE accounts_table SET loggedin = 1, token = ? WHERE Username = ?");
$stmt->bind_param('ss', $token, $username);
$stmt->execute();
echo $token;
?>
对于“第三”,我正在使用:
<?php
.
.
.
$stmt = $con->prepare("SELECT * FROM accounts_table WHERE username= ? LIMIT 1");
$stmt->bind_param('s', $user);
$stmt->execute();
$result = $stmt->get_result();
$result = $result->fetch_array();
if ($token==$result['token'])
{in pseudo-code} tell the client that everything is ok
else
{in pseudo-code} tell the client that he is not allowed to use the app anymore.
?>
关于我之前写的东西。
- 安全
从我从 StackExchange 和 StackOverflow 的很多答案中读到的内容来看,只要私钥不被盗,JWT 是安全的。如果有什么我错过了,请告诉我。
- 速度/响应时间/性能和 3. 服务器中使用的资源(CPU、RAM 等)
根据我在有关 JWT 的文章中读到的内容(例如:Why jwts as session tokens),它们会增加请求的大小,并增加每个请求所需的资源(CPU、RAM 等),因为它必须计算哈希。我还阅读了有关 HTTP/2 hpack 的 http 的静默杀手功能,这表明由于压缩,增加的大小并不重要。
但是我仍然担心资源使用量的增加,性能影响会明显吗?我不得不问这个问题,因为我不知道如何重现 50 个用户同时使用该应用程序的情况。
- 禁用多重登录(每个帐户不超过 1 个客户)。
由于登录会使用“loggedin”标志检查用户是否未登录,因此不允许多重登录。如果您发现缺陷,请告诉我。
- 额外:有没有更好的方法?
我也阅读了有关会话的信息,但是需要吗?它会改善我的情况还是会一样?
提前致谢。
解决方案
推荐阅读
- javascript - 使用 Javascript 在 Wordpress 页面上自动刷新 2 张图片
- c# - 插入数据库时用字符创建序列号
- c++ - 我们如何在 c++ 中使用三角函数时纠正 nan
- rust - 生命周期不会延长,但只有当结构中有一个特征对象时
- node.js - 无法从 io.emit() 接收数据
- html - 将滚动条添加到数据表会消除其响应性
- php - 在 WooCommerce 单品中显示产品属性列表的简码
- spring-security - spring security - 在没有 oAuth 令牌的情况下授权预发送请求
- caching - 我可以在生产中使用 redis 缓存免费版进行基本用途吗?
- c# - 如何从编辑视图 ASP.NET MVC 更新两个表?