【问题标题】:Using HTTPOnly Cookie in GET request (Retrieve user info from server using user_id cookie)在 GET 请求中使用 HTTPOnly Cookie(使用 user_id cookie 从服务器检索用户信息)
【发布时间】:2018-12-29 19:58:24
【问题描述】:

我正在学习一个教程,在该教程中,在用户登录后,后端会向包含用户 ID 的前端发送一个 HTTPOnly cookie。但是,无法从前端访问 HTTPOnly cookie(例如 document.cookie 将无法读取 cookie)。

我的问题是,如何使用这个 cookie 来检索用户数据? 我的想法是你会做一些类似 GET 'server_address'/user/'id' where 'id ' 将是存储在 cookie 中的用户 ID。但这显然行不通,因为前端无法访问 cookie,因为它是 HTTPOnly。我想到的一个可能的解决方法是让服务器在登录后在 JSON 响应中发送用户 ID,但是 如果这是解决方案,那么首先设置 cookie 有什么意义?如果您可以在 JSON 响应中发回 id,那么这种解决方法看起来似乎根本没有必要使用 cookie 来保存用户会话。

请多多包涵,这是我第一次使用 cookie。如果它有帮助,我正在使用 Angular 4 前端和 Node/Express 后端

【问题讨论】:

    标签: node.js angular express cookies


    【解决方案1】:

    我们将cookie设置为httponly以防止XSS,想象如果存在安全漏洞允许黑客注入脚本<script>sendToHackerServer(document.cookie)...</script>,那么用户的cookie(包括会话)将被发送到黑客服务器,然后黑客可以获得访问权限与该会话的用户数据。由于这些httponly cookie 只能通过http 请求读取,会话cookie 不会被注入脚本发送,您的快递后端可以通过req.cookies 读取这些cookie。

    【讨论】:

      【解决方案2】:

      httponly cookie 存储在浏览器中,并会在未来与 cookie 来源匹配的任何请求中自动重新发送回服务器。因此,服务器可以使用 cookie 来识别哪个客户端正在发出请求。例如,如果它是一个身份验证 cookie,用于识别谁是经过身份验证的用户,那么服务器将知道该请求来自哪个经过身份验证的用户,并且可以使用该信息来验证请求并知道它是哪个用户。

      您似乎已经知道,浏览器 Javascript 无法检索 httponly cookie。这就是httponly的意思。

      如何使用此 cookie 来检索用户数据?

      cookie 与来自该客户端的任何请求一起发送到服务器,因此服务器可以使用 cookie 来识别发出请求的用户。

      我想到的一个可能的解决方法是让服务器在登录后在 JSON 响应中发送用户 ID

      如果服务器希望客户端知道用户 ID,那么它应该在响应中返回它。或者,它可以停止使用 httpOnly cookie,以便客户端可以读取 cookie。但是,通常表示任何类型的身份验证状态的 cookie 在服务器上都是加密的,因此客户端通常无法理解它们,即使它们不是 httpOnly 也是如此。

      如果这是解决方案,那么首先设置 cookie 的意义何在

      Cookie 的使用有多种原因。它们允许服务器设置与该特定客户端关联的某些状态,并且该客户端的每个未来请求都会将该 cookie 发送回服务器,以便服务器可以访问该信息。这些信息可以是身份验证信息、用户 ID 信息、用户偏好等...

      如果您可以在 JSON 响应中将 id 发回,那么这种解决方法看起来似乎根本没有必要使用 cookie 来保存用户会话。

      您并没有真正告诉我们有关您的应用程序的太多信息,但 cookie 通常涉及实现登录和安全性,并且由于它们会与所有未来的请求一起自动发送,它们使客户端不必为每个请求附加凭据单个未来请求(因为自动包含 cookie 凭据)。而且,对于诸如用户单击页面中的链接之类的请求,cookie 是必需的,因为这些类型的链接中没有凭据(也不应该)。

      我的想法是你会做一些类似 GET 'server_address'/user/'id'

      所以您打算与该请求建立任何安全关联?如果是这样,那么您需要一个身份验证方案,以便不仅仅是任何人都可以为任何用户请求信息。这通常是 cookie 的用途。您登录后,服务器将凭据设置为加密的 cookie。该凭据标识特定的经过身份验证的用户,因此对于来自同一客户端的未来请求,服务器可以使用该 cookie 来查看用户是谁以及他们是否经过身份验证。

      【讨论】:

      • 感谢您对我的每一个观点的深入回答。欣赏!
      • 只是一个简单的问题,客户端如何知道用户是否已登录? cookie是服务器发送的,只能被服务器读取。客户端应用如何根据用户是否登录做出决策?
      • @HamzaKhanzada - 如果服务器希望客户端知道它是否已登录(这是一个合理的事情),那么它可以在呈现页面时将该信息嵌入到页面中,或者作为 HTML,作为 Javascript 变量、CSS 类等...
      • 我正在构建一个 SPA,服务器是无状态的并且只返回 JSON,当客户端点击登录并且服务器返回一个 httponly cookie 时,客户端如何在任何时候知道用户仍然登录或不是吗?
      • 所以当登录成功并且服务器返回给我用户ID时,我应该在客户端单独维护一个cookie以知道用户已经登录吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-24
      • 2011-12-29
      • 2021-09-28
      • 1970-01-01
      • 1970-01-01
      • 2017-06-04
      相关资源
      最近更新 更多