Cookie Session JWT三者的区别

Cookie Session JWT三者的区别

Cookie
什么是cookie

cookie 是保存在客户端或者说浏览器中的一小块数据,大小限制大致在 4KB 左右,在以前很多开发人员通常用 cookie 来存储各种数据

cookie被取代的原因

后来随着更多浏览器存储方案的出现,cookie 存储数据这种方式逐渐被取代,主要原因有如下:

  • cookie 有存储大小限制,4KB 左右。
  • 浏览器每次请求会携带 cookie 在请求头中。
  • 字符编码为 Unicode,不支持直接存储中文。
  • 数据可以被轻易查看。
cookie的性质
属性名称属性含义
namecookie 的名称
valuecookie 的值
commentcookie 的描述信息
domain可以访问该 cookie 的域名
expirescookie 的过期时间,具体某一时间
maxAgecookie 的过期时间,比如多少秒后 cookie 过期。
pathcookie 的使用路径,
securecookie 是否使用安全协议传输,比如 SSL 等
versioncookie 使用的版本号
isHttpOnly指定该 Cookie 无法通过 JavaScript 脚本拿到,比如 Document.cookie 属性、XMLHttpRequest 对象和 Request API 都拿不到该属性。这样就防止了该 Cookie 被脚本读到,只有浏览器发出 HTTP 请求时,才会带上该 Cookie。
客户端与服务器之间使用cookie建立联系的传输过程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
在这里插入图片描述

1,初次登录账号,客户端会向服务器发送http请求

2,服务器收到后建立session会话

3,服务器响应客户端反馈一个set-cookie,在没有session的情况下cookie中的内容就包括用户的密码和账号这样的敏感信息,存在一定的危险性

4,客户端收到该请求后,如果服务器给了 Set-Cookie,那么下次浏览器就会在请求头中自动携带 cookie。

5,客户端发送其它请求,自动携带了 cookie,cookie 中携带有用户信息等。

6,服务端接收到请求,验证 cookie 信息,通过就会返回登录后的界面

cooike的特点

cookie 存储在客户端

cookie 不可跨域,但是在如果设置了 domain,那么它们是可以在一级域名和二级域名之间共享的。

ps:cookie储存在客户端,但是在服务器端也会进行验证,进行匹配,在服务器端进行 解码,得到的信息在数据库比对

简单来说cookie既是一个实物存在也是一种机制

Session

从上面得知。cookie提供了一定的方便性,但是也存在一定的危险性,从而引入session来一定程度上提高cookie机制的安全性

session 主要由服务端创建,主要作用就是保存 sessionId,用户与服务端之间的权限确认主要就是通过这个 sessionId。

可以说session是与cookie结合的下面介绍一下seesion的传输过程

客户端和服务器端通过session建立联系的过程

我们可以明显看出session是结合cookie中进行传输的

理解过程
session 由服务端创建,当一个请求发送到服务端时,服务器会检索该请求里面有没有包含 sessionId 标识,如果包含了 sessionId,则代表服务端已经和客户端创建过 session,然后就通过这个 sessionId 去查找真正的 session,如果没找到,则为客户端创建一个新的 session,并生成一个新的 sessionId 与 session 对应,然后在响应的时候将 sessionId 给客户端,通常是存储在 cookie 中。如果在请求中找到了真正的 session,验证通过,正常处理该请求。

这样一来,黑客识别了cookie也意义不大了,因为sessionid就是一个无规律的字符串

session+cookie的缺点
  • 增加请求体积,浪费性能,因为每次请求都会携带 cookie。
  • 增加服务端资源消耗,因为每个客户端连接进来都需要生成 session,会占用服务端资源的。
  • 容易遭受 CSRF 攻击,即跨站域请求伪造。

但是,session是储存在服务器里面的,随着互联网的快速发站,与用户的技术越来越大,服务器 的压力也随之加大,但是如果有多台服务器,一台服务器储存了sessionID,又会面临着需要分享sessionID给其他服务器,为了防止服务器超载需要把用户分配到其他服务器,而其他的服务器需要通用sessionid才会避免用户再次输入用户名和密码,但是这样的方法低效收益性不高,于是就可以让数据库存储sessionid

但是数据库崩了,会直接影响服务器获取sessionid

需求之下,JWT出现了

token
token的组成
token 其实就是一串字符串而已,只不过它是被加密后的字符串,它通常使用 uid(用户唯一标识)、时间戳、签名以及一些其它参数加密而成。我们将 token 进行解密就可以拿到诸如 uid 这类的信息,然后通过 uid 来进行接下来的鉴权操作。
token的生成
前面我们说 cookie 是服务端设置了 set-cookie 响应头之后,浏览器会自动保存 cookie,然后下一次发送请求的时候会自动把 cookie 携带上。但是我们说 cookie 算是一种民间的实现方式,所以说浏览器自然不会对它进行成么处理。token 主要是由服务器生成,然后返回给客户端,客户端手动把 token 存下来,比如利用 localstorage 或者直接存到 cookie 当中也行。

token 认证流程:

1. 客户端发起登录请求,比如用户输入用户名和密码后登录。
2. 服务端校验用户名和密码后,将用户 id 和一些其它信息进行加密,生成 token。
3. 服务端将 token 响应给客户端。
4. 客户端收到响应后将 token 存储下来。
5. 下一次发送请求后需要将 token 携带上,比如放在请求头中或者其它地方。
6. 服务端 token 后校验,校验通过则正常返回数据。

img

总结
鉴权认证方式特点优点缺点
cookie1.存储在客户端。2.请求自动携带 cookie。3.存储大小 4KB。1.兼容性好,因为是比较老的技术。2.很容易实现,因为 cookie 会自动携带和存储。1.需要单独解决跨域携带问题,比如多台服务器如何共享 cookie。2.会遭受 CSRF 攻击。3.存储在客户端,不够安全。
session1.存储在服务端。2.存储大小无限制。1.查询速度快,因为是个会话,相当于是在内存中操作。2.结合 cookie 后很容易实现鉴权。3.安全,因为存储在服务端。1.耗费服务器资源,因为每个客户端都会创建 session。2.占据存储空间,session 相当于存储了一个完整的用户信息。
token1.体积很小。2.自由操作存储在哪里。1.安全,因为 token 一般只有用户 id,就算被截取了也没什么用。2.无需消耗服务器内存资源,它相当于只存了用户 id,session 相当于存储了用户的所有信息。3.跨域处理较为方便,比如多台服务器之间可以共用一个 token。1.查询速度慢,因为 token 只存了用户 id,每次需要去查询数据库。

参考:https://zhuanlan.zhihu.com/p/504924068
https://blog.csdn.net/wangyuancode/article/details/123077594

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值