天天看点

Java | 分布式——JWT加密

一、分布式Session共享

Session是服务器用来保存用户操作的一系列会话信息,由Web容器进行管理。单机情况下,不存在Session共享的情况,分布式情况下,如果不进行Session共享会出现请求落到不同机器要重复登录的情况:在一些需要用户登录的网站下,如果因为用提交的请求给到了不同的服务器进行处理,而需要让用户重复登录,这是一件非常扯蛋的操作。所以必须让所有服务器都能准确判断请求属于哪个用户。

一般来说解决Session共享有以下几种方案:

Tomcat广播风暴(占用资源,不推荐)

redis统一存储token(推荐)

JWT加密

本文主要介绍JWT加密的方法,JWT(Json web token)是通过HMAC算法或者RSA的公钥密钥签名生成携带用户信息的token,将token存放在客户端中(可以存储在cookie,localstorage和sessionStorage中),客户端每次发送请求,都携带token,服务端通过解密来获取用户信息。

优点:

token包含用户的基本信息,避免再次查库;

token存储在客户端,不占用服务器资源。

缺点:

token经过base64编码,可以被解码,因此不能包含用户敏感信息(用户权限、密码等);

服务器无存储,因此不能做登录失效处理,除非更改服务器密钥。

JWT格式包括3类,下面是一段JWT:

头部:主要是描述签名算法;

负载:主要是描述加密对象的信息,主要描述是加密对象的信息,如用户的id等,也可以加些规范里面的东西,如iss 签发者,exp 过期时间,sub 面向的用户;

签名:主要是把前面两部分进行加密,防⽌别⼈拿到token进行base解密后篡改token。

在SSM框架中,JWT的使用方法:

添加依赖(POM.xml)

添加工具类,开发:生产token方法、校验token方法

相关类中调用

1、登录时生成token。

2、私有网页,拦截器拦截验证(不包括登录和注册页面请求)。