文章插图
欢迎关注头条号:JAVA小野猫
Token 认证的优势
相比于 Session 认证的方式来说,使用 token 进行身份认证主要有下面三个优势:
1.无状态
token 自身包含了身份验证所需要的所有信息,使得我们的服务器不需要存储 Session 信息,这显然增加了系统的可用性和伸缩性,大大减轻了服务端的压力 。但是,也正是由于 token 的无状态,也导致了它最大的缺点:当后端在token 有效期内废弃一个 token 或者更改它的权限的话,不会立即生效,一般需要等到有效期过后才可以 。另外,当用户 Logout 的话,token 也还有效 。除非,我们在后端增加额外的处理逻辑 。
2.有效避免了CSRF 攻击
**CSRF(Cross Site Request Forgery)**一般被翻译为 跨站请求伪造,属于网络攻击领域范围 。相比于 SQL 脚本注入、XSS等等安全攻击方式,CSRF 的知名度并没有它们高 。但是,它的确是每个系统都要考虑的安全隐患,就连技术帝国 google 的 Gmail 在早些年也被曝出过存在 CSRF 漏洞,这给 Gmail 的用户造成了很大的损失 。
那么究竟什么是 跨站请求伪造 呢?说简单用你的身份去发送一些对你不友好的请求 。举个简单的例子:
小壮登录了某网上银行,他来到了网上银行的帖子区,看到一个帖子下面有一个链接写着“科学理财,年盈利率过万”,小壮好奇的点开了这个链接,结果发现自己的账户少了10000元 。这是这么回事呢?原来黑客在链接中藏了一个请求,这个请求直接利用小壮的身份给银行发送了一个转账请求,也就是通过你的 Cookie 向银行发出请求 。
<a src=http://www.mybank.com/Transfer?bankId=11&money=10000>科学理财,年盈利率过万</>导致这个问题很大的原因就是: Session 认证中 Cookie 中的 session_id 是由浏览器发送到服务端的,借助这个特性,攻击者就可以通过让用户误点攻击链接,达到攻击效果 。
那为什么 token 不会存在这种问题呢?
我是这样理解的:一般情况下我们使用 JWT 的话,在我们登录成功获得 token 之后,一般会选择存放在 local storage 中 。然后我们在前端通过某些方式会给每个发到后端的请求加上这个 token,这样就不会出现 CSRF 漏洞的问题 。因为,即使有个你点击了非法链接发送了请求到服务端,这个非法请求是不会携带 token 的,所以这个请求将是非法的 。
但是这样会存在 XSS 攻击中被盗的风险,为了避免 XSS 攻击,你可以选择将 token 存储在标记为httpOnly 的cookie 中 。但是,这样又导致了你必须自己提供CSRF保护 。
具体采用上面哪两种方式存储 token 呢,大部分情况下存放在 local storage 下都是最好的选择,某些情况下可能需要存放在标记为httpOnly 的cookie 中会更好 。
3.适合移动端应用
使用 Session 进行身份认证的话,需要保存一份信息在服务器端,而且这种方式会依赖到 Cookie(需要 Cookie 保存 SessionId),所以不适合移动端 。
但是,使用 token 进行身份认证就不会存在这种问题,因为只要 token 可以被客户端存储就能够使用,而且 token 还可以跨语言使用 。
4.单点登录友好
使用 Session 进行身份认证的话,实现单点登录,需要我们把用户的 Session 信息保存在一台电脑上,并且还会遇到常见的 Cookie 跨域的问题 。但是,使用 token 进行认证的话,token 被保存在客户端,不会存在这些问题 。
Token 认证常见问题以及解决办法
1.注销登录等场景下 token 还有效
与之类似的具体相关场景有:
- 退出登录;
- 修改密码;
- 服务端修改了某个用户具有的权限或者角色;
- 用户的帐户被删除/暂停 。
- 用户由管理员注销;
- 将 token 存入内存数据库:将 token 存入 DB 中,redis 内存数据库在这里是是不错的选择 。如果需要让某个 token 失效就直接从 redis 中删除这个 token 即可 。但是,这样会导致每次使用 token 发送请求都要先从 DB 中查询 token 是否存在的步骤,而且违背了 JWT 的无状态原则 。
- 黑名单机制:和上面的方式类似,使用内存数据库比如 redis 维护一个黑名单,如果想让某个 token 失效的话就直接将这个 token 加入到 黑名单 即可 。然后,每次使用 token 进行请求的话都会先判断这个 token 是否存在于黑名单中 。
推荐阅读
- 直肠给药的优缺点有哪些
- 玻璃茶具的优缺点,玻璃茶具的造型品类繁多
- 粗布床单的优缺点有哪些
- Spring Boot 的接口限流算法优缺点深度分析
- 十二属相性格优缺点
- 边境牧羊犬性格优缺点
- 柴犬的市场价 柴犬价格优缺点
- APP开发的技术哪家强?互联网下的APP开发优缺点分析
- 核能发电的原理及其优缺点介绍
- 养柴犬好吗 柴犬好养吗,柴犬优缺点分析