Java实现单点登录

单点登录

【1】Token介绍

(1)什么是Token?

Token,也称为"令牌",是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。比如如下形式:39faf62271944fe48c4f1d69be71bc9a

(2)为什么使用Token

传统验证用户身份的方式,大多为基于服务器验证的方式,即cookie+session的方式,由于HTTP协议是无状态的,导致程序需要验证每一次请求,从而辨别客户端的身份。

用户登录成功将其信息存入session中,用户每次请求都会将携带session id的cookie一起发送器服务端,进行校验,随着Web、应用程序、以及移动端的崛起,这种验证方式弊端逐渐显现,尤其是在可扩展性方面。

引发的问题比如用户增多导致内存开销较大、CORS(跨域资源共享)以及CSRF(跨站请求伪造)等。

引入Token验证机制后,请求会发送token而不再是发送cookie能有效够防止CSRF,即使在客户端使用cookie存储token,但cookie也只有存储功能,而不再具备验证功能,因此安全性得到了极大的提高。

而且只要token设计的足够复杂,除非用户泄露,否则几乎没有被破解的可能,加上token是有时效的,在有限的时间加上有限的算力,更是无懈可击,这也类似于加密资产比如比特币钱包对应的私钥,安全性极高。

另外Token可以有效减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮。

(3)基于token的身份验证流程

1-客户端使用用户名跟密码请求登录

2-服务端收到请求,去验证用户名与密码

3-验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端

4-客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里

5-客户端每次向服务端请求资源的时候需要带着服务端签发的 Token

6-服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据


(4)优点

1-每一次请求都需要携带token ,需要把token 放到HTTP的Header 里

2-基于token 的用户验证是一种服务端无状态的认证方式,服务端不用存放token数据,用解析token的计算时间换取 session的存储空间,从而减轻服务器的压力,减少频繁的查询数据库

3-token 完全由应用管理,所以它可以避开同源策略

(5)Token的使用

在我们做用户权限认证的时候,每次请求都会将Token放在请求头中一起发送到服务器端,服务器端通过拦截器进行拦截校验,如果不存在Token、Token错误或者Token过期,则拒绝请求,有效则返回相应的返回结果。

Token生成示例

使用用户唯一ID + 系统时间 + 随机数 + 过期时间得到用户信息数据,对用户信息数据进行RSA非对称加密/AES对称加密得到一个加密字符串A,将加密字符串A再次进行签名等到一个签名数据。然后将签名数据和加密字符串进行拼接,最后使用base64进行编码,得到最终的token令牌。

(6)JWT

JSON Web Token(JWT)是一个开发标准(RFC 7519),它定义了一种紧凑独立的基于 JSON 对象在各方之间安全地传输信息的方式。这些信息可以被验证和信任,因为它是数字签名的。JWTs 可以使用一个密钥(HMAC算法),或使用 RSA 的公钥/私钥密钥对对信息进行签名。

相关推荐
念何架构之路5 小时前
Go进阶之panic
开发语言·后端·golang
7哥♡ۣۖᝰꫛꫀꪝۣℋ5 小时前
Spring-cloud\Eureka
java·spring·微服务·eureka
亓才孓5 小时前
[Properties]写配置文件前,必须初始化Properties(引用变量没执行有效对象,调用方法会报空指针错误)
开发语言·python
傻乐u兔5 小时前
C语言进阶————指针3
c语言·开发语言
老毛肚5 小时前
手写mybatis
java·数据库·mybatis
两点王爷5 小时前
Java基础面试题——【Java语言特性】
java·开发语言
宇宙帅猴5 小时前
GitHub 私有仓库认证完整指南:告别密码错误,使用 PAT 令牌
github
choke2335 小时前
[特殊字符] Python 文件与路径操作
java·前端·javascript
Swift社区5 小时前
Gunicorn 与 Uvicorn 部署 Python 后端详解
开发语言·python·gunicorn
choke2335 小时前
Python 基础语法精讲:数据类型、运算符与输入输出
java·linux·服务器