首先http是无状态的协议,为了使某个域名下的所有网页能共享数据,有了session 和cookies
session
:sessionid与session key-value对应(我以前一直认为seesionid就是session所以一直不理解)
客户端访问服务器流程:
1、当浏览器第一次访问服务器时,会在服务器端建立一个session,同时生成一个唯一的sessionID。sessionID和session作为key和value保存在缓存或数据库中,。服务器把sessionid以cookie的形式返回给浏览器;
2、下次访问时,浏览器发送的请求的cookie中携带此session ID;
3、服务器收到请求,分析cookie,验证信息,核对成功后返回response给客户端
客户端是没有session说法的,session是服务器在客户端建立连接时添加客户端连接标志。一般通过cookies发送给客户端,当客户端第一次请求时服务器会检查是否携带了这个Session(临时Cookie),如果没有则会添加Session,如果有就拿出这个Session来做相关操作。
token:
最简单的token组成:uid、time、sign
1、用户通过用户名密码发送请求登录
2、服务器验证,校验生成token
3、服务器返回一个签名的token给客户端
4、客户端存储token并没次请求携带token (放在http头)
5、服务器端验证token并返回数据
基于JWT(json web token)的token认证实现
JWT 标准token:header,payload、signature中间用点分隔,用Base64编码;
header:{
"alg": "HS256"
}加密算法
payload:token的具体内容,标准字段等
signature:这部分内容有三个部分,先是用 Base64 编码的 header.payload ,再用加密算法加密一下,加密的时候要放进去一个 Secret ,这个相当于是一个密码,这个密码秘密地存储在服务端。
const encodedString = base64UrlEncode(header) + "." + base64UrlEncode(payload);
HMACSHA256(encodedString, 'secret’);
客户端收到这个 Token 以后把它存储下来,下回向服务端发送请求的时候就带着这个 Token 。服务端收到这个 Token ,然后进行验证,通过以后就会返回给客户端想要的资源。
session和token区别:
1、session 浏览器自动携带,token需代码携带
2、session需要存储空间,token不需要