无论我如何推理它,似乎没有安全的方法来实现客户端呈现的单页面应用程序,该应用程序使用/访问会话上的信息进行身份验证,通过cookie,而不会严重损害安全性。我主要是想构建一个React应用程序,但似乎我需要使用SSR构建它以获得相对安全的身份验证版本。
我特别想到的用例是用户登录或注册然后获取带有会话ID的cookie。从那里,在服务器端实现中,我可以根据服务器存储的会话是否具有关联的用户ID来设置条件呈现,然后从那里提取用户信息并显示它。
但是,我无法想到一个客户端呈现的解决方案,用户可以在cookie上单独使用会话ID,而且不容易欺骗。一些不安全的实现将包括使用浏览器存储(本地/会话)。感谢。
答案 0 :(得分:0)
我认为这里的主要问题是你要混合网页的两个部分(至少根据HTML设定的内容)并将它们视为敏感信息。
网页中有两个主要部分 - 第一部分是显示格式,第二部分是数据。客户端呈现/单页应用程序的假设是格式本身不敏感,只需要保护数据。
如果是这种情况,您应该将客户端重定向视为生活质量功能的登录行为。您的服务器上的数据端点仍然受到保护 - 这意味着理论上未经身份验证的用户可能会破坏他所服务的静态HTML并提取页面布局和模板 - 但是如果没有数据填充它们就没有意义 - 这就是受保护的部分。
实际上 - 您的最终产品将是单页面应用程序,它向各种API端点发出请求以获取数据并填写所请求的页面模板。您甚至不需要存储复杂的会话状态 - 一个简单的标志通知客户端是否经过身份验证就足够了(这超出了您通常用于服务器端身份验证的功能,如cookie或令牌)
现在让我们说我是一个不好的恶意用户 - 我可以“欺骗” - 或者只是打开浏览器开发工具并将isAuthenticated标志设置为true让我跳过登录屏幕 - 现在是什么我会这样做吗?理论上我可以导航到我的服务/超级机密,而无需在本地重定向回客户端的登录页面 - 然后一旦相关页面尝试从服务器加载具有不存在的凭据的数据,它就会失败 - 最佳案例显示错误消息,最坏情况下有一些内部异常,而视图显示模板损坏。
所以简单地强调一下:
一个。如果您要保护的是 TEMPLATE ,则无法实现此客户端。
B中。如果您要保护的是 DATA ,那么您应该将门控/防止用户导航到受保护的页面作为生活质量功能而不是安全功能,因为这将在服务器上实现为该特定页面提供数据。