学习这三样的只需要知道一个前提,http协议是无状态的,他不会保存服务器和浏览器之间通信
其次我们还要知道前端存储问题,前端拿到信息存在哪里? 1.html定义的一个storage 2.存在cookie中 3.定义一个变量保存(刷新之后可能就没了)
cookie
从一个情景来看cookie,假设一个用户访问了网站a,服务器收到了请求,首先对用户进行了验证。
验证成功了就返回以kv形式的数据(可以有多个,也可以只有一个),数据被保存在set-cookie这个响应头中,
然后浏览器收到之后,将这些内容保存某个位置,下次再对这个网址发请求的时候使用浏览器会为我们自动带上cookie(同时这样会造成csrf攻击)
服务器在又一次接到用户请求后,通过查看cookie对不同的客户做了简单区分
整个过程就像我们在学校,老师让我们填表,老师给每一张表上填上了你的个人信息,然后发到你手上让你看看有没有错误然后保存好。
这样每个人都一张表,这张表的大小是有限制不能无限大的,假设老师都不认识我们,但是只要让他们拿到这张表之后就知道我们是谁了
session
上面的情况是让用户各自保存手上的这张表,对于老师来说她们没有这份信息,老师担心这张表在你们手上的安全性(比如说冒充他人),所以老师决定将所有的表保存在自己手上(这也是常见的做法)
表一但多了就要进行区分,老师又不想记名字,就给每个同学发送一个seesionid,以后每个人记住自己的sessionid就行了(就像学号一样),以后和老师交流的时候只要告诉老师我的学号是什么,老师在后台的存储位置(比如说存在内存,内存型数据库redis,数据库)找到你的信息,我们的会话装填就会记录在你特定的位置上
sessionid怎么传来传去的呢?通常是使用cookie来传递,当然也可以通过其他形式来传递
token
使用session的形式保存sessionid,这里涉及到了会话状态的存储,会话状态要么存储在数据库中要么存储在内存中,由于服务器要做负载均衡,每台设备都要能访问到的话要么做分布式处理要么都存储在同一数据库,两样做法都有极大的缺陷
再这些缺陷下,token不在保存会话状态,而是将一些信息存储在token生成的一段令牌(一段数据),将token传递到用户本地,每一次发送请求都由用户将其带上。
每一次接到请求由服务器对token进行解析,解析的信息中就包含了会话状态。
由于token的时效性比较短,服务器使用了另外一个refleshtoken,他的时效性比token长。
每一次发送请求都会带上两个token,第一个token失效时,服务器就会通过检验第二个refleshtoken的时效,如果还有的话就会重新生成一个token,如果失效的话,就得让用户跳转到登录页面
单点登录
像一些企业,他们的域名不会同属一个根域名,比如说天猫和淘宝,但是他们的认证能够共享
这个问题先留着
|