1.它们的作用
每当客户端每一次与服务端进行通信(发送请求)时,都要与服务端重新链接,但是下一次请求与上一次请求是没有关系的。这是 HTTP 协议是无状态的特性。而因为不同次请求时无关系的,为了方便判断发出两次请求的是不是同一个人,cookie token session就为此而生即解决客户端标识的问题 。
2.cookie
1.cookie 是啥
浏览器中的cookies意思是指服务器暂存放在你的电脑里的txt格式的文本文件资料,主要用于网络服务器辨别电脑使用。比如浏览网站时,Cookies记录下来你输入的一些资料和信息。当再访问同一个网站,就会依据Cookie里的内容来判断使用者,送出特定的信息内容给你。
比如用户在一个页面完成登录,登陆完成后后端会生成一个 sessionid 并把它放在 cookie 中返回给客户端,并且服务端一直记录着这个 sessionid,每当客户端向服务端发送请求后都会带上这个 sessionid 。而服务端就依靠这个 sessionid 来判断请求者的身份。(http无状态,浏览器每次请求会携带 cookie 在请求头中)
2.限制条件
①cookie 有存储大小限制,4KB 左右。
②默认有跨域限制,不可设置跨域共享 cookie,不可设置跨域传递 cookie
③字符编码为 Unicode,不支持直接存储中文。
⑥数据存储在客户端,容易被窃取和截获
3.session
1.session 是啥
与cookie一样,也是为了存储用户相关的信息
不同的是cookie存储在客户端,session存储在服务器
存储在服务器的数据会更加安全,不容易被窃取
2.与 cookie 的联动
① 用户登录,服务端会为用户生成一个 session ,同时分配一个的 sessionId ,后面服务端就可以根据这个 sessionid 来判断到他到底是哪个用户,然后将此 sessionid 通过 cookie 传给浏览器
② 之后用户在浏览器的每次发送每一次请求时,服务器都会检查该请求里面是否包含 sessionId 标识,如果包含了 sessionId,则表示服务端之前已经和客户端创建过 session,然后就通过这个 sessionId 去查找真正的 session,如果没找到,则为客户端创建一个新的 session,并生成一个新的 sessionId 与 session 对应,然后在响应的时候将 sessionId 放在 cookie 中给客户端。
3.限制条件
①Session每次工作时依赖cookie,如果当浏览器不适配cookie,或者发生跨站请求时,Session就无法工作了。
②Session如果存储在服务器内存中,则会占用大量服务器资源
③Session如果存储的数据库中,则可以解决分布式部署多个服务器间session共享和同步问题,但是如果数据库挂了,则所有分布式服务器的session认证都会失败,所以数据库也要集群部署,这意味着一份session需要被复制到多个数据库中。
④Session认证机制,本质是基于用户名和密码的认证机制,服务器需要取出session中保存的用户名和密码,去和数据库中的用户名和密码进行对比,每次session认证都需要进行一次数据库查询。
4.token
1.token是啥
当客户端向服务端发送请求时,服务端会生成的一串字符串,这个字符串可以作为客户端进行请求的一个标识。 所以当用户第一次登录后,服务器生成一个 token 并将此 token 发送给客户端,每当客户端需要请求数据时,客户端只需带上这个 token 向服务端来请求数据即可,无需再次带上用户名和密码。
2.token的字符串
这个字符串是被加密后的字符串,它通常使用 uid(用户唯一标识)、时间戳(当前时间的时间戳)、签名(签名token 的前几位以哈希算法压缩成的一定长度的十六进制字符串)以及一些其它参数加密而成。反之,我们也可以将 token 进行解密从而拿到 uid 等一些的信息。
5.总结
特点 | 优点 | 缺点 | |
cookie | 1.存储在客户端。2.请求自动携带 cookie。3.存储大小为 4KB。 | 1.兼容性好且很方便,因为 cookie 会自动携带和存储。 | 1.需要解决跨域问题,若有多台服务器如何共享 cookie。2.易遭受 CSRF 攻击。3.存储在客户端,不安全。 |
session | 1.存储在服务端。2.存储大小无限制。 | 1.查询速度快,因为是个会话,相当于是在内存中操作。2.结合 cookie 后很容易实现鉴权。3.安全性好,因为存储在服务端。 | 1.存储在服务端,还有每个客户端都会创建各自的 session 且都存着各自的所有信息,易耗费服务器资源。 |
token | 1.体积很小。2.可自由存储在任意地方。 | 1.安全性好,因 token 一般只有用户 id。2.消耗服务器内存资源很少,它几乎只存了用户 id.3.跨域处理较为方便,比如多台服务器之间可以共用一个 token。 | 1.查询速度慢,因 token 只存了用户 id,每次需要去查询数据库。 |