cookies和storage的区别
首先说说Cookie和H5新出的Storage的区别
分类 | cookies | localStorage | sessionStorage |
---|---|---|---|
有效期 | 一般由服务器生成,可设置失效时间。如果在浏览器端生成Cookie,默认是关闭浏览器后失效 | 除非被清除,否则永久保存 | 仅在当前会话下有效,关闭页面或浏览器后被清除 |
数据大小 | 4K左右 | 5M左右 | 同左 |
与服务器端通信 | 每次都会携带在HTTP头中,如果使用cookie保存过多数据会带来性能问题 | 仅在客户端(即浏览器)中保存,不参与和服务器的通信 | 同左 |
cookies鉴权过程
- 客户端第一次访问服务器时服务器端创建seesion,然后保存seesion(我们可以将seesion保存在内存中,也可以保存在redis中,推荐使用后者),然后给这个session生成一个唯一的标识字符串,然后在响应头中返回这个唯一标识字符串。
- 签名。这一步通过秘钥对sid进行签名处理,避免客户端修改sid。(非必选)
- 浏览器中收到请求响应的时候会解析响应头,然后将sid保存在本地cookie中,浏览器在下次http请求的请求头中会带上该域名下的cookie信息,
- 服务器在接受客户端请求时会去解析请求头cookie中的sid,然后根据这个sid去找服务器端保存的该客户端的session,然后判断该请求是否合法。
JWT鉴权过程
1. 客户端使用用户名和密码的方式向后台请求登录
2. 服务器验证账号和密码的真伪,如果正确,则通过后台秘钥加密生成一个token字符串返回给客户端
3. 客户端收到token之后保存起来,之后的每次请求都要在请求头里面携带token(不同于cookies自动发送)
4. 服务器收到token之后,通过秘钥进行验证是否为当前服务器颁发,通过验证则返回数据。
总结
cookies鉴权是最常见的方法,但是可能会导致一些安全性的问题,通过CSRF攻击,当登录的服务没有退出或者cookies还没失效,通过诱导触发一个get请求导致财产等受损(默认情况下cookies会在get请求下自动发送),除此之外还有一个性能问题,cookies对应的session是存储在服务端的,一旦登录的用户很多会导致服务器内存开销过大,并且做负载均衡的时候也会出现分布式session的问题等,在token鉴权中,也会出现一些需求不太好解决,因为jwt鉴权是无状态的,注销用户等操作老token依旧还可使用以及token续签问题等,但是我们还要根据使用场景灵活使用两种鉴权方式。