我的理解是,如果你在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).

Vue.js相关问答推荐

Vue 3使用计算(computed)属性对象获取图像信息,在模板中呈现值时变为NaN

过渡如何在 Vue JS 3 中的图像上工作?

vue js如何将布尔值传到数据库

何时将代码拆分为 Nuxt 中的组件?

如何在Vue js 3中根据API响应替换react 值

如何将字符串中的
解析为 VUE.js 中的 html 标记

在Vue cli项目中,Laravel api app放在哪里以及如何在vue js中调用api?

Vue.js 中的 mount挂载是什么意思?

未捕获的类型错误:无法读取未定义的属性initializeApp

如何判断 Vue 组件是否处于活动状态

vuejs中通过变量动态调用方法

不需要提交Mutations的 vuex 操作

Vue 如何使用 slot 和 slot-props 测试组件

我可以修改 Vue.js VNodes 吗?

Vuex:无法读取未定义的属性'$store'

Vue路由在新页面上回到顶部

何时使用

Vue.js react性如何在幕后工作?

Vuetify 过渡:如何设置过渡速度

这个业务逻辑有多少属于 Vuex?