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 的公钥/私钥密钥对对信息进行签名。

相关推荐
骁的小小站几秒前
HDLBits刷题笔记和一些拓展知识(十一)
开发语言·经验分享·笔记·其他·fpga开发
Jtti2 分钟前
如何准确查看服务器网络的利用率?
开发语言·php
人生在勤,不索何获-白大侠7 分钟前
day17——Java集合进阶(Collections、Map)
java·开发语言
程序员小羊!19 分钟前
Java教程:JavaWeb ---MySQL高级
java·开发语言·mysql
m0_7231402326 分钟前
Python训练营-Day49
开发语言·python
白仑色27 分钟前
Spring Boot 多环境配置详解
java·spring boot·后端·微服务架构·配置管理
超级小忍29 分钟前
在 Spring Boot 中优化长轮询(Long Polling)连接频繁建立销毁问题
java·spring boot·后端
David爱编程33 分钟前
Java 中 Integer 为什么不是万能的 int 替代品?
java·后端
老马啸西风35 分钟前
个人网站一键引入免费开关评论功能 giscus
java
Z_W_H_1 小时前
【springboot】IDEA手动创建SpringBoot简单工程(无插件)
java·spring boot·intellij-idea