Token笔记
- 是什么
- Session
- Cookie
- token
- 为什么
- Session和Cookie 区别:
- token和Session区别:
- Session缺陷
- token相比而言:
- 怎么做
- token工作流程:
- token结构:
是什么
web应用程序是使用HTTP协议来传送数据的。而HTTP是无状态的协议。所以一旦HTTP报文交换完成,客户端和服务器端就会谁也不认识谁了,这意味着服务器无法从连接上跟踪会话。例如当用户A登陆账号购买了一件商品并放入购物车中,当再次进入该网站购买商品时,服务器已经无法判断是哪个用户(会话)了,所以引入以下几种机制用于跟踪会话。
Session
当用户打开某个web应用时,便与web服务器产生一次Session。服务器使用Session把用户的信息临时保存在了服务器上,用户离开网站后Session会被销毁。这种用户信息存储方式相对cookie来说更安全,可是Session有一个缺陷:如果web服务器做了负载均衡,那么下一个操作请求到了另一台服务器的时候Session会丢失。
Cookie
Cookie 是保存在本地终端的数据。Cookie 由服务器生成,发送给浏览器,浏览器把Cookie 以kv形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该Cookie 发送给服务器。由于Cookie 是存在客户端上的,所以浏览器加入了一些限制确保Cookie 不会被恶意使用,同时不会占据太多磁盘空间,所以每个域的Cookie 数量是有限的。
token
token的意思是“令牌”,是用户身份的验证方式,最简单的token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,由token的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接token请求服务器)。还可以把不变的参数也放进token,避免多次查库。
为什么
Session和Cookie 区别:
· 数据存放位置不同:Session数据是存在服务器中的内存,Cookie 数据存放在浏览器当中。
· 安全程度不同:Cookie 放在服务器中不是很安全,Session放在服务器中,相对安全。
· 性能使用程度不同:Session放在服务器上,访问增多会占用服务器的性能;考虑到减轻服务器性能方面,应使用Cookie 。
· 数据存储大小不同:单个Cookie 保存的数据不能超过4K,一个站点最多保存20个Cookie ,Session对象没有对存储的数据量的限制,其中可以保存更为复杂的数据类型,根据服务器大小来定。
token和Session区别:
- token是开发定义的,Session是http协议规定的;
- token不一定存储,Session存在服务器中;
- token可以跨域,Session不可以跨域,它是与域名绑定的。
Session缺陷
- 传统项目使用Session存在缺陷:放入到服务端,如果负载均衡做得不好将会导致Session很容易消失,用户体验很差;
- 每个用户的登录信息都会保存到服务器的
Session
中,随着用户的增多,服务器开销会明显增大; - 由于
Session
是存在与服务器的物理内存中,所以在分布式系统中,这种方式将会失效。虽然可以将Session统一保存到Redis中,但是这样做无疑增加了系统的复杂性,对于不需要redis的应用也会白白多引入一个缓存中间件; - 对于非浏览器的客户端、手机移动端等不适用,因为
Session
依赖于Cookie
,而移动端经常没有Cookie
; - 由于基于
Cookie
,而**cookie
无法跨域,所以Session
的认证也无法跨域,对单点登录不适用**,Session
共享效率低; - 前后端分离系统中更加不适用,后端部署复杂,前端发送的请求往往经过多个中间件到达后端,
Cookie
中关于Session
的信息会转发多次;
token相比而言:
- 简洁:JWT Token数据量小,传输速度也很快
- 适用于分布式微服务:因为JWT Token是以JSON加密形式保存在客户端的,所以JWT是跨语言的,原则上任何web形式都支持,不需要在服务端保存会话信息,也就是说不依赖于Cookie 和Session,所以没有了传统Session认证的弊端
- 单点登录友好:使用Session进行身份认证的话,由于Cookie 无法跨域,难以实现单点登录。但是,使用token进行认证的话, token可以被保存在客户端的任意位置的内存中,不一定是Cookie ,所以不依赖Cookie ,不会存在这些问题
- 适合移动端应用:使用Session进行身份认证的话,需要保存一份信息在服务器端,而且这种方式会依赖到Cookie(需要 Cookie 保存 SessionId),所以不适合移动端
怎么做
token工作流程:
1、客户端使用用户名和密码请求登录
2、服务端收到请求,验证用户名和密码
3、验证成功后,服务端会签发一个token,再把这个token返回给客户端
4、客户端收到token后可以把它存储起来,比如放到Cookie 中
5、客户端每次向服务端请求资源时需要携带服务端签发的token,可以在Cookie 或者header中携带
6、服务端收到请求,然后去验证客户端请求里面带着的token,如果验证成功,就向客户端返回请求数据
而JWT
就是上述流程当中token
的一种具体实现方式,其全称是JSON Web Token
,官网地址:https://jwt.io/
token结构:
图片来自学习时整理,侵删
SqlSession 的作用类似于一个 JDBC 中的 Connection 对象,代表着一个连接资源的启用。具体而言,它的作用有 3 个:
- 获取 Mapper 接口。
- 发送 SQL 给数据库。
- 控制数据库事务。