引言:HTTP协议是无状态的,这种无状态意味着程序需要验证每一次请求,从而辨别客户端的身份。
Cookie
- cookie由服务器生成,发送给浏览器,浏览器把cookie以kv形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该cookie发送给服务器。所以cookie是保存在浏览器的客户端。
- 单个cookie保存的数据不能超过4k,很多浏览器都限制一个站点最多保存20个cookie。
- 一般会存储用户的身份信息。
- 可以删除,删除后,重新访问会再次生成。
- 有些系统也会通过cookie记录一些用户的操作习惯。
- cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗。
Session
- 登录后,服务器端发送一个随机的ID值,来进行用户身份的识别。
- 服务器使用session把用户的信息临时保存在了服务器上,用户离开网站后session会被销毁。这种用户信息存储方式相对cookie来说更安全。
- 缺陷:如果web服务器做了负载均衡,那么下一个操作请求到了另一台服务器的时候session会丢失。所以session一般只针对一个应用服务器有效。
- 有时效性,一般30分钟。
Token
基于Token的身份验证的过程如下:
用户通过用户名和密码发送请求。
程序验证。
校验成功后就返回一个签名的Token给客户端。
客户端储存token。
客户端每次访问API都是携带Token到服务器端。
服务器端采用filter过滤器校验。校验成功则返回请求数据,校验失败则返回错误码
Token的优势:
- 无状态、可扩展
- 在客户端存储的Tokens是无状态的,并且能够被扩展。基于这种无状态和不存储Session信息,负载均衡器能够将用户信息从一个服务传到其他服务器上。
- 安全性
- 请求中发送token而不再是发送cookie能够防止CSRF(跨站请求伪造)。即使在客户端使用cookie存储token,cookie也仅仅是一个存储机制而不是用于认证。不将信息存储在Session中,让我们少了对session操作。
- 有时效性,一段时间之后用户需要重新验证。
- 可扩展性
- Tokens能够创建与其它程序共享权限的程序。例:能将一个随便的社交帐号和自己的大号(Fackbook或是Twitter)联系起来。
- 使用tokens时,可以提供可选的权限给第三方应用程序。
- 多平台跨越
- 只要用户有一个通过了验证的token,数据和资源就能够在任何域上被请求到。
- 涉及到CORS(跨域资源共享),参阅跨域资源共享 CORS 详解
Note:一些发展史及更详细的解说也可参阅cookie、session与token的真正区别