本文已参与 周末学习计划,点击查看详情
这是我参与更文挑战的第4天,活动详情查看: 更文挑战
JWT认证流程
- 用户向服务器提交用户信息
- 服务器验证用户的信息
- 服务器通过验证时,发送给用户一个Token
- 客户端存储Token,并在每次请求时附送上这个Token值
- 服务端验证Token值,并返回数据
JWT使用流程图
JWT的优缺点
- 优点:
- 通用:基于json的通用性,JWT是可以进行跨语言支持的,如JAVA、Python等语言都可以使用
- 可存储部分非敏感数据:可以在JWT的payload部分存储一些其他业务逻辑所必要的非敏感信息
- 便于传输:JWT的构成非常简单,字节占用很小,所以它是非常便于传输的
- 易于拓展:它不需要在服务端保存会话信息, 所以它易于应用的扩展
- 缺点(注意事项):
- 不应存放敏感数据:客户端可以使用Base64URL算法解密payload部分,因而安全性无法保证
- 保护好私钥:私钥(secret)用于服务端的认证,如透露将可能导致认证失效
- 无法废止或修改Token:由于服务器不保存状态,因此无法在使用过程中废止某个 token,或者更改 token 的权限。一旦 JWT 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。
前端如何使用JWT?
- 前端收到服务器返回的 JWT,可以储存在 Cookie 或 localStorage 中。
- 此后,前端每次与服务器通信,都要带上这个 JWT:
- [ 不推荐 ] 放在 Cookie 里面自动发送,但是这样不能跨域
- [ 其它方法 ] 放在 Cookie 内,跨域的时候,JWT 就放在 POST 请求的数据体里面。
- [ 推荐 ] 放在 HTTP 请求的头信息 Authorization 字段里面
Authorization: Bearer <token>
fetch('api/user/1', {
headers: {
'Authorization': 'Bearer ' + token
}
})
复制代码
后端(Django)如何使用JWT?
Django 可以基于DRF(Django REST framework),使用插件Simple JWT(djangorestframework-simplejwt)快速实现JWT认证。
- 为什么不用 django-rest-framework-jwt :该项目已停止更新,不再支持最新版的Django。其开发者推荐的替代品为Simple JWT(djangorestframework-simplejwt)
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END