我现在需要两周的时间来学习和构建AngularJS
+ PHP
系统,而我仍然在努力进行身份验证。我一直在阅读很多关于AngularJS
的帖子,其中没有一个人似乎考虑了身份验证的安全方面。当我在另一篇文章中询问AngularJS
存储的安全性时,我也得到了一个有趣的回应,并且在处理tokens
时得到了Stormpath博客的两个很好的链接,这些博客涉及安全领域。
关于AngularJS
的大多数教程和示例似乎采用了JWT
方法并通过REST API
将该令牌发送到HTTP headers
,但鉴于该令牌已存储在Javascript这可以将它暴露给多种攻击类型。其中一个是MITM。为了抵御这种类型的攻击,解决方案是使用HttpOnly和Secure标志设置cookie。现在,令牌在每个请求上传递,它不是由Javascript存储的,而且是安全的。但是,这会在您对用户进行身份验证时提出问题:当您只处理来自同一服务器的HTTP请求时,这与使用会话有何不同?
检查用户是否已登录时,我们通常会检查$_SESSION
变量是否存在,让我们说uid
。现在基于令牌的方法,我们在HTTP headers
中发送令牌并读取该令牌,然后验证它并获取用户信息。在AngularJS
中,我们得到成功的回复并返回承诺。
会话具有由服务器处理的优点。他们创建一个会话,如果它仍然存在,它们会自动处理它。在处理基于令牌的身份验证时,如果用户没有自行销毁,则必须使用预定脚本来处理它的到期,刷新和销毁。这似乎太多了。
答案 0 :(得分:2)
使用令牌的想法是允许服务器完全无状态。服务器只提供一个登录服务,成功登录后返回一个临时令牌,它会立即忘记令牌,它不会将它存储在任何地方(数据库,内存)。
然后客户端在每个后续请求发送令牌。令牌具有自我验证的属性:它包括有效性,用户名和加密签名。
此类签名证明令牌对服务器有效,即使服务器已完全丢弃令牌。
这样服务器就不必处理令牌的过期/销毁:它可以检查传入的令牌并验证它们只检查令牌(感谢签名)。
这是JSON Web Tokens的优势:它们允许完全无状态的服务器,而不必管理身份验证令牌生命周期。