说说 Session 和 Cookie 有什么联系和区别?
说说 Session 和 Cookie 有什么联系和区别?
先来看看什么是 Session 和 Cookie :
- Cookie 是保存在客户端的一小块文本串的数据。客户端向服务器发起请求时,服务端会向客户端发送一个 Cookie,客户端就把 Cookie 保存起来。在客户端下次向同一服务器再发起请求时,Cookie 被携带发送到服务器。服务端可以根据这个 Cookie 判断用户的身份和状态。
- Session 指的就是服务器和客户端一次会话的过程。它是另一种记录客户状态的机制。不同的是 cookie 保存在客户端浏览器中,而 session 保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,这就是 session。客户端浏览器再次访问时只需要从该 session 中查找用户的状态。
Session 和 Cookie, 有什么不同呢?
以下是 Session 和 Cookie 的不同之处:
- 存储位置:Cookie 存储在客户端,而 Session 存储在服务器端。
- 数据类型:Cookie 只能存储 ASCII 数据,而 Session 可以存储任意类型的数据。通常情况下,我们可以在 Session 中保存一些常用的变量信息,比如 UserId 等。
- 有效期:Cookie 可以设置为长期保存,例如常见的默认登录功能,而 Session 通常具有较短的有效时间,客户端关闭或 Session 超时后会失效。
- 隐私策略:由于存储在客户端,Cookie 更容易受到非法获取的风险。在早期,有些人将用户的登录名和密码存储在 Cookie 中,导致信息被窃取。而 Session 存储在服务器端,相对于 Cookie 具有更好的安全性。
- 存储大小:单个 Cookie 可以存储的数据大小不能超过 4KB,而 Session 可以存储远大于 Cookie 的数据量。
Session 和 Cookie 之间有什么关联呢?
可以使用 Cookie 来记录 Session 的标识。
- 当用户首次向服务器发起请求时,服务器根据用户提交的信息创建相应的 Session,并在返回的响应中将该 Session 的唯一标识 SessionID 返回给浏览器。浏览器接收到服务器返回的 SessionID 信息后,将其存储在 Cookie 中,并记录该 Cookie 属于哪个域名。
- 当用户再次访问服务器时,请求会自动检查是否存在与该域名相关的 Cookie 信息。如果存在 Cookie,浏览器会自动将 Cookie 信息发送给服务器。服务器根据 Cookie 中的 SessionID 获取相应的 Session 信息。如果找不到 Session,说明用户未登录或登录已失效;如果找到 Session,表示用户已登录,可以执行后续操作。
在分布式环境中,如何处理 Session?
在分布式环境中,客户端请求经过负载均衡可能会分配到不同的服务器上,如果一个用户的请求没有落到同一台服务器上,那么在新的服务器上将无法找到该用户状态的 Session。
针对这个问题,可以使用 Redis 等分布式缓存来存储 Session,以实现多台服务器之间的共享。
如果客户端无法使用 Cookie,应该如何处理 SessionID 的存储和传递?
在某些情况下,客户端无法使用 Cookie,例如浏览器禁用了 Cookie,或者客户端是安卓、iOS 等移动应用。
针对这种情况,可以考虑以下方式来存储 SessionID 并进行传递:
- 存储方式:可以使用客户端的本地存储,例如浏览器的
sessionStorage。
传递方式:
- 拼接到 URL 中:直接将 SessionID 作为 URL 的请求参数拼接在后面。
- 放入请求头中:将 SessionID 放入请求的头部,作为请求的一个字段。这是比较常用的方式。