http超文本传输协议
无状态协议:这一次请求和上一次请求是没有任何关系的,好处是快速,坏处是网页之间不能共享数据,例如登录信息等
cookie和session
由于http的无状态性,为了使某个域名下的所有网页能够共享某些数据。
客户端访问服务器的流程如下:
a.首先,客户端会发送一个http请求到服务器端。
b.服务器端接受客户端请求后,建立一个session,并发送一个http响应到客户端,这个响应头,其中就包含Set-Cookie头部,该头部包含了sessionId
c.在客户端发起的第二次请求,假如服务器给了set-Cookie,浏览器会自动在请求头中添加cookie
d.服务器接收请求,分解cookie,验证信息,核对成功后返回response给客户端
Token:令牌
由uid+time+sign[+固定参数]组成
uid: 用户唯一身份标识
time: 当前时间的时间戳
sign: 签名, 使用 hash/encrypt 压缩成定长的十六进制字符串,以防止第三方恶意拼接
固定参数(可选): 将一些常用的固定参数加入到 token 中是为了避免重复查库
存放:localStorage,cookie,或sessionStorage中。在服务器一般存于数据库中
基于Token的身份验证方法
使用基于Token的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:
a.客户端使用用户名跟密码请求登录;
b.服务端收到请求,去验证用户名与密码;
c.验证成功后,通过一些算法,加一个密钥,生成一个token,再把这个Token发送给客户端;
d.客户端收到Token以后可以把它存储起来,比如放在Cookie里或者Local Storage里;
e.客户端每次向服务端请求资源的时候需要带着服务端签发的Token;
f.服务端收到请求,然后去验证客户端请求里面带着的Token,如果验证成功,就向客户端返回请求的数据。
注意两点:
1.token需要代码才能带上
2.token可以不需要存储空间(JWT),通过算法和密钥验证
sessionID的生成方式
a.浏览器第一次访问服务器时,服务器创建一个session,同时生成一个唯一的会话key,即sessionID。
b.接着sessionID及session分别作为key和value保存到缓存中,也可以保存到数据库中,
c.然后服务器把sessionID以cookie的形式发送给浏览器,
d.浏览器下次访问服务器时直接携带上cookie中的sessionID,
e.服务器再根据sessionID找到对应的session进行匹配
注意两点:
1.sessionID会自动由浏览器带上
2.session是需要存储空间的
cookie机制和session机制的区别
cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。