解决什么问题?
- 解决http无状态的问题,说简单点就是用户身份的验证
举个例子:
张三在银行里面存1块钱,第二天张三去银行里取1块钱,银行就问你怎么证明你是张三?,你怎么证明你在这里存了1元?
http是无状态的,他也不知道你之前在干了什么
Cookie(客户端存储)
浏览器自动支持的储存用户访问的信息的,数据储存在客户端
举个例子:
张三在银行里面存1块钱,然后银行给张三打了个存条,(姓名:张三;存款 : 1 元;有效期 1 天)
第二天张三去银行里取1块钱,就把存条给银行,银行核验存条,就给张三 1 元
问题来了
问题 1:
张三在银行里面存1块钱,然后银行给张三打了个存条,(姓名:张三;存款 : 1 元;有效期 1 天)
回家的时候存条被李四看见了,李四做了一个一模一样的存条(姓名:张三;存款 : 1 元;有效期 1 天)
第二天李四去银行里取张三的1块钱,就把存条给银行,银行就给李四 1 元
问题 2:
张三在银行里面存1块钱,然后银行给张三打了个存条,(姓名:张三;存款 : 1 元;有效期 1 天)
回家的时候偷偷将存条的数字改成 2 元(姓名:张三;存款 : 2 元;有效期 1 天)
第二天张三去银行里取钱,就把存条给银行,银行核验存条,就给张三 2 元
就是 cookie 的数据容易泄露或者被篡改的问题.
Session(会话)
- 定义:Session 是服务器端保存的用户状态信息。每个用户的会话在服务器端有一个唯一的标识(通常是 Session ID)。
解决的问题
- 主要是为了解决cookie(客户端储存)容易被篡改与泄露的问题
举个例子:
张三在银行里面存1块钱,然后银行有一个记账本,然后记录,(序号 001,姓名:张三;存款 : 1 元;有效期 1 天);然后给张三一个小票(001)
第二天张三去银行里取钱,就把小票(001)给银行,银行根据小票查询账本找到张三的存款记录,给张三 1 元
问题来了
现在银行越来越大,开了很多子银行,今天张三去银行的 1 号分行存 1 元, 明天到 2 号分行取钱的时候找不到他的存款记录.
就是服务器拓展问题,服务器拓展的时候,不同服务器的数据不是共享的.因此 session 也不是共享的
所以
- 要么使用一个共享的空间(MySQL,redis 这样的数据库),
- 要么就把数据给用户持有,但是用户持有又会有安全问题
token(令牌)
用户持有的访问令牌
解决的问题
- 解决用户持有数据的安全问题
原理: 数据进行加密处理
举个例子:
- 现在银行做了一个密码本
- 将客户的存条进行加密,没有密码本,就无法看懂存条的内容,也就无法修改
张三在银行的 1 号分行里面存1块钱,银行先开了个存条,(姓名:张三;存款 : 1 元;有效期 1 天),然后讲存条进行加密变成了一个加密存条(************),然后给张三,然后告诉张三,拿着这个可以到任何一家银行取到钱
第二天张三去银行的二号分行里取钱,就把加密存条(************)给银行,银行先通过密码本进行解密,发现内容是(姓名:张三;存款 : 1 元;有效期 1 天),就给张三 1 元
问题:token是无状态的
token是无状态的,除了自动过期,无法强制过期(失效)
如何解决?
- 使用session的方式,如果有问题在服务端删除(过期)他的session.
- 采用黑名单的方式.
举个例子:
张三在银行的 1 号分行里面存1块钱,银行先开了个存条,(姓名:张三;存款 : 1 元;有效期 1 天),然后讲存条进行加密变成了一个加密存条(************),然后给张三,然后告诉张三,拿着这个可以到任何一家银行取到钱
这时张三犯法了(他的一块钱是骗来的),要冻结张三的所有资产,这时候必须通知每个银行,张三有问题,不能取走 1 元钱
这时候银行推出一个黑名单,每个人要取钱的时候先检查是否在黑名单中,如果在就无法操作.