是否可以使用客户端呈现的应用程序和会话进行身份验证?

Qui*_*Kim 2 session node.js express reactjs react-router

无论我如何推理,似乎都没有安全的方式来实现客户端呈现的单页应用程序,该应用程序使用/访问会话信息进行身份验证,无论是通过 cookie,而不会严重损害安全性。我主要希望构建一个 React 应用程序,但似乎我需要使用 SSR 构建它以获得相对安全的身份验证版本。

我特别想到的用例是用户登录或注册,然后获取带有会话 ID 的 cookie。从那里,在服务器端实现中,我可以根据服务器存储的会话是否具有关联的用户 ID 来简单地设置条件渲染,然后从那里提取用户信息并显示它。

但是,我想不出客户端呈现的解决方案,其中用户可以在不容易欺骗的 cookie 上单独使用会话 ID。一些不安全的实现包括使用浏览器存储(本地/会话)。谢谢。

小智 5

我认为这里的主要问题是您将网页的两个部分混合在一起(至少根据 HTML 规定的内容)并将它们都视为敏感信息。

网页中有两个主要部分——第一个是显示格式,第二个是数据。客户端渲染/单页应用中的假设是格式本身不敏感,只需要保护数据。

如果是这种情况,您应该将客户端重定向到登录行为视为一种生活质量功能。您服务器上的数据端点仍将受到保护——这意味着理论上未经身份验证的用户可以对他所提供的静态 HTML 进行处理并提取页面布局和模板——但如果没有数据来填充它们,这些将毫无意义——这就是受保护的部分。

在实践中 - 您的最终产品将是一个单页面应用程序,它向各种 API 端点发出请求以获取数据并填写请求的页面模板。您甚至不需要存储复杂的会话状态 - 一个简单的标志通知客户端是否已通过身份验证就足够了(这超出了您通常用于服务器端身份验证(例如 cookie 或令牌)的范围)

现在让我们假设我是一个恶意用户,他做的不好 - 我可以“欺骗” - 或者真的只是打开浏览器开发工具并将 isAuthenticated 标志设置为 true 让我跳过登录屏幕 - 现在我该怎么办? 理论上,我可以导航到 my-service/super-secret,而无需在本地重定向回客户端的登录页面 - 然后一旦相关页面尝试使用不存在的凭据从服务器加载数据,它就会失败 -最好的情况是显示一条错误消息,最坏的情况是有一些内部异常和一个显示损坏模板的视图。

所以简单地强调一下:

A. 如果你想保护的是你的模板,那么就没有办法实现这个客户端。

B. 如果您想要保护的是您的数据,那么您应该将控制/阻止用户导航到受保护的页面视为生活质量功能而不是安全功能,因为这将在为该数据提供服务时在服务器上实现特定页面。