JWT使用指南

什么是jwt以及工作流程?

可以看下面的链接

http://blog.leapoahead.com/2015/09/06/understanding-jwt/

JWT是否要设置过期?

如果不设置过期的话,jwt一旦被中间人获取,就可以永远使用,服务端是无法分辨出来的,因为jwt的无状态特性。

所以过期时间是要设置的,而且短些比较好。

token过期了,理论上要跳到登录页面重新登录,重新换取token的。比如我们设置1小时过期,用户每过1小时就需要重新输入密码,是不是感觉很奇怪呢?讨论怎么处理之前,我们先看下又一个问题,假如要登出怎么办?

 

怎样处理登出?

我搜了很多的文章,总结有以下几种

1.从客户端把jwt删除,服务端不做处理

问题就是,自己骗自己,被删除的这个token还能用,如果你设置了过期时间,那就还好,等到期就失效了,如果你没有设置过期时间,那就永远有效,这也是jwt设置较短过期时间的又一个好处,但是又会有jwt经常过期,登录的问题

2.创建一个黑名单,在验证jwt之前,先检查黑名单里是否存在,如果不在就往下走,在的话直接认证不通过

问题就是,每次请求都多了一步检查黑名单,而且最重要的是违背了jwt的设计思想,jwt的无状态特性

3.给jwt设置一个短的过期时间,而且经常刷新获取新token,即refreshtoken

这样就可以和1结合,那如何换取新token呢?这个和怎么处理过期一起讨论

 

怎样处理过期?

使用refresh token,流程如下

不过我对这里有一个疑惑,在db存储refresh token 就不算违背jwt的无状态特性了吗?

补充下图,这里的状态指的是验证服务器,而不是应用服务器,应用服务器还是无状态的,refresh token只能请求 ,auth server,在应用服务器无作用的。

安全性问题

Persisting JWT token in localstorage (prone to XSS) < Persisting JWT token in an HttpOnly cookie (prone to CSRF, a little bit better for XSS) < Persisting refresh token in an HttpOnly cookie (safe from CSRF, a little bit better for XSS).

w w w w wjwt存储到内存中,refresh token 可以使用httponly持久化cookie, 每次启动app时可以用refresh token,(如果refresh token没过期的话,过期就跳转到登录页面),获取新的jwt token和refresh token,流程如下

参考链接:

https://hasura.io/blog/best-practices-of-using-jwt-with-graphql/#refresh_token_persistance

https://stackoverflow.com/questions/21978658/invalidating-json-web-tokens/52407314#52407314

https://auth0.com/blog/refresh-tokens-what-are-they-and-when-to-use-them/

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章