一篇带你搞懂Session和Token的区别,大数据时代下为什么会产生token?

Session、Token

    • 首先为什么会有session的出现?
    • 其次就是session的生成方式
    • 那为什么会有token的出现?session不好吗?
    • 基于Token身份验证的过程
    • Session和Token的区别

首先为什么会有session的出现?

      因为网络http是无状态协议,这样就无法确定你的本次请求和上次请求是不是一个人发送的,所有需要session来验证信息。

其次就是session的生成方式

      浏览器第一次访问服务器,服务器会创建一个session,同时为该session生成一个唯一的会话key,也就是sessionid。然后将sessionid及对应的session分别作为key和value保存到缓存中,也可以持久化到数据库或者redis中。浏览器下次在访问时,会带着cookie中的sessionid,然后服务器根据sessionid找到对应的session进行匹配。

那为什么会有token的出现?session不好吗?

      首先,session的存储是需要空间的,每人都在服务器保存自己的session id,对服务器来说是一个巨大的开销。其次 session的传递一般是通过cookie来传递的,或者通过url重写的方式。最重要的是,session的存储极大的限制了服务器扩展能力,比如用多台及其组成一个集群,用户A访问到了服务器1,那么他的session信息会保存到服务器1上。那么等用户A访问到服务器2的时候,服务器B上没有A的session id。
      于是就有人思考,为什么要让服务器保存着万恶的session呢?只让每个客户端去保存该多好。可是如果不保存这些session id,怎么验证客户端发送给我的session id的确是我生成的呢?如果不去验证,服务器都不知道他们是不是合法登录的用户,那么不怀好意的家伙们就可以伪造session id,为所欲为了。

      所有关键点就是验证!比如说,小兰同学已经登录了系统,我(服务器)给他发送一个令牌(token),里面包含了小兰的user id,下一次小兰再次通过Http请求访问我的时候,把这个token通过Http header带过来不久可以了? 但是这和session id也没区别啊,任何人都可以伪造,所有token得想个办法,让别人伪造不了。
一篇带你搞懂Session和Token的区别,大数据时代下为什么会产生token?_第1张图片

      那就做一个数据签名吧,比如我用HMAC-SHA256算法,加上一个只有我才知道的密钥,对数据做一个签名,把这个签名和数据一起作为一个token,由于密钥别人不知道,所有就无法伪造token了。
      这个token我不保存,当小兰吧这个token给我发过来的时候,我在用同样的HMAC-SHA256算法和同样的密钥,对数据在计算一次签名,和token中的签名做个比较。如果相同,我就知道小兰登录过了,并且可以直接获取到小兰的user id;如果不想听,数据部分肯定被别人改过了,那么我就只能回应:对不起,我没有认证。
      这样一来,我就不用保存session id了,我只是生成token,然后验证token,我用我的CPU计算时间获取了我的session存储空间,解除了session这个负担。如果用户访问量增加,那么直接加服务器就行了,多简单。
      但是因为token的数据是明文保存的,当一个人的token被偷走,那也没办法,服务器也会认为这个小偷是合法用户。其实跟session id被人偷走一样的

基于Token身份验证的过程

  1. 用户通过用户名和密码发送请求。
  2. 程序验证。
  3. 程序返回一个前面的token发送给客户端。
  4. 客户端存储token,并且每次用于发送请求。
  5. 服务器验证token并返回数据。

      每一个验证都需要token,token一个在HTTP的头部发送从而保证Http的请求无状态。

Session和Token的区别

  1. 首先 token和session并不矛盾,他们都是为了身份的验证,session一般叫做会话,而token一般叫做令牌。
  2. 其次,session在服务器端会保存一份,可能保存到缓存、文件或数据库;而token存储在客户端中
  3. token能更好的保护信息,因为token的数据如果被篡改,那么解析他的签名会与token中的不一致。
  4. token与session的问题是一种时间与空间的博弈问题,session是空间换时间,而token是时间换空间。两者的选择要看具体情况而定。
  5. 虽然确实都是“客户端记录,每次访问携带”,但token很容易设计为自包含的,也就是说,后端不需要记录什么东西,每次一个无状态请求,每次解密验证,每次当场得出合法/非法的结论。这一切判断依据,除了固化在C/S两端的一些逻辑之外,整个信息是自包含的。这才是真正的无状态。而sessionid,一般都是一段随机字符串,需要到后端去检索id的有效性。万一服务器重启导致内存里的session没了呢?万一redis服务器挂了呢?那么所有用户都得重新登录一遍,不得被骂死…

你可能感兴趣的:(Spring框架,JavaSE基础,大数据,服务器,java,session,token)