这里写自定义目录标题
Cookie Session JWT三者的区别
Cookie
什么是cookie
cookie 是保存在客户端或者说浏览器中的一小块数据,大小限制大致在 4KB 左右,在以前很多开发人员通常用 cookie 来存储各种数据
cookie被取代的原因
后来随着更多浏览器存储方案的出现,cookie 存储数据这种方式逐渐被取代,主要原因有如下:
- cookie 有存储大小限制,4KB 左右。
- 浏览器每次请求会携带 cookie 在请求头中。
- 字符编码为 Unicode,不支持直接存储中文。
- 数据可以被轻易查看。
cookie的性质
属性名称 | 属性含义 |
---|---|
name | cookie 的名称 |
value | cookie 的值 |
comment | cookie 的描述信息 |
domain | 可以访问该 cookie 的域名 |
expires | cookie 的过期时间,具体某一时间 |
maxAge | cookie 的过期时间,比如多少秒后 cookie 过期。 |
path | cookie 的使用路径, |
secure | cookie 是否使用安全协议传输,比如 SSL 等 |
version | cookie 使用的版本号 |
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 后校验,校验通过则正常返回数据。
总结
鉴权认证方式 | 特点 | 优点 | 缺点 |
---|---|---|---|
cookie | 1.存储在客户端。2.请求自动携带 cookie。3.存储大小 4KB。 | 1.兼容性好,因为是比较老的技术。2.很容易实现,因为 cookie 会自动携带和存储。 | 1.需要单独解决跨域携带问题,比如多台服务器如何共享 cookie。2.会遭受 CSRF 攻击。3.存储在客户端,不够安全。 |
session | 1.存储在服务端。2.存储大小无限制。 | 1.查询速度快,因为是个会话,相当于是在内存中操作。2.结合 cookie 后很容易实现鉴权。3.安全,因为存储在服务端。 | 1.耗费服务器资源,因为每个客户端都会创建 session。2.占据存储空间,session 相当于存储了一个完整的用户信息。 |
token | 1.体积很小。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