【发布时间】:2020-11-10 20:04:09
【问题描述】:
我只想为当前浏览器会话存储某个设置(直到浏览器窗口未关闭)
我有两个选择:
- 设置一个没有 max-age 的 cookie(视为会话 cookie)
- 使用会话存储
要存储会话数据,使用没有 max-age 的 cookie 与使用会话存储有什么区别?
【问题讨论】:
标签: session-cookies session-storage
我只想为当前浏览器会话存储某个设置(直到浏览器窗口未关闭)
我有两个选择:
要存储会话数据,使用没有 max-age 的 cookie 与使用会话存储有什么区别?
【问题讨论】:
标签: session-cookies session-storage
主要区别在于 cookie 和会话存储在不同的位置。
Cookie 存储在用户的浏览器中,并随用户向服务器发出的每个请求发送。这意味着您必须注意要存储的数据的大小,并确保不会在其中存储任何敏感数据(除非您在将数据存储到 cookie 之前对其进行加密)。
会话将数据存储在服务器上,因此您不必担心大小和安全性。为了让服务器知道哪个会话数据属于哪个请求,使用了一个 cookie,该 cookie 在浏览器窗口关闭时标记为过期。
因此,根据您要存储的数据,您可以使用任何一种。
【讨论】:
会话 cookie 和 Window.sessionStorage 解决不同的问题。
Cookie 旨在在浏览器和服务器之间传递数据。当您的浏览器存储网站的 cookie 时,未来对该网站的请求将包括与该网站关联的 cookie(HTTP Cookie 标头)。服务器还可以使用 Set-Cookie HTTP 响应标头更新浏览器的 cookie。
会话 cookie 通常用于通过在每次请求时将会话令牌传递给服务器来维护“服务器会话”。服务器使用此令牌在与该令牌关联的服务器上查找会话数据。
Web Storage API(localStorage 和 sessionStorage)用于仅在浏览器中存储数据。此数据不会在浏览器和服务器之间自动传递。
会话 cookie 和 sessionStorage 对“会话”有不同的概念。
对于会话 cookie,会话在访问同一站点的所有浏览器选项卡之间共享,并在所有浏览器窗口关闭时结束。
对于 sessionStorage,每个选项卡(或"browsing context")都有自己唯一的会话,并且会话在选项卡关闭时结束。这可以被认为更像是“标签会话”而不是“浏览器会话”。
因此,如果您想在多个选项卡之间共享数据,单独使用 sessionStorage 是行不通的。您可以使用 localStorage、会话 cookie 或其他替代方法来同步此数据。
Cookie 的大小比 sessionStorage 更受限制。如果您了解每个请求都将 cookie 传递给服务器,那么这是有道理的。最大尺寸因浏览器而异。查看这些 StackOverflow 帖子了解更多详情:
标有HttpOnly 属性的Cookie 无法被页面上运行的JavaScript 访问。这可以方便地防御Cross Site Scripting (XSS) 攻击。
【讨论】: