为什么要用Session和Cookie?
- 因为 Session 和 Cookie 可以记录用户状态信息
- 其实说到底,cookie、session、token 都围绕了一个点:身份认证。
为什么要认证
- 一个需要登录的动态网站,在登录后需要保持登录状态,以便后续访问网站其他网页
HTTP是无状态协议
- 已经登录过的用户没法通过协议层把状态保存下来,所以下次再请求的时候,服务器还是不知道你是谁。
无状态导致的后果?
- 意味着后续发出的请求需要处理前面请求的响应,则必须重传
Session
- 当服务器收到登录请求之后,生成一个 session id 一起返回给客户端,客户端下次再请求的时候把 session id 一起带上。这时候每个客户端请求对应各自的 session id ,服务就知道怎么区分了。
Cookie
- 而客户端与服务器之间的会话,一般会使用 Cookie 来管理。
- 服务在向客户端返回响应时,会在首部字段Set-Cookie内写入 Session ID(如 PHPSESSID=028a8c…)。
- 客户端接收到从服务器端发来的 Session ID 后,会将其作为 Cookie 保存在本地。
产生的问题
- 由于服务器也要保存这 session信息用于跟客户端传过来的进行比对,数量小了还好,请数量大了,服务器要保存的内容页就越多,会吃不消。
- session认证本质基于cookie,所以如果cookie被截获,用户很容易收到跨站请求伪造攻击。并且如果浏览器禁用了cookie,这种方式也会失效
Token
- 服务端可以不用保存 token。
- 当第一次收到客户端传过来的用户名和密码时,服务器认证通过后,通过加密算法生成一个字符串当做 token。当拿到后续请求中的 token,服务器再解析这个token,可以从中获取关键的信息,从而判断该token的有效性。
优点:
- 无状态,可以更方便扩展
- 更安全,可以防止跨站请求伪造 CSRF
- 方便多平台跨域
- 可以标准化,比如基于JWT Json web token (JWT)