一、token和cookie的区别
- 首先cookie和localstorage、sessionstorage一样浏览器本地存储的字段。
- cookie分为会话cookie和永久cookie。
- 本身http是无状态的,每次刷新要重新登录,所以通过一些字段来存储用户信息
- 如果你通过 localstorage 使用 JWT,那么可以避免 CSRF,但是另一方面,如果你用 cookie 来存储 JWT,那就需要防护 CSRF。
- 当一个用户打开淘宝登录后,刷新浏览器仍然展示登录状态。服务器如何分辨这次发起请求的用户是刚才登录过的用户呢?这里就使用了session保存状态。
- 然后cookie一般存储的是sessionid,而session是在每次登录后产生,每当登录成功后,服务器会产生一个session储存在数据库或者redis当中,然后返回sessionid给客户端
- 全称是 JSON WEB TOKEN,应用得比较多的地方是多点登录,所有的验证信息是存储在客户端,不需要后端存储在 redis 当中。当用户登录的时候,服务器签发一个 token 返回给客户端,这个 token 是一个加密的数据,只有服务器自己能解密,然后每次客户端发起请求时都会带上这个 token, 服务端通过自己的算法解密校验,里面携带了一些用户相关的信息,解密即可获取。用以前的 sessionID 的方式的话,redis 里需要一直存储这个 sessionid 对应的信息,直到过期。每次请求带来 sessionID 都需要去 redis 里面取一次用户信息,当用户量非常大的时候,redis 需要存储的内容也就非常多了。
二、token和session的比较
教程:segmentfault.com/a/119000001…
补充:session不一定要放在cookie中,也可以放在url中
Session的弊端
1、服务器压力增大
通常session是存储在内存中的,每个用户通过认证之后都会将session数据保存在服务器的内存中,而当用户量增大时,服务器的压力增大。(可以将数据保存在磁盘中)
2、CSRF跨站伪造请求攻击
session是基于cookie进行用户识别的, cookie如果被截获,用户就会很容易受到跨站请求伪造的攻击。
3、扩展性不强
如果将来搭建了多个服务器,虽然每个服务器都执行的是同样的业务逻辑,但是session数据是保存在内存中的(不是共享的),用户第一次访问的是服务器1,当用户再次请求时可能访问的是另外一台服务器2,服务器2获取不到session信息,就判定用户没有登陆过。(可以使用分布式session将session在各个集群中保持一致)
Token可以有效解决session的CSRF跨站伪造请求攻击,虽然token也有被截取的风险,但是可以通过https加密及合理设置token的有效时间及刷新时间来解决。