会话的原则是在服务器端保存数据,只能由具有相应会话ID的用户访问.
有两种数据:私人或公共与客户的关系.会话它当然是私人的公共访问.
我们通常存储用户ID和一些随机数据(我没有任何具体的例子).
我正在考虑根本不使用会话.而是使用检查用户发送的数据的有效性的函数.服务器将具有用于散列用户数据的私钥.
例如,如果用户的id = 9999,我们通常将其存储在与会话ID相关联的文件中.每次客户端发出请求时,我们都会检查其会话ID并从与之关联的会话文件中检索数据.
我正在考虑在客户端存储会话数据,每次客户端发出请求时,它都会发送此数据和数据的哈希值.
如果用户登录,则发送其凭据,服务器返回其id,时间戳和基于用户ID和私钥计算的哈希值.对于将来的任何请求,服务器使用相同的函数,如果生成的散列相同,则会话有效并且数据先前已经过验证.
这是替换会话的有效方法吗?除了不保存服务器专用会话数据之外还有哪些缺点?
我很关心速度,我做了一个小测试......
<?php
$session = array(
'userId' => 999,
'timestamp' => time()
);
$privateKey = 'da39a3ee5e6b4b0d3255bfef95601890afd80709';
$startTime = microtime(true);
for ($i = 0; $i < 1000000; $i++){
$hash = hash_hmac('sha1', json_encode($session), $privateKey);
}
echo 'Script took ' . (microtime(true) - $startTime) . ' seconds';
Run Code Online (Sandbox Code Playgroud)
......打印
Script took 5.246542930603 seconds
Run Code Online (Sandbox Code Playgroud)
我在笔记本电脑(Intel Duo)上运行它.在我看来,这是一个负担得起的时间(每哈希0.000005247).测试是否正确?
编辑:时间戳与用户ID一起进行哈希处理,以确保会话到期.所以在服务器端,即使会话有效,但它太旧,也可以认为是过期的.
那么,如果我们使用私钥散列数据和时间戳,它是否可用于生产?
我可以想到一些缺点......