Jwt(Json Web Token)Web安全工具使用

JWT(Json Web Token)

主要防止token被篡改和token信息被获取,无法防止token被获取(存在cookie或者localstorage都要风险),使用cookie的httponly属性来防止xss攻击(防止使用js读取cookie值,document.cookie)

在这里插入图片描述

token传统方式

前后端分离通过Restful API进行数据交互时,如何验证用户的登录信息及权限。在原来的项目中,使用的是最传统也是最简单的方式,前端登录,后端根据用户信息生成一个token,并保存这个 token 和对应的用户id到数据库或Session中,接着把 token 传给用户,存入浏览器 cookie,之后浏览器请求带上这个cookie,后端根据这个cookie值来查询用户,验证是否过期。

+document.cookie;return a}())

  • csrf:利用你在某网站保存的cookie信息来操作你的账号,利用一张图或者链接等形式,当你访问或点击时利用你在某网站的cookie操作你的账号
    如:<img src=”” href=”www.yourbank.com?&transfer = true”

jwt不能主动销毁,只能等token到期时才会自动销毁

项目中的使用

我在项目中使用jwt来实现用户的登录,只适用于访问人数较少还需保持安全性(高并发数据库查询耗费服务器资源太多)

安全防范思想:利用userId作为token的参数,创建一个token,再获取客户端ip地址,再构造一个cookie版本号,三者连接起来作为fullToken在登录时传入数据库保存,登录成功后创建一个session保持用户在网站内的登录状态,在用户注销登录的时候更改cookie的存活时间为0,更改cookie的版本号(+1),session invalidate,在访问网站时,cookie和session都被销毁,只能重新登录(会创建新的jwt更新数据库的fullToken值)
获取客户端ip来判断是否是你注册的时候的ip进行登录的,如果不是,无法登陆成功(保证一定的安全性)

JWT组成

  • 头部(header)
  • 载荷(payload)
  • 签名(signature)。

头部定义类型和加密方式;载荷部分放不是很重要的数据;签名使用定义的加密方式加密base64后的header和payload和一段你自己的加密key(密匙)。
最后的token由base64(header).base64(payload).base64(signatrue)组成。

header:包含着类型和加密所用算法
payload:主要包含token存储的信息和销毁时间等
其中userId就是token存储的最重要的信息

Map<String, Object> payload = new HashMap<>();
            Date date = new Date();
            payload.put("userId",userId.toString() );// 用户ID
            payload.put("iss","face");// 生成者
            payload.put("iat", date.getTime());// 生成时间
            payload.put("ext", date.getTime() + 1000 * 60 * 60 * 12);// 过期时间12小时

signature:对头部和负载部分生成的base64值来接起来使用提供的密匙和加密方法进行加密,行成签名值
最后一步签名的过程,实际上是对头部以及负载内容进行签名,防止内容被窜改。
在这里插入图片描述
最后该jwt形式如下:

eyJpc3MiOiJKb2huIFd1IEpXVCIsImlhdCI6MTQ0MTU5MzUwMiwiZXhwIjoxNDQxNTk0NzIyLCJhdWQiOiJ3d3cuZXhhbXBsZS5jb20iLCJzdWIiOiJqcm9ja2V0QGV4YW1wbGUuY29tIiwiZnJvbV91c2VyIjoiQiIsInRhcmdldF91c2VyIjoiQSJ9

Java实现的jjwt开源库提供对jwt的支持

  • 本文作者: dzou | 微信:17856530567
  • 本文链接: http://www.dzou.top/post/d43b6d5c.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
  • 并保留本声明和上方二维码。感谢您的阅读和支持!