当前位置:首页 > 数码 > 正文

登录token无效(TOKEN无效)

传统的web登录是将登录信息缓存到服务器的会话中,每个会话都有一个唯一的sessionId。浏览器的请求服务器会自动将sessionId带入请求头的cookie中,开发时一般是不知道sessionId的。token的本质是一个加密的字符串,其中包含了登录用户的信息。

令牌登录验证序列图

登录token无效(TOKEN无效)  第1张

令牌登录序列diagram.png

为什么使用token?

与会话相比,令牌有以下优点

服务端不需要缓存用户信息,减少服务器压力token缓存在客户端,服务器重启,登录状态不会失效session是浏览器特有的,app要支持会比较繁琐,token就没有这样的限制易于扩展,存在多台服务器的情况下,使用负载均衡,第一次登录请求转发到A服务器,在A服务器的session中缓存了用户的登录信息,如果第二次请求转发到了B服务器,就丢失了登录状态。虽然可以使用redis等手段共享session,但token就简单很多,不同的服务器只需要使用相同的一段解密代码即可

生成java令牌方法

JWT(JSON Web令牌)

在互联网上找到的大多数材料使用JWT生成令牌,而JWT生成的令牌包含三个部分。

header:包含token类型和加密算法payload:存放自定义数据signature:对前面两部分的签名,防止篡改数据\r\n\r\n用JWT生成的token是很长的一串字符串,用Base64进行编码,可以解码出原数据,注意不能放一些私密信息,比如用户密码eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9\r\n.eyJleHBpcmVUaW1lIjoxNTQ5NTU0NDUyLCJ1c2VyTmFtZSI6IuacveacqCIsInVzZXJJZCI6IjY2NiJ9\r\n.fiQKWuMTWbkfQ3dOozoJr13pJSmKnc5El4EBnKyU42o

上面这一长串是JWT生成的令牌。你能感觉到这个长度。我个人很难接受客户端的每个请求都要带这么大的字符串,服务器的每个响应都要返回这么大的字符串。所以我用了下面的方法。

高级加密标准

token的本质是一个加密的字符串,其中包含了登录用户的一些信息,可以通过解密得到,所以理论上任何安全的加解密手段都可以用来生成token。

高级加密标准AES,在密码学中也称为Rijndael加密,是美国联邦 *** 采用的块加密标准。AES采用对称加密,比非对称加密效率更高。

对称加密:加密和解密使用相同的密钥。适用于单方面的加密解密,密钥不能泄露非对称加密:使用公钥加密,私钥解密。适用于一方加密,另一方解密,比如前后端的数据传输,可以在客户端使用公钥对数据进行加密,在服务端使用密钥进行解密,增强数据安全性 token的加密解密都在服务端进行,所以使用对称加密的AES算法即可EmaZUvyM9aabQ2Jmo6THJ/r3/e2xAjpRmoA5TzvuR4I=

上面的字符串是AES生成的令牌。不是很爽吗,没有密钥是无法解密的?与JWT生成的令牌相比,AES生成的令牌携带的数据更安全。

作者:枯木_a25b

链接:https://www.jianshu.com/p/7c34b78f1675

0