Cookie、Session与Token的区别
本文对后端开发中常见、常用并且常问的Cookie、Session与Token做出讲解如有错误欢迎指正我是栗子君一名Java后端开发学习者希望大家多多关注多多支持。Cookie和Session是什么Cookie和Session都是用来保存会话数据的容器核心目的都是为了维持 HTTP 会话状态。对于Cookie和Session我们从数据结构上理解我们可以将Cookie当作一个键值对通过{name:value}的形式存储我们想传递的数据。而Session我们则可以当作一个map内部通过键值对的形式存储我们的数据。在一个请求中可以携带多个Cookie保存在Cookie头中那么与之对应的我们可以将Cookie头当作一个mapCookie就对应map中的Entry。Cookie是由服务端通过响应头Set-Cookie下发存储在浏览器客户端的小型文本数据。特点是容量小、明文存储、同域名请求会自动携带可设置过期时间、HttpOnly等属性。类似下面的结构其中有三个Cookie。GET /home HTTP/1.1 Host: xxx.comCookie: usernamezhangsan; JSESSIONIDabc123; themedarkSession是存储在服务端的会话数据容器用来保存用户隐私 / 核心会话信息。我们可以通过下面的方法向Session中存储信息。void setAttribute(String var1, Object var2);为什么需要Cookie和Session上面说到Cookie和Session核心目的都是为了维持 HTTP 会话状态这就是原因。由于HTTP是短链接协议浏览器发一次请求服务器返回响应 然后连接就会断开。服务器不会记住上一次请求是谁、做过什么每次请求都是独立的互不关联。同一个用户连续两次访问服务器默认认为是两个完全陌生的请求这就带来一个问题用户在登录后我们无法维持登录状态用户登录后再一刷新或者发送别的请求右需要登录因为服务器根本就不知道你刚才已经登陆过了。这个时候我们就需要Cookie和Session来帮助我们保存用户的登录状态。Cookie和Session维持登录状态的工作原理当我们的客户端首次向服务端发起请求时还没有Cookie当服务端接收到请求后一般是登录的请求我们就可以在服务端将用户名或者其他来验证我们身份的数据放入Cookie然后服务端通过Set-Cookie来命令浏览器存 Cookie。这样当后续携带Cookie的请求打到我们的服务器我们就可以通过其中的数据验证我们的身份进而处理这些请求。其实Session的工作原理很相似只不过数据被存储在了服务端。在首次请求打到服务器后我们在服务端创建一个Session在其中存入帮助我们维持登录状态的数据同时我们将这个Session对应的Session ID返会给客户端后续客户端发出的请求携带这个ID就可以用来证明我们的身份。各自的缺陷我们从头说起既然有了Cookie为什么我们还需要Session呢。我们前面说到Cookie是明文存储通过浏览器我们可以查看其中的内容甚至可以对其进行修改这是非常不安全的很容易遭到攻击或信息泄露。同时Cookie容量较小存储的数据量有限。怎么解决这些问题呢这时Session就登场了。我们不再将各种敏感信息存储在客户端而是将其存储在服务端中仅仅将Session ID返回给前端这样不仅我们的敏感信息没有暴露安全性大大增加同时存储量也大大提升。但是随着业务扩展又会引发新的问题如果你有多台服务器那么当你的请求打到某台服务器Session会存在这台服务器中但是这个信息并不是集群共享的如果你的下一次请求打到别的服务器其他服务器根本无法判断你的身份请求自然而然地失败了。这个问题由该如何解决呢这时Token就能排上用场了我们通过加密算法对用户信息进行加密并将加密后的信息返回给前端这样我们的敏感信息就不会直接暴露在外安全性得到解决。同时当携带Token的请求打到服务端我们又可以对Token进行解密获取用户信息用来验证身份这样集群模式下session无法共享的问题得到解决。为什么Token要存入Redis当Token出现的时候似乎所有问题都得到解决那么为什么我们通常还需要耗费额外空间将Token存入Redis呢这是因为纯无状态的Token是无法被吊销的只要它还在有效期内就永远有效如果用户在有效期内退出登录或者Token被低调的黑客偷走了我们就只能等它过期因此我们可以将其存入Redis这样我们可以设置它的状态比如将其拉入黑名单让其不再失效。这也是企业中更为常用的手段。