我觉得网络安全是一个非常有趣的主题,我正在努力学习如何制作API和RESTful Web服务。我正在阅读this answer,并对 Way-2 中描述的流程提出了一些问题。我理解Way-2的要点,但我在第4步开始提问。
首先让我们描述一下令牌变量。
$token = '123';
$tokenHashed = 'abc';
$tokenEncrypted = 'xyz';
在步骤4,我们验证了用户,现在是时候创建一个令牌并将其与数据库中的该用户关联,并将其发送到客户端。以下是关于该流程的问题:
我认为这涵盖了第4步中的所有内容,所以让我们继续第5步。关于第5步我关注的一件事就是它说:“然后调用者发送这个身份验证令牌......”我读过你从不传输令牌,所以这里有更多问题(假设客户端的令牌存储在状态之上的任何时尚答案中):
客户端是否发送令牌“hashed(abc)”,“encrypted(xyz)”或“both(123)”?
如果他们只是将我们发送给他们的方式发回去,那么重点是什么?如果有人以我们发送的任何形式劫持令牌,它是否总是与我们存储它的方式相匹配?例如,我向USER X发送一个随机散列字符串(abc)。用户Y拦截它并发送给我(abc)。我的数据库说“abc”,安全性失败。
我可能会随着答案的出现继续开发/添加问题。感谢您的帮助!
答案 0 :(得分:0)
JWT是一种解决方案,REST API是无状态的。这意味着来自客户端的每个请求都应包含处理请求所需的所有信息,因此php会话不合适。您可以阅读此内容Goodbye PHP Sessions, Hello JSON Web Tokens
您不需要在数据库中保存JWT令牌,只需在服务器端生成带有密钥的令牌并发送给客户端,客户端应在每次请求时发送令牌。
浏览器可以将令牌保存在html5 localStorage或cookie中。
服务器使用secrete密钥解析加密的令牌,然后从令牌中获取信息。
也许您可以在JWT令牌中保留一些消息,如: