cookie 是否依赖于浏览器?

Is the cookie dependent on the browser?

我对 cookie 有点困惑,我想知道我们能否在浏览器以外的地方使用 cookie,例如移动应用程序或桌面应用程序。 cookie 是否依赖于浏览器?

任何 HTTP 客户端都可以使用 cookie。 cookie 只是服务器发送的 HTTP header,其值由客户端在后续请求中发送回服务器。请查阅您的 HTTP 客户端的文档,看看是否 built-in 支持记住 cookie。

不,cookie 不依赖于浏览器。

Cookie 依赖于 HTTP "User-Agent" -- software/library 客户端代表用户执行 HTTP 协议。浏览器只是其中的一种。其他类型的"User-Agent"包括:

  • 可以发送HTTP请求的CLI软件,例如curl or wget.
  • 可以在项目中导入并发送HTTP请求的库。以Node.js项目为例,可以是request or axios。所有主要编程语言都有自己的 HTTP 客户端库。
  • Self-implemented HTTP客户端逻辑代码。
  • 更多...

在移动应用程序或桌面应用程序中,如果应用程序使用HTTP,则很有可能使用cookie。

Session 基于身份验证

在基于session的身份验证中,服务器会在用户登录后为用户创建一个session。然后将session id存储在用户的cookie中浏览器。当用户保持登录状态时,cookie 将与每个后续请求一起发送。然后服务器可以将存储在 cookie 中的 session id 与存储在内存中的 session 信息进行比较,以验证用户身份并发送相应状态的响应!

基于令牌的身份验证

许多网络应用程序使用 JSON 网络令牌 (JWT) 而不是 sessions 进行身份验证。在基于令牌的应用程序中,服务器使用秘密创建 JWT 并将 JWT 发送给客户端。客户端存储 JWT(通常在本地存储中)并在每个请求的 header 中包含 JWT。然后,服务器将使用来自客户端的每个请求验证 JWT 并发送响应。

这里最大的区别是用户的状态不存储在服务器上,而是存储在客户端的令牌中。出于可扩展性和移动设备身份验证等原因,大多数现代 Web 应用程序都使用 JWT 进行身份验证。

可扩展性

基于

Session 的身份验证: 因为 sessions 存储在服务器的内存中,所以当有大量用户时,扩展成为一个问题立即使用系统。

基于令牌的身份验证:缩放没有问题,因为令牌存储在客户端。

多个设备

Session 基于身份验证: Cookie 通常在单个域或子域上工作,如果它们工作,它们通常会被浏览器禁用 cross-domain(第 3 方饼干)。当 API 从不同的域提供给移动和 Web 设备时,它会带来问题。

基于令牌的身份验证:cookie 没有问题,因为请求中包含 JWT header。

基于令牌的身份验证:使用 JWT 是现代网络应用中更推荐的方法。 JWT 的一个缺点是 JWT 的大小与存储在 cookie 中的 session id 相比要大得多,因为 JWT 包含更多的用户信息。必须注意确保仅在 JWT 中包含必要的信息,并应省略敏感信息以防止 XSS 安全攻击。