cookie/session/token三者区别和优缺点
- cookie
- session
- token
- 三者对比
cookie
cookie由服务器生成,发送给浏览器,浏览器把cookie以kv形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该cookie发送给服务器。==所以cookie是保存在浏览器的客户端。==一般会存储用户的身份信息,有些系统也会通过cookie记录一些用户的操作习惯。
优点:
- 易于使用,可以由服务器在响应头中设置。
- 大多数浏览器支持并在所有请求中发送cookie。
- 可以存储大量数据。
- 与服务器保持状态,有助于进行状态管理。
缺点:
- 大小限制(通常为4KB)并且浏览器都限制一个站点最多保存20个cookie。
- 易于遭到XSS攻击,因为存储在客户端,攻击者可以访问。
- CSRF攻击,需要额外的防护措施。
- 隐私问题,用户数据存储在本地,并且数据可以被轻易查看。。
- 性能影响,每次请求都会发送cookie数据。
- 字符编码为 Unicode,不支持直接存储中文。
- 不可跨域
session
Session是一种在服务器端存储用户会话信息的方式,通常与Cookie配合使用,以保持用户的状态。Session的优点包括安全性较高,因为数据保存在服务器端,不易被篡改;其缺点包括可能增加服务器的负担,特别是在高并发情况下,以及可能面临扩展性问题,如服务器集群时的Session同步问题。
优点:
- 存储空间较cookie大。
- 不会被保存在客户端,相对更安全。
- 可以使用服务器端存储,如数据库,可以更容易进行扩展。
缺点:
- 需要在服务器端保存,增加服务器负担。
- 依赖于服务器,服务器宕机或重启会导致数据丢失。
- 无法跨域进行session管理。
- 用户登录后,服务器需要维护用户状态,增加服务器负担。
token
Token则是在服务器端生成并在认证过程中分发给客户端的数据片段,通常用于验证客户端的身份。Token可以包含用户的身份信息和权限声明,存储在服务器的数据库中;客户端可以将Token保存在任何地方,如本地存储或服务器端的缓存系统中。Token 可以有效地避免了 Cookie 的一些安全问题,比如 CSRF (跨站请求伪造)攻击。
优点:
- 无需在服务器端保存session信息,减少服务器负担。
- 支持跨域会话(只要客户端携带token即可)。
- 无状态、可扩展性好。
- 支持移动设备使用。
- 安全性较高,不需要保存在客户端。
- 不需要依赖cookie,可以避免XSS和CSRF攻击。
缺点:
- 如果token被盗,那么攻击者可以不受限制地访问数据。
- 每次请求需要传输token,可能会增加带宽消耗。
- 服务器不能主动向客户端发送信息,需要依赖于客户端轮询或者长轮询。
三者对比
cookie、session、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,每次需要去查询数据库。 |
总结下来就是session 是空间换时间,token 是时间换空间。
cookie数据存放在客户的浏览器上、session数据放在服务器内存上、token存储在服务器数据库上
参考文章:https://zhuanlan.zhihu.com/p/631349844