引入:我们都知道 http 协议本身是一种无状态的协议,一个普通的http请求简单分为三步:
客户端发送请求request
服务端收到请求并进行处理
服务端将结果respond给客户端
对于服务端来说
服务端如何知道当前请求的客户端是哪个用户
如何保证每次请求,服务器都知道是哪个用户
一、cookie
什么是cookie
cookie 就是存储在客户端的一段数据,采用的是在客户端保持 HTTP 状态信息。
cookie 的产生背景
随着互联网的发展,已经不仅仅是浏览网页了,越来越多的交互式网站兴起,如在线购物网站。这就 面临一个问题,每次访问请求,服务端需要知道当前请求客户端是谁。比如xxxx/a.php已经登陆了,跳转到xxxx/b.php 不能又登陆一次吧。
由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理。
cookie 的运行机制
A:客户端发送一个http请求到服务端;
B:服务端收到请求,进行处理;
C:服务端将结果response给客户端,http 头部包含Set-Cookie的通知;
D:客户端收到结果,发现Set-Cookie通知,将数据以key-value的形式保存在cookie中,以后每次request服务端都会带上cookie ,服务端通过cookie即可知道当前用户
- cookie 的缺点
i) cookie 保存在本地,数据非常容易被伪造,尤其是敏感数据,所以不安全;
ii) cookie 过大或过多,都会导致http请求过慢,影响效率;
二、session
什么是session
session 就是存储在服务器的数据, 采用的是在服务器保持HTTP状态信息。
session 的产生背景
为了解决cookie的安全型和效率问题,所以产生了session技术,session是依赖cookie技术实现的。当用户发送一个请求到服务器,服务器会先检查cookie中是否存在session_id, 如果不存在(说明是第一次请求),则会为该请求创建一个session对象,并将该session对象的session_id(放到响应头的set-cookie中),响应给客户端。
session 的缺点
i) session 保存在内存中,如果访问量很大,则服务器内存可能吃不消,影响服务器性能;
ii) 如果服务器做了负载均衡,则有可能获取不到session,影响服务器的扩展性:
于是有人就一直在思考, 服务器为什么要保存这可恶的session呢, 只让每个客户端去保存该多好?
可是如果不保存这些session id , 怎么验证客户端发给我的session id 的确是我生成的呢? 如果不去验证,我们都不知道他们是不是合法登录的用户。嗯,对了,关键点就是验证 !
三、token
什么是token
token是用户身份的验证方式。最简单的token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名)。
这个token 我不保存, 当小F把这个token 给我发过来的时候,我再用同样的HMAC-SHA256 算法和同样的密钥,对数据再计算一次签名, 和token 中的签名做个比较, 如果相同, 我就知道小F已经登录过了,并且可以直接取到小F的user id , 如果不相同, 数据部分肯定被人篡改过, 我就告诉发送者: 对不起,没有认证。