做一个简单网站多少钱,青海建设厅网站通知,内蒙住房和城乡建设部网站首页,做的网站有广告常见场景
账号/密码登录、手机号验证码登录、微信扫码登录
解决方案
基于Session认证方案
什么是session认证方案
服务端生成httpsession认证(内存-sessionId)sessionId写到浏览器cookie浏览器请求的header中自动带sessionId到服务端服务端校验sessionId是否合法
优点
.…常见场景
账号/密码登录、手机号验证码登录、微信扫码登录
解决方案
基于Session认证方案
什么是session认证方案
服务端生成httpsession认证(内存-sessionId)sessionId写到浏览器cookie浏览器请求的header中自动带sessionId到服务端服务端校验sessionId是否合法
优点
. 方案成熟、实现简单
缺点
服务端压力大用户的信息保存在服务端用户量越大内存开销越大扩展性差用户信息存在某一个服务器上应用节点就会有状态分布式环境下无法做到水平无限拓展(如何解决这个问题可以将session共享将session存在redis/mysql中或者session复制粘性session)普通的session认证不支持跨域容易被类似于csrf攻击因为基于cookie类进行用户识别cookie很容易被截获
基于JWT认证方案
什么是JWT
JWT(JSON WEB TOKEN) 是目前最流行的跨域认证解决方案是一种基于Token认证授权机制JWT自身包含了身份验证所需要的所有信息因此我们服务端不需要存储Session信息这显然增加了系统的可用性和伸缩性大大减轻了服务端压力
JWT格式及组成
JWT也是令牌的token是一个String字符串由三部分构成其中用点隔开连接在一起就是一个JWT Token
JWT的组成
标头Header有效载荷Payload签名Signature
Header描述JWT的元数据定义生成签名的算法以及Token类型 Payload有效负载用来存放实际需要传递的数据 Signature前面两部分都使用Base64进行编码前端可以解开知道里面的数据Signature需要使用编码后的header和payload加上我们提供的一个密钥使用header中指定的签名算法进行签名签名的作用是保证JWT没有被篡改过
优点
跨平台实现token是加密的形式保存在客户端与语言无关原则上任何web形式都支持不需要存储session服务端节点可水平无限拓展不依赖cookie使得其可以防止CSRF攻击性能好只需要在header中携带token就可以实现验证
缺点
JWT生成的token在有效期内一直可用因为存在客户端无法在服务端删除用户登出只能在客户端中删除token无法在服务端控制jwt本身无法实现用户禁止登录或拉黑用户需要业务自己实现
拓展
Jwt Token如何续期
方法一
管理后端
服务端(认证鉴权服务)
登录接口返回accessToken和refreshTokenaccessToken与refreshToken时间要错开一般来说管理后台accessToken一般设置为30分钟refreshToken设置为1h小程序或APPaccessToken设置为7天refreshToken设置为30天
token续期接口通过前台传过来的refreshToken来获取新的token(两个)如果refreshToken过期直接提示用户重新登录
前端
前端将accessToken与refreshToken存在浏览器缓存请求业务接口header中的Authorization参数携带token如果接口返回token过期前端通过refreshToken请求token续期接口返回新的accessToken前端将token更新缓存下次使用新的token请求业务
方法二
token过期时间由redis来控制 在登陆时把用户信息或者token放进redis并设置过期时间 如果30分钟内用户有操作前端带着token来访问过滤器解析token得到用户信息去redis中验证用户信息验证成功则在redis中增加过期时间验证失败返回token错误。实现了token时间的自动更新。 如果30分钟内用户无操作redis中的用户信息已过期此时再进行操作token解析出的用户信息在redis中验证失败则重新登录。实现了一定时间内无操作掉线
JWT如何中止
JWT正常情况下只有在过期过后才能失效所以我们需要第三方的帮助
方案一
每个JWT都有一个唯一的jti字段我们可以在退出登录/修改密码/重置密码等场景下将jti字段给保存数据库MySQL/Redis中并设置过期的到期时间为Token的到期时间如果是放在MySQL中则需要设置一个新的字段如果是Redis中则可以直接设置过期时间每次判断token的时候都需要查询一下
方案二
因为可以在每个token中加入盐值认证的时候又会去验证这个盐的值所以我们可以在每次退出登录/修改密码/重置密码时候修改这个盐值所以之前的token就不会验证成功也就失效了