Javascript 如何在web应用程序呈现的服务器端安全地处理身份验证?

Javascript 如何在web应用程序呈现的服务器端安全地处理身份验证?,javascript,authentication,vue.js,vuejs2,server-side-rendering,Javascript,Authentication,Vue.js,Vuejs2,Server Side Rendering,我自己想到了一些方法: 使用cookie。这需要CSRF保护和一些复杂的逻辑,因为需要统一API和主域的cookie。此外,cookies在整体安全性方面似乎有点令人毛骨悚然 在客户机上呈现与身份验证相关的内容。这可以正常工作,但像导航栏这样简单的东西是与身份验证相关的,在身份验证时,导航栏应该隐藏登录/注册按钮。通过对我现有应用程序的一些概述,SSR在这一点上看起来毫无意义 更好的方法是什么?安全实用的东西 编辑:如果能给我一个评论,说明否决投票的原因,我将不胜感激。我提供了一个明确的答案

我自己想到了一些方法:

  • 使用cookie。这需要CSRF保护和一些复杂的逻辑,因为需要统一API和主域的cookie。此外,cookies在整体安全性方面似乎有点令人毛骨悚然
  • 在客户机上呈现与身份验证相关的内容。这可以正常工作,但像导航栏这样简单的东西是与身份验证相关的,在身份验证时,导航栏应该隐藏登录/注册按钮。通过对我现有应用程序的一些概述,SSR在这一点上看起来毫无意义
更好的方法是什么?安全实用的东西

编辑:如果能给我一个评论,说明否决投票的原因,我将不胜感激。我提供了一个明确的答案,回答了一些问题,比如和,还有许多发布在GitHub上的问题,以及发布在不同框架特定论坛上的线程


HTTP是无状态的。您需要以某种方式将客户机与服务器关联起来。旧的标准方法假设客户机是哑的,使用cookies进行关联,浏览器会自动为您传递。总的来说,它仍然是通过HTTPs保持会话的最安全的方式

如果您不喜欢Cookie,并且假设一个智能客户端可以运行代码,那么就使用令牌(最好是JWT)并将它们放在localstorage中。当然,请确保您是通过HTTPs运行的,并且您仍然必须防范XSS攻击


这就是它的全部内容-请访问security.stackexchange.com,了解为什么尝试任何自定义操作都是一个坏主意。

HTTP是无状态的。您需要以某种方式将客户机与服务器关联起来。旧的标准方法假设客户机是哑的,使用cookies进行关联,浏览器会自动为您传递。总的来说,它仍然是通过HTTPs保持会话的最安全的方式

如果您不喜欢Cookie,并且假设一个智能客户端可以运行代码,那么就使用令牌(最好是JWT)并将它们放在localstorage中。当然,请确保您是通过HTTPs运行的,并且您仍然必须防范XSS攻击


仅此而已-请访问security.stackexchange.com,了解为什么尝试任何自定义操作都是一个坏主意。

您看到了吗?@webnoob阅读自述文件,它似乎没有提到任何与服务器端渲染相关的内容,没有?我只是在快速浏览了您的问题后,将其作为一种身份验证方法提供给您。不确定它是否有用:)SPA的问题是你不能真正依赖太多,因为客户可以改变一切-模糊和缩小只会让他们慢下来。@webnoob这就是为什么JWT是一件事。除了你,任何人都不能篡改它。此外,代码模糊和缩小与安全无关,它所做的只是最小化网络下载,不,它不会减慢软件的速度。请详细说明“cookie在整体安全方面似乎有点令人毛骨悚然”?你看到了吗?@webnoob正在阅读自述,它似乎没有提到任何与服务器端渲染相关的内容,没有?我只是在快速浏览了一下您的问题后,将其作为一种身份验证方法提供。不确定它是否有用:)SPA的问题是你不能真正依赖太多,因为客户可以改变一切-模糊和缩小只会让他们慢下来。@webnoob这就是为什么JWT是一件事。除了你,任何人都不能篡改它。此外,代码混淆和缩小与安全无关,它所做的只是最大限度地减少网络下载,不,它不会减慢软件的速度。请注意详细说明“Cookie在整体安全性方面也有点令人毛骨悚然”?鉴于RESTful API,将会话与Cookie一起使用无法达到目的。据我所知,JWT是一种在客户处持有无限制索赔的方式。问题是
localStorage
在初始请求时不像cookies那样发送,因此不可能使用这种机制在初始呈现请求时验证用户的真实性。您必须回到HTTP是无状态协议的事实<代码>卷曲http://example.net或者打开一个空白的浏览器将不会向服务器发送任何标识,服务器将不知道该标识来自何处,也无法将其绑定回用户。在初始请求中将浏览器与站点关联的唯一工作机制是cookies。如果我通过api调用登录(创建jwt),我可以在对我的站点的任何ajax调用中使用此jwt,但是如果我通过键入浏览器的地址栏导航到我的应用程序的另一个页面,那么jwt令牌将不会发送到服务器。因此,即使我已经“登录”到该站点(体验方面),我实际上并没有登录(可以理解,因为http是无状态的)。那么我们如何解决这个问题呢?通过ajax调用完成身份验证过程,然后在页面重新加载/导航时保持身份验证?将jwt令牌存储在localstorage中。您导航到的新页面仍在您的域中,可以从那里访问它。仍然像上一页一样验证API调用did@kert因此,对于服务器的第一个
GET
请求,它同样不起作用,只适用于以后的ajax调用,因为
localStorage
是本地的。给定一个RESTful API,将会话与cookie一起使用是不可能的。据我所知,JWT是一种在客户处持有无限制索赔的方式。问题是
localStorage
在初始请求时不像cookies那样发送,因此不可能使用这种机制在初始呈现请求时验证用户的真实性。您必须回到HTTP是无状态协议的事实<代码>卷曲http://example.net或者打开一个空白的浏览器将不会向服务器发送任何标识,服务器将不知道该标识来自何处,也无法将其绑定回用户。关联的唯一工作机制