一、Cookie
- Cookie 是在 HTTP 协议下,维护客户工作站上信息的一种方式。Cookie 是由 Web 服务器保存在用户浏览器上的小文本数据文件,它可以包含有关用户的信息。cookie是不可跨域的,每个cookie都会绑定一个单一的域名,并只能在指定的域名下使用
- Cookie就相当于在客户的浏览器上的一个HashMap,存储着服务器端返回的CookieName,和CookieValue,一般这个CookieValue由服务开发者决定(有可能是sessionId,有可能是token,也有可能是JWT)
- cookie的优点
- 可配置到期规则 Cookie 可以在浏览器会话结束时到期,或者可以在客户端计算机上无限期存在,这取决于客户端的到期规则
- 简单性 Cookie 是一种基于文本的轻量结构,包含简单的键值对。
- 数据持久性 虽然客户端计算机上 Cookie 的持续时间取决于客户端上的 Cookie 过期处理和用户干预,Cookie 通常是客户端上持续时间最长的数据保留形式。
- 浏览器可以自动保存服务端返回的cookie信息
- cookie的缺点
- 大小受到限制 大多数浏览器对 Cookie 的大小有 4096 字节的限制,尽管在当今新的浏览器和客户端设备版本中,支持 8192 字节的 Cookie 大小已愈发常见。
- 用户配置为禁用 有些用户禁用了浏览器或客户端设备接收 Cookie 的能力,因此限制了这一功能。
- 潜在的安全风险 Cookie 可能会被篡改。用户可能会操纵其计算机上的 Cookie,这意味着会对安全性造成潜在风险或者导致依赖于 Cookie 的应用程序失败。另外,虽然 Cookie 只能被将它们发送到客户端的域访问,历史上黑客已经发现从用户计算机上的其他域访问 Cookie 的方法。您可以手动加密和解密 Cookie,但这需要额外的编码,并且因为加密和解密需要耗费一定的时间而影响应用程序的性能。
二、Session
- session记录服务器和客户端会话状态的机制。session在服务端生成和保存,并转化为一个临时的Cookie(sessionId)发送给客户端,当客户端第一次请求服务器时,会检查是否携带了这个Session,如果没有则会添加Session。session这种会话存储方式方式只适用于客户端代码和服务端代码运行在同一台服务器上(前后端项目协议、域名、端口号都一致,即在一个项目下)
- Session就相当于在服务器上的一个HashMap,存储着SessionName,和SessionValue,这个SessionName一般就是客户的cookie传来的sessionId,SessionValue一般是登录者的认证和授权信息
- session的优点
- 高效性:Session是基于服务器的,因此在浏览器和服务器之间需要的信息量很小。因此,Session交互可以在Web中很好地处理
- 安全性:Session是在服务器上存储的,所有的数据都在服务器上加密传输并存储。
- 可定制性:Session可以被自定义,允许应用程序开发人员或管理员选择Session的持续时间、大小、编码等参数
- session的缺点
- 扩展性:每个Session都需要在服务器上进行保存,这样如果公司的用户量特别大,那么需要的服务器成本将大大增加。另外,由于Session是在服务器上存储的,这意味着它们不适用于大规模分布式环境
- 因为Session是基于后端的,如果服务器故障或重启,那么所有的Session都会被清理
三、Token
- token一般来说就是一个随机字符串id,是令牌,访问资源接口(API)时所需要的资源凭证。Token 使服务端无状态化,不会存储会话信息。一般来说,token实际存储的信息需要从DB重新获取
- token的优点
- 灵活性:Token可以用于任何身份验证方案,并且可以在多种安全设施下使用。
- Token强制实行无状态性,这意味着应用程序无需在每个请求中添加没有必要的Session数据,并且可以轻松地扩展到多个Web服务器。
- token的缺点
- 令牌可能被窃取并用于攻击
- token还是需要DB存储对应的用户信息
四、JWT
- JSON Web Token(简称 JWT)认证授权机制,是目前最流行的跨域认证解决方案
- 用户的状态不再存储在服务端的内存中,所以这是一种无状态的认证机制。
- 可以使用 HMAC 算法或者是 RSA 的公/私秘钥对 JWT 进行签名。因为数字签名的存在,这些传递的信息是可信的。
- JWT一般来说,已经包含了用户的认证和授权信息,只需要客户端传过来,服务端解密就行
- JWT的优点
- 有token的所有优点
- JWT本身包含了用户信息,无需服务端存储用户信息
- JWT的缺点
- JWT过期无法服务端操作
- 令牌可能被窃取并用于攻击
五、理论上来说
- 可以用cookie存储token,JWT,sessionId任意一种数据
- 也可以在header中传输token,JWT
- cookie,session最主要的就是标准实现,存sessionId,传sessionId,取session信息
- 服务端如果用token,建议使用缓存保存token对应的用户认证授权信息
- 如果是JWT,则不需要保存任何用户信息,直接解密即可,但是需要考虑JWT无法手动过期问题
- 即使用token,JWT,客户端可以用cookie保存,也可以从参数,header传过来,服务端可以用session保存信息,也可以用缓存保存信息