我们应该在哪里存储会话 ID

Posted

技术标签:

【中文标题】我们应该在哪里存储会话 ID【英文标题】:Where should we store session Ids 【发布时间】:2021-12-26 08:13:45 【问题描述】:

我了解到,对于基于会话的身份验证,会话 ID 通常存储在浏览器的 cookie 中,并且会在每次请求时发送回服务器。

我猜有多种发送会话 ID 的途径(cookie、标头、请求正文、URL 等) 那么将会话 ID 存储在 cookie 或 HTTP 标头或请求正文甚至 URL 中的含义或权衡是什么?

【问题讨论】:

请考虑这些表单中只有一个会(自动)在所有请求中发送到服务器。那么,在使用其他方法时,“会话 ID”有哪些影响和权衡? 另外,请考虑查询参数经常被记录,否则 URL 很容易泄露(例如,复制和粘贴链接)。 Cookies 一个http标头。 【参考方案1】:

假设我们谈论的是一个普通的 web 应用程序,服务器可以自己设置一个 cookie,这是一个非常透明的过程:你的前端代码在认证时不需要读取这个令牌,将其存储在本地,并转发到每个请求都比手动需要它。所有可能出错的事情。服务器将设置它,浏览器会将其作为标头的一部分发送回您所有后续请求的标头中。

直到很久以前,这也是一个问题,必须以某种方式缓解 csrf 攻击,以确保使用适当会话 ID 发送的任何请求实际上是合法的,而不是某些随机站点恶意的结果制作帖子请求。使用samesite 选项,cookie 仅在验证请求来源后由浏览器发送。

从安全角度来看,使用 httponly 设置的 cookie 无法通过 javascript 访问。存储令牌的典型替代方案是本地存储,但一旦发生 xss 漏洞,该令牌可能会被泄露。

您通常还希望避免在请求中将令牌作为查询字符串的一部分发送。虽然 url 在传输中的普通 https 请求中不可见,但您选择的网络服务器可能会将这些请求记录在一个文件中,该文件将包含不应存在的敏感信息。 用户也可能通过复制/粘贴网址意外共享它们。

【讨论】:

...查询字符串也记录在浏览器历史记录中,不像您注销后的cookie。

以上是关于我们应该在哪里存储会话 ID的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server里那些我们应该知道的系统存储过程

python Flask 在哪里存储会话?

之前:获取最后插入的 id - mysql 现在:我们应该在哪里调用最后插入的 id?

我应该在 Laravel 5 中将 JS 存储在哪里?

php在会话中存储用户ID?

在代码(C#、Java)和数据库(SQL)之间,我们应该在哪里排序或过滤?