http - 如果我将 session 存储在 localStorage 而不是 cookie 中,我的网站会更安全吗?

标签 http session authentication cookies

据我所知,大多数具有身份验证的网站都是这样工作的:

  1. 用户使用 POST 表单发送用户名-密码对。
  2. 服务器识别用户并将 session key 与 HTTP 响应的 header 一起存储在他的 cookie 中。
  3. 当用户点击网页上的任何链接时,浏览器会发送 GET 请求以及我们刚刚设置的 session key 。
  4. 服务器通过cookie中的 session key 识别用户。

它会导致一些问题,比如 CSRF .我知道它们都不是无法解决的,但请考虑以下方法:

  1. 用户通过 Ajax 通过 POST 发送用户名-密码对。
  2. 服务器在 HTTP 响应正文中响应一个 session key 。
  3. 客户端 javascript 将 session key 存储在 localStorage/DOM 中。
  4. 当用户点击网页上的任何链接时,javascript 会阻止浏览器的默认行为,并通过 Ajax 发送 GET 请求,并使用我们刚刚设置的 session key 。(例如 http://www.myapp.com/articles?session_key=af18db9c10a916ec12)
  5. 服务器通过GET参数识别用户。

这种方法在安全方面是否更有效?它有什么缺点?

最佳答案

这是个绝妙的主意。很快我想到了两件事(尽管我确信还有更多要说的):

  1. 最后,您仍然从浏览器向服务器发送 session key ,您只是使用 GET ... 标题行而不是 Cookie: ... 行。黑客仍然可以通过欺骗整个请求来破解它。但是,特别是关于 XSRF 攻击,在这种攻击中,黑客诱使用户无意中在受信任的站点上提交表单,您的方案可能会通过仅为正在运行的应用程序中的链接提供 session key 来降低风险(而不是在每个页面加载时与 cookies )。酷!

  2. 一些浏览器(尤其是在企业界)出于安全原因完全禁用 javascript。它只占整体网络使用人口的一小部分,但您必须考虑到您的受众。通常,更改默认浏览器行为是有风险的。

附录:

阻止 XSRF 攻击的一种“标准”方法是在为任何包含表单的页面提供服务时随机生成 token 。 token 存储在服务器的 session 中,并存储在正在提供的表单中的隐藏字段中。提交表单时,您检查它是否包含与服务器 session 中的 token 匹配的 token 。这与您的解决方案本质上相同(它保证表单是从您的应用程序提供的页面提交的),但不需要更改默认浏览器行为。

关于http - 如果我将 session 存储在 localStorage 而不是 cookie 中,我的网站会更安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22269690/

相关文章:

scala - POST方法请求Http4s的正确处理方式

Java http-读取大文件

php - 如何删除数据库中具有特定变量值(用户ID)的所有 session ?

Python 请求 : Passing multiple client certificates to session. 证书

.net - 使用 Kerberos 对网站和 Web 服务进行身份验证是个好主意吗?

javascript - 在angularjs中处理大数据

http - 为什么 'x-www-form-urlencoded' 以 'x-www' 开头,而其他标准内容类型不是?

java - 在 JBoss AS 6 中监听登录事件

未选择 WPF 浏览器身份验证

ruby-on-rails - 如何按原始顺序获取 POST 参数(使用 Rails)?