一、session和cookie:现在一般都是session和cookie一起用,一起提。但是他们俩其实不是一定要在一起。 session的产生原因是,http协议是无状态的 这就导致了,不同的用户在操作时,服务端无法知道是哪个用户发来的请求,为了做这种区分,服务器就要给每个客户端分配不同的“身份标识”,然后客户端每次向服务器发请求的时候,都带上这个“身份标识”,服务器就知道这个请求来自于谁了。至于客户端怎么保存这个“身份标识”,可以有很多种方式,对于浏览器客户端,大家都默认采用 cookie 的方式 session的使用流程一般为: 1.用户在客户端登录后,服务器会跟据用户信息生成一个sessionID 2.然后会把session存储在redis,数据库等存储媒介中 3.然后通过设置cookie的方式返回给客户端,既存放在浏览器的cookie中 4.客户端在下一个请求时,会带上cookie中的sessionid 5.然后服务端根据sessionid去查redis或者数据库,进行验证,来到达用户校验的目的 session存在的问题: 1.如果是单一的服务器,那么使用session没有问题,但是如果是集群服务器的话,那就要做session同步了,如果是4-5台服务器还是可行的,但是如果集群有上百台呢,这样session同步就会难以接受,极大的增加了服务器的性能开销 2.于是有人就想出,为session独立部署一个服务器,然后其他服务器访问这个session服务来进行存取和验证逻辑,这样就不需要做session同步了,但是这样也存在风险,万一这台服务器挂了,那整个系统都会受到牵连。 3.那么为这个session服务器再扩展,也做成集群-session集群,这也是一种可行的方案,但是非常累人 session是服务器端的,cookie是浏览器端的cookie只是实现session的其中一种方案。虽然是最常用的,但并不是唯一的方法。禁用cookie后还有其他方法存储,比如放在url中现在后端服务都是分布式部署,session一般统一放在redis集群中。这样有个问题就是一旦redis故障,可能会影响所有的用户请求。所以,在后台进行session的存储和运维这件事是非常重要和危险的,对可靠性的要求非常高。 二、Token:为了解决session产生的问题,所以有了token,token意为“令牌”. 简单来说,就是服务端把用户信息通过加密算法和一个只有服务端知道的密钥,来生成一个字符串,这个就是token. 然后客户端下一次请求时带上这个token,服务端拿到用户信息后通过相同的算法和密钥,生成一个新的token和用户请求里携带的token进行比对,来完成用户验证。 token的流程一般是这样的: 1.客户端使用用户名跟密码请求登录, 2.验证成功后,服务端会通过加密算法,如HMAC-SHA256,然后通过一个只有服务端知道的密钥,来生成一个token 3.服务端再把这个Token发送给客户端,服务端不会保存token 4.客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里 5.客户端每次向服务端请求资源的时候需要带着服务端签发的 Token 6.服务端收到请求,然后会用相同的算法和密钥去验证token,如果通过,执行业务操作,不通过,返回不通过信息 session时通过把所有session存起来,而token则是通过算法和密钥来验证。这样的话就解决了session的问题,服务端不需要在存储任何信息了, 扩展起来就更方便。 三、JWTJWT意为JSON Web Token ,可以理解成是一种特殊的token,也可以理解成是根据token的思路发展出来的一种具体的解决方案 Jwt原理和实现:https://www.cnblogs.com/zhangyafei/p/12855294.html JWT 的几个特点
|
|