博客
关于我
看完这篇 Session、Cookie、Token,和面试官扯皮就没问题了
阅读量:420 次
发布时间:2019-03-06

本文共 1854 字,大约阅读时间需要 6 分钟。

HTTP 协议是一种无状态协议,这意味着每次客户端向服务器发送请求时,服务器都无法记住之前的请求记录。为了弥补这一缺点,Session 和 Cookie 的机制被引入,用于保持客户端与服务器之间的会话状态。


Session 是什么

Session 是一种用于存储客户端在同一会话期间操作记录的技术。服务器在接收到客户端的请求时,会为此次会话创建一个唯一的内存空间(通常使用 ConcurrentHashMap 存储),并通过生成一个 sessionId 来标识该会话。该 sessionId 会被嵌入到 HTTP 响应头的 Set-Cookie 标头中,客户端随后会将这个 Cookie 响应头信息存储在本地,并在后续的每次请求中发送回服务器。


Session 如何判断是否是同一会话

服务器第一次接收到请求时,会创建一个 Session 对象,并生成一个 sessionId。该 sessionId 会被发送给客户端,并要求浏览器设置 Cookie。客户端在后续的每次请求中都会带上这个 Cookie,服务器通过读取 Cookie 中的 sessionId 来识别当前会话。


Session 的缺点

Session 的主要缺点在于当服务器进行负载均衡时,Session 数据可能会被转移到其他服务器,而目标服务器并没有存储该 Session 数据,导致 Session 失效。这种情况下,客户端的 Cookie 是无效的,用户可能需要重新登录。


Cookies 是什么

Cookie 是服务器向客户端发送的一小块数据,客户端会存储并随后请求发送回去。Cookie 的主要作用是弥补 HTTP 协议的无状态特性,用于保持客户端与服务器之间的会话状态。


Cookie 的作用域由 DomainPath 决定。 Domain 指定了 Cookie 应该发送给哪些主机,默认为当前主机,不包含子域名。如果指定了子域名,Cookie 会被发送到子域名。此外,Path 指定了 Cookie 的有效路径,例如设置为 /docs,则路径为 /docs/docs/Web//docs/Web/HTTP 都会匹配。


会话 Cookies 和永久性 Cookies

  • 会话 Cookies:没有设置 ExpiresMax-Age,这些 Cookie 会随着浏览器关闭而删除。然而,浏览器可能会保留会话 Cookies,以支持跨会话还原。

  • 永久性 Cookies:设置了 ExpiresMax-Age,这些 Cookie 会在指定日期或时间过期,并从客户端删除。


  • Secure:要求 Cookie 仅在 HTTPS 协议下发送,确保数据加密传输。

  • HttpOnly:防止客户端脚本(如 JavaScript)访问 Cookie,防止跨站脚本攻击。


JSON Web Token (JWT) 和 Session Cookies 的对比

JWT 是什么

JWT(JSON Web Token)是一种用于身份验证的标准,基于 JSON 格式,由三部分组成:HeaderPayloadSignature。JWT 由服务器签名,客户端可以验证其真实性。

JWT 和 Session Cookies 的相同之处

  • 都用于身份验证,支持跨页面状态管理。
  • 都允许客户端在无状态协议中保持登录状态。

JWT 和 Session Cookies 的不同

  • 签名与安全性:JWT 有加密签名,而 Session Cookies 没有。

  • 无状态性:JWT 是无状态的,存储在客户端,减少了服务器资源消耗。

  • 可扩展性:JWT 适合分布式系统,而 Session Cookies 适合单一域名应用。


禁用 Cookies,如何使用 Session

如果禁用 Cookies,服务器仍需通过 URL 重写(如 PHP 的 rewrite 函数)将 sessionId嵌入到 URL 中,客户端在后续请求中通过 URL 提供 sessionId,从而实现 Session 的管理。这种方法避免了对 Cookie 的依赖。


总结

Session 和 Cookie 是 HTTP 无状态协议的重要补充,用于保持客户端与服务器之间的会话状态。理解这两种技术的工作原理和优缺点,对于开发和优化 Web 应用程序至关重要。

转载地址:http://kiwuz.baihongyu.com/

你可能感兴趣的文章
paip.spring3 mvc servlet的配置以及使用最佳实践
查看>>
Palindrome Number leetcode java
查看>>
Palo Alto Networks Expedition 未授权SQL注入漏洞复现(CVE-2024-9465)
查看>>
Palo Alto Networks PAN-OS身份认证绕过导致RCE漏洞复现(CVE-2024-0012)
查看>>
Panalog 日志审计系统 libres_syn_delete.php 前台RCE漏洞复现
查看>>
Panalog 日志审计系统 sprog_deletevent.php SQL 注入漏洞复现
查看>>
Panalog 日志审计系统 sprog_upstatus.php SQL 注入漏洞复现(XVE-2024-5232)
查看>>
pandas -按连续日期时间段分组
查看>>
pandas :to_excel() float_format
查看>>
pandas :将多列汇总为一列,没有最后一列
查看>>
pandas :将时间戳转换为 datetime.date
查看>>
pandas :将行取消堆叠到新列中
查看>>
pandas DataFrame 中的自定义浮点格式
查看>>
Pandas DataFrame 的 describe()方法详解-ChatGPT4o作答
查看>>
Pandas DataFrame中删除列级的方法链接解决方案
查看>>
Pandas DataFrame中的列从浮点数输出到货币(负值)
查看>>
Pandas DataFrame中的列从浮点数输出到货币(负值)
查看>>
Pandas Dataframe的日志文件
查看>>
pandas Groupby:创建两列的Groupby时,如何按正确的顺序对工作日进行排序?
查看>>
Pandas Plots:周末的单独颜色,x 轴上漂亮的打印时间
查看>>