Cookie, Session,localstorage,SessionStorage,Token

136 阅读4分钟

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

都是用来存储数据,存储的数据将保存在浏览器会话中。

相同点

  • localStorageSessionStorage一样都是用来存储客户端临时信息的对象。
  • 只能存储字符串对象
  • 不同浏览器无法共享localStorageSessionStroage中的信息。相同浏览器的不同页面间(同源页面)可以共享相同的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加上一个你自己定义的私钥字符串一起加密生成的字符串。

image.png

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 也过期了,就只能重新登录了。