获取 Cookie/Session
理解 Cookie
HTTP 协议自身是'无状态'协议,但是在实际开发中,我们很多时候是需要知道请求之间的关联关系的。
上述图中的'令牌'通常就存储在 Cookie 字段中。此时在服务器这边就需要记录'令牌'信息,以及令牌对应的用户信息,这个就是 Session 机制所做的工作。
理解 Session
我们先来了解一下什么是会话。会话:对话的意思。
在计算机领域,会话是一个客户与服务器之间的不中断的请求响应。对客户的每个请求,服务器能够识别出请求来自于同一个客户。当一个未知的客户向 Web 应用程序发送第一个请求时就开始了—个会话。当客户明确结束会话或服务器在一个时限内没有接受到客户的任何请求时,会话就结束了。
服务器同一时刻收到的请求是很多的。服务器需要清楚的区分每个请求是从属于哪个用户,也就是属于哪个会话,就需要在服务器这边记录每个会话以及与用户的信息的对应关系。
Session 是服务器为了保存用户信息而创建的一个特殊的对象。
Session 的本质就是一个'哈希表',存储了一些键值对结构。Key 就是 SessionID,Value 就是用户信息(用户信息可以根据需求灵活设计)。
SessionId 是由服务器生成的一个'唯一性字符串',从 Session 机制的角度来看,这个唯一性字符串称为'SessionId'。但是站在整个登录流程中看待,也可以把这个唯一性字符串称为'token'。 上述例子中的令牌 ID,就可以看做是 SessionId,只不过令牌除了 ID 之外,还会带一些其他信息,比如时间,签名等。
- 当用户登陆的时候,服务器在 Session 中新增一个新记录,并把 sessionId 返回给客户端。(通过 HTTP 响应中的 Set-Cookie 字段返回)。
- 客户端后续再给服务器发送请求的时候,需要在请求中带上 sessionId。(通过 HTTP 请求中的 Cookie 字段带上)。
- 服务器收到请求之后,根据请求中的 sessionId 在 Session 信息中获取到对应的用户信息,再进行后续操作。找不到则重新创建 Session,并把 SessionID 返回。
Session 默认是保存在内存中的。如果重启服务器则 Session 数据就会丢失。
Cookie 和 Session 的区别
- Cookie 是客户端保存用户信息的一种机制。Session 是服务器端保存用户信息的一种机制。
- Cookie 和 Session 之间主要是通过 SessionId 关联起来的,SessionId 是 Cookie 和 Session 之间的桥梁。
- Cookie 和 Session 经常会在—起配合使用。但是不是必须配合。
- 完全可以用 Cookie 来保存一些数据在客户端。这些数据不一定是用户身份信息,也不一定是 SessionId。
- Session 中的 sessionId 也不需要非得通过 Cookie/Set-Cookie 传递,比如通过 URL 传递。
- 存储位置
- Cookie:存储在客户端(浏览器)上。当服务器响应一个 HTTP 请求时,它可以在响应头中包含一个 Set-Cookie 字段,浏览器会保存这个 Cookie,并在后续的请求中通过 Cookie 请求头将 Cookie 发送回服务器。
- Session:存储在服务器端。服务器为每个用户会话创建一个唯一的标识符(通常是 Session ID),这个标识符被发送到客户端(通常是通过 Cookie,但也可以通过 URL 重写等方式),客户端在后续的请求中携带这个标识符,服务器通过这个标识符来识别用户会话。
- 安全性
- Cookie:由于存储在客户端,因此相对容易受到攻击,如跨站脚本攻击(XSS)可以读取或修改 Cookie。但是,可以通过设置 HttpOnly 和 Secure 标志来增加安全性,HttpOnly 标志可以防止 JavaScript 访问 Cookie,Secure 标志则要求 Cookie 仅通过 HTTPS 发送。
- Session:存储在服务器端,因此相对更安全。但是,如果 Session ID 被泄露(例如,通过 URL 重写并泄露在日志中),则可能面临会话劫持的风险。
- 容量限制
- Cookie:由于存储在客户端,其大小受到浏览器和服务器设置的限制。大多数浏览器对每个 Cookie 的大小和每个域名下的 Cookie 总数都有限制。
- Session:存储在服务器端,因此其大小限制主要取决于服务器的内存和配置,通常远大于 Cookie 的限制。
- 生命周期
- Cookie:可以设置过期时间(Expires/Max-Age),也可以不设置(会话 Cookie,浏览器关闭时失效)。


