1.Cookie
在我们第一次发送请求到服务端的时候,服务端会接收请求,然后设置Set-Cookie,里面就是你的登录名和密码,返回给客户端,客户端拿到后就会保存在Cookie里面,之后的每一次请求都会携带Cookie,服务器就认识了你。说白了,就是一个存储在浏览器的数据而已。
这个数据是放在客户端的 ,只要打开浏览器就可以看到自己的Cookie,如果电脑被黑,就完蛋了。所以就有了Session
Cookie缺点
- 大小限制在4KB以内
- 都会消耗网络的带宽
- 不加密则不安全
- 使用JS操作Cookie比较复杂
2.Session(会话)
浏览器访问服务器就是会话的开始,不同的网站对于每个用户的会话都设定了时间Max-age以及唯一的Session ID(是一串没有规律的字符串,还会再发送之前进行一个签名),这个是服务器自己定义的东西,会保存在数据库中。会在请求时候,放在Cookie里面,发给客户端,这时候客户端即使被黑客黑了,也没办法根据这个ID推算出密码。安全性高一点
服务器为了保存用户状态而创建的一个特殊对象。客户端请求服务端,服务端会为这次请示开辟一块内存空间。
Session的缺点
A 服务器存储了 Session,就是做了负载均衡后,假如一段时间内 A 的访问量激增,会转发到 B 进行访问,但是 B 服务器并没有存储 A 的 Session,会导致 Session 的失效。
服务器储存过多的数据,在同一个时间大量人访问就会造成服务器炸了
3.localStorage,SessionStorage
都是用来存储数据,存储的数据将保存在浏览器会话中。
相同点
localStorage和SessionStorage一样都是用来存储客户端临时信息的对象。- 只能存储字符串对象
- 不同浏览器无法共享
localStorage与SessionStroage中的信息。相同浏览器的不同页面间(同源页面)可以共享相同的localStorage,但不能共享sessionStorage。
不同点
localStorage的生命周期是永久,除非用户清除localStorage信息。sessionStorage的生命周期为当前窗口或标签页。一旦窗口永久关闭就结束。
4.Token
Token相比于 session 不需要后端存储,数据全部存在前端,解放后端,释放灵活性 并且token和JWT 是不一样的,原本的Token的编码是用的base64,并且做法上额外增加了cookie数量,数据本身也没有规范的格式,这时候就有了JWT
JSON Web Token (JWT) 是一个开放标准,定义了一种传递 JSON 信息的方式。这些信息通过数字签名确保可信。
JWT它是一种成熟的 token 字符串生成方案,包含了数据、签名。直接看一下一个 JWT token 长什么样:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyaWQiOiJhIiwiaWF0IjoxNTUxOTUxOTk4fQ.2jf3kl_uKWRkwjOP6uQRJFqMlwSABcgqqcJofFH5XCo
jwt生成的token由header、payload、signature三部分组成,这三个部分用小数点“.”分隔开。
-
header,也就是头部信息,是描述这个token基本信息,是一个json格式:
{ "alg":"HS256", "typ":"JWT" } 复制代码alg代表的是后面signature签名部分的生成加密算法,typ表示该token是jwt类型。 -
payload,就是你的那些用户数据,是一个json格式。不过jwt不建议将敏感数据放进里面,因为规范里,payload和header一样,仅仅只是做一次base64编码后显示在token上。
-
signature,是这个token的签名,通常情况下是将前面的header和payload加上一个你自己定义的私钥字符串一起加密生成的字符串。
jwt仅仅是将payload的内容做一次base64编码,攻击你还是比较容易的,但是由于不知道你的私钥,改了之后是没有办法生成正确的签名,用加密的方式再次对请求进来的header.payload进行校验,发现跟signature对不上,直接返回个500假装服务器挂了。
4.1 refresh token
token,作为权限守护者,最重要的就是「安全」。
业务接口用来鉴权的 token,我们称之为 access token。越是权限敏感的业务,我们越希望 access token 有效期足够短,以避免被盗用。但过短的有效期会造成 access token 经常过期,过期后怎么办呢?
一种办法是,让用户重新登录获取新 token,显然不够友好,要知道有的 access token 过期时间可能只有几分钟。
另外一种办法是,再来一个 token,一个专门生成 access token 的 token,我们称为 refresh token。
- access token 用来访问业务接口,由于有效期足够短,盗用风险小,也可以使请求方式更宽松灵活
- refresh token 用来获取 access token,有效期可以长一些,通过独立服务和严格的请求方式增加安全性;由于不常验证,也可以如前面的 session 一样处理
有了 refresh token 后,几种情况的请求流程变成这样:
如果 refresh token 也过期了,就只能重新登录了。