我的理解是,如果你在SPA中包含了你的登录页面,那么用户在你的所有代码都经过身份验证之前就已经收到了.然而,这似乎是一种非常普遍的做法.这不是非常不安全吗??为什么?
我的理解是,如果你在SPA中包含了你的登录页面,那么用户在你的所有代码都经过身份验证之前就已经收到了.然而,这似乎是一种非常普遍的做法.这不是非常不安全吗??为什么?
SPA将拥有所有页面structures(用于页面设计的html和javascript代码),但显然没有数据.数据将在随后的ajax请求中下载,这就是重点.要下载实际数据,用户必须通过服务器的身份验证,然后所有安全都将在服务器端实现.未经授权的用户不能从服务器访问数据.但是,页面的外观并不是秘密,任何人都可以查看SPA without data的页面,这很好.
这就是人们经常忽视的问题.Html是一回事,但SPA中的所有javascript都可以访问所有数据.基本上,SPA的代码是一个API文档,如果您愿意,它是后端可以处理的可能查询的列表.当然,这一切都应该是安全的服务器端,但情况并非总是如此,人们会犯错.有了SPA这样的"文档",攻击者就可以更容易地判断服务器端安全性,并在服务器端代码中发现授权/访问控制缺陷,从而能够访问攻击者不应访问的数据.
所以简而言之,访问页面外观(没有数据)应该是可以的.然而,泄露API在某些情况下的具体工作方式会帮助攻击者,因此会增加SPA固有的风险.
但必须指出的是,这并不重要.由于不应该使用隐晦的安全性(也就是说,事情的运行方式不应该是秘密的,只有凭证之类的东西才应该是秘密的),所以让任何人知道所有的javascript或完整的API文档都可以.然而,现实世界并不总是那么理想化.攻击者通常不知道这些东西是如何工作的,例如,能够分析SPA会有很大帮助,因为编写后端代码的人确实会犯错误.在其他情况下,API是公开的,并且无论如何都有文件记录,在这种情况下,拥有SPA不会带来进一步的风险.
如果将SPA置于身份验证之后(只有经过身份验证的用户才能下载SPA代码),这会使CDN访问变得非常复杂,尽管我认为一些内容交付网络确实支持某种级别的身份验证.
然而,在SPA之外有一个单独的(普通的旧html)登录页面确实有好处.如果您在SPA上有登录页面in,则只能获得javascript中的访问令牌(会话id,无论什么),这意味着javascript可以访问该令牌,并且只能将其存储在localStorage或普通的非httpOnly cookie中.这很容易导致身份验证令牌通过跨站点脚本(XSS)被盗.一个更安全的选项是有一个单独的登录页面,该页面将身份验证令牌设置为httpOnly cookie,任何javascript都无法访问,因此,它对XSS是安全的.但是请注意,这会带来CSRF的风险,您需要处理CSRF,而不是将令牌/会话id作为请求头之类的东西发送.
在许多情况下,在SPA中登录并在localStorage中存储身份验证令牌是可以接受的,但这应该是一个明智的决定,并且您应该意识到风险(在另一种情况下是XSS,而不是CSRF).