如何在多个标签页之间保持登录会话?

3
我正在开发一个网站,遇到了如何维护用户登录会话的最佳解决方案的问题。目前我正在使用Html5 Web存储“会话存储”来存储用户是否已登录。但是这种方法只能在单个选项卡中工作,而不能跨越浏览器的多个选项卡。
我应该使用Cookie还是LocalStorage?或者我应该维护服务器端会话,并在每次页面加载时检查用户是否已登录?
什么是最佳解决方案?请指导我。我在后端使用Node.js和mongodb,在前端使用Angular和jquery。

1
客户端会话登录,听起来真的不安全。服务器端是最佳解决方案,结合本地存储(因此可以跨选项卡工作)。 - albanx
我同意你的观点,但是让我困扰的是在应用服务器端会话时,每次页面加载都会向服务器发送一个关于用户是否已登录的请求,这对于页面加载来说听起来很耗时,而且如果用户忘记注销,则会一直保持登录状态,这也会影响本地存储。 顺便问一下,如何将服务器端与本地存储结合使用? 你的意思是像当用户登录时,我应该在本地存储中存储一个变量,表示该用户已登录? - Nishank Singla
通常情况下,您不需要关心用户是否已登录,会话将处理此问题,您只需要拥有一个上层模块/类或请求拦截器,每次检查当前会话是否经过授权。这就是 PHP 会话。在您的情况下唯一的区别是,您应该使用令牌来同步此会话,因为您正在使用 JS 应用程序。 - albanx
你可以稍微解释一下它是如何工作的吗?或者,也许你能够提供一些链接,让我了解如何实现你所说的东西。 - Nishank Singla
@albanx 请详细说明。 - SteveC
@SteveC 没有什么特别需要详细说明的:用户登录后向服务器发送请求。打开新标签页,向服务器发送REST / AJAX请求以检查用户是否已登录。就这样。可以使用localstorage存储当前状态,但不是必需的。 - albanx
1个回答

3
首先,您必须知道会话仅用于服务器端而不是客户端。其次,如果希望用户不必每次重新加载页面,可以尝试将数据保存在用户的cookies中,同时不要担心它会增加服务器负载时间。因为会话仅用于安全目的,我想通过将它们存储在客户端上,您并没有使用这个目的。现在最重要的问题是如何在服务器端存储它们。假设您的服务器出现故障,所有会话都将被删除。为了避免这种情况,请使用一些外部数据存储,如connect-mongo/connect-redis。Redis比Mongo更快,但如果您只想使用内存存储,则应查找memcached/cookie-sessions/jWT。希望这个答案有所帮助 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接