一、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的问题,服务端不需要在存储任何信息了, 扩展起来就更方便。
三、JWT
JWT意为JSON Web Token ,可以理解成是一种特殊的token,也可以理解成是根据token的思路发展出来的一种具体的解决方案
JWT 的几个特点
JWT 默认是不加密,但也是可以加密的。生成原始 Token 以后,可以用密钥再加密一次。
JWT 不加密的情况下,不能将秘密数据写入 JWT。
JWT 不仅可以用于认证,也可以用于交换信息。有效使用 JWT,可以降低服务器查询数据库的次数。
JWT 的最大缺点是,由于服务器不保存 session 状态,因此无法在使用过程中废止某个 token,或者更改 token 的权限。也就是说,一旦 JWT 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。
JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT 的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证。
为了减少盗用,JWT 不应该使用 HTTP 协议明码传输,要使用 HTTPS 协议传输。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明。