基于JWT的token验证机制

Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。
JWT的应用返回越来越广泛,它很好的取代了原始的保存在session中的登录认证的方式,因为这种方式在用户量上升的时候,消耗的内存较多,而且对于分布式的站点,虽然可以使用共享session来实现单点登录但是对于系统消耗较大。

1. 单应用session
传统的session+cookie模式的登录验证,登录信息保存在session中,由服务器给浏览器返回一个sessionId经过处理的token中,单应用程序还可以,一旦使用分布式应用,那么用户登录的session只在处理用户登录的应用中存储,下一次的请求可能就会被负载均衡机制调配到另一个应用中,这样session就丢失了。而且单应用中会存在当session量增大时,响应的对内存的消耗也会增大。
2. session共享
集群应用当然可以设置多应用session共享,但是这种在系统性能有一定的消耗。比如搭建了tomcat集群,tomcat提供了session共享的方式,使用redis将sessioniId的token进行持久化存储,Spring session就是利用这种原理实现的,但redis不是100%稳定的。
3. JWT
使用session方式的登录认证被JWT代替是必然,JWT也是后端项目开发时选择应及广的验证方式,而且他的token不需要放在cookie中,由前端开发随便处理,只要后续请求时携带上即可。
JWT说的本质一点就是在用户登录后对用户信息使用固定约束的加密手段从而产生一个有时效的json字符串令牌,由后端产生,返回给前端,前端在每次发出请求时都必须带着这个令牌。之后的请求后端都会先拦截请求并进行解析,所有未携带或超时的token,JWT在解析时都会解析失败,后端便可以根据结果进行不同情况的逻辑处理。JWT这种方式不占用session资源,不要rredis等持久化存储,没有其他资源的浪费,也正是因为如此,JWT在分布式系统中可以完美的实现单点登录的验证。
4. JWT + redis获取登录用户的基本信息
JWT在实际开发应用中用户信息模块基本都是存储的一个用户UUID,在用户登录时,用户的第一次请求需要使用JWT生成一个后期的通行令牌,使用UUID生成一个用户标识,放在JWT中进行生成,再次之前可以以UUID为主键,解析出的用户登录对象为value存储到redis中,时间设置为和JWT有效时间一致即可,之后,用户带着登录返回的令牌登录后,在通过JWT解析出里面的用户UUID,便可以直接从redis中取出用户的一些信息,特别是在业务逻辑处理时需要当前登录用户的一些信息时,便可以直接使用,不需要查询了(用户UUID获取redis中登录用户信息的类可以封装一下,全局使用很方便)。

猜你喜欢

转载自blog.csdn.net/Wangdiankun/article/details/115253556