传统的web应用使用session来维护用户与服务器之间的状态,用户提交用户名密码到服务器,服务器生成会话id,并将验证通过的用户信息存到session中(内存or数据库),会话id会写出到cookie。

用户登录之后的操作,都会附带包含sessionId的cookie,服务器根据用户端传来的sessionId获取用户信息,会话的有效期,包括用户登出等操作都依赖对session的操作,如下图:----
基于session的认证用户信息存在了服务端内存中,在分布式环境中session是需要同步的。出现了基于token的认证方式,其实本质和session没什么区别。用户提交登录信息后,服务端验证通过后颁发令牌。下图是以redis为例,将token和用户信息保存到redis,客户端再次访问服务端时,会携带token,服务端通过token获取用户信息。会话的有效期,用户的登出只需要操作redis中的token即可,如下图:

当然了,token本身也是可以包含一些用户非敏感信息减少查库,包含数字签名以防数据篡改,下面看下jwt(json web token)。----
从名称可以看出jwt还是一个token,它有自己的规范,由标头.有效载荷.签名组成。头用来描述散列算法,然后是用户数据,最后是一个数字签名。

----
先来看下jwt的java实现。

com.auth0java-jwt3.10.2

使用jwt通常只需要两个步骤,1通过jwt来生成token,2验证token。

JwtUtil String = String = String MapStringStringclaimsAlgorithm algorithm = Algorithm.JWTCreator.Builder builder = JWT..withIssuer.withExpiresAtDateUtils.Dateclaims.forEachbuilder::withClaimbuilder.signalgorithmException eRuntimeExceptioneMapStringStringString tokenMapStringStringret = Maps.Algorithm algorithm = Algorithm.JWTVerifier verifier = JWT.algorithm.withIssuer.buildDecodedJWT jwt =  verifier.verifytokenMapStringClaimmap = jwt.getClaimsRuntimeExceptioneret

以上就是一个jwt的简单示例,客户端携带token请求时,服务端可以校验jwt的签名及有效时间,校验通过则放行,否则拒绝请求。
----优点:可以看到使用jwt自身就可以完成认证,可以减少资源连接,也可以避免跨域认证请求,自带信息也可以用于数据传递。
缺点:可以看到一旦生成token,就无法回收,token的管理(刷新有效期&登出)需要其它补偿机制(如使用redis管理token);默认有效载荷只是经过base64编码,只是为了方便传输,并未加密(也可以自行加密),敏感数据不应该放到jwt中。


©著作权归作者所有:来自51CTO博客作者mb5fdb0a4002420的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 游戏思维开发社区问答系统的感受
  2. 全息电力行业解决方案
  3. 【Nest教程】实现一个简单的用户增删改查功能
  4. 【Nest教程】Nest项目用户密码加密
  5. Elastic开源协议改了,用户怎么办?
  6. 通配符、用户组管理与文件权限
  7. 系统发布用户通知以及相关增强
  8. 一次内存性能提升的项目实践
  9. CentOS 7 单用户模式修改密码

随机推荐

  1. android selector 背景选择器的使用, butt
  2. Android Studio系列(四)Version Control II
  3. 8大你不得不知的Android调试工具
  4. android 去掉顶部状态栏
  5. Android相对布局属性全集
  6. android:screenOrientation属性
  7. 文字跑马灯
  8. Android 9.0 Launcher源码分析(三)——Laun
  9. android button 正常状态,按下状态
  10. BitmapFactory.Options学习笔记