jwt无状态登陆常见面试问题总结

1.Jwt和Spring Security的对比:

JWT的:

  • 优点:

    • 无需再服务端存储用户数据,减轻服务端压力
    • 轻量级,json风格,比较简单
    • 跨语言
    • 有利于水平扩展
  • 缺点:

    • token一旦签发,无法修改
      • 无法更新token有效期,用户登录状态刷新难以实现
      • 无法销毁一个token,服务端不能对用户状态进行绝对控制
    • 不包含权限控制

SpringSecurity:

  • 优点:
    • 用户信息保存再服务端,服务端可以对用户状态绝对控制
    • 基于Spring,无缝整合,修改登录逻辑,其实就是添加过滤器
    • 整合权限管理
  • 缺点:
    • 限定了语言
    • 实现复杂,基于一连串的过滤器链
    • 需要再服务端保存用户信息,增加服务端压力
    • 依赖于tomcat的HttpSession、如果是分布式项目,session不共享,登录失效,需要借助于SpringSession,实现共享session效果(利用redis代替tomcat的session)

2.登录控制问题

  • 你们使用JWT做登录凭证,如何解决token注销问题

    答:jwt的缺陷是token生成后无法修改,因此无法让token失效。只能采用其它方案来弥补,基本思路如下:

    1)用户登录后,生成JWT,其中包含用户身份

    2)以用户id为key,把JWT的id存入redis,只有redis中有id的JWT,才是有效的JWT

    3)并且给Redis设置有效期,有效期到自动删除

    4)退出登录时,把ID从Redis删除即可

  • 怎么解决登录超时后的登录续签问题?

    答:判断登录是否超时的标准是redis,而不是JWT,因此每次用户访问网关,我们都会刷新redis的数据有效期,保证登录状态不断。

  • 如何解决异地登录或跨设备登录问题?

    答:

    方案一:不允许多端登录

    如果账户在第二个设备登录,自然会将redis中的JWT覆盖,那么之前的登录凭证就成了无效凭证。

    方案二:允许多端登录

    存入redis时,redis的类型可以选择set,这样一个用户可以具备多个JWT的id,实现多端登录。

3.cookie安全问题

  • JWT中的cookie泄露,是否会泄露用户隐私?

    • 不会,因为JWT中只保存用户id这样的非敏感字段,不存放例如手机、用户名、密码之类的信息
  • 如何解决token被篡改问题?

    • 答:token中的数据可以篡改,但是签名无法篡改,否则服务端认证根本不会通过,因此篡改的token是无法通过服务端校验的
  • 如何防止token的伪造

    • 与上个问题类似,token中带有签名认证,而签名需要秘钥加密生成。只要秘钥不泄露,就不可能有人伪造token,因为其它秘钥生成的token是不会被认可的。
    • 另外,我们服务内部有秘钥管理机制,其它外部请求是无法获取我们的秘钥的。
  • 如何解决cookie被盗用问题?

    答:cookie被盗用的可能性主要包括下面几种:

    • XSS攻击:这个可以再前端页面渲染时对 数据做安全处理即可,而且我们的cookie使用了Httponly为true,可以防止JS脚本的攻击。
    • CSRF攻击:
      • 利用Referer头,防盗链
      • 请求头中加随机码
    • 数据抓包,获取用户cookie:我们采用了HTTPS协议通信,无法获取请求的任何数据
    • 请求重放攻击:对于普通用户的请求没有对请求重放做防御,而是对部分业务做好了幂等处理。运行管理系统中会对token添加随机码,认证token一次有效,来预防请求重放攻击。
    • 用户电脑中毒:这个无法防范。
  • 用户的cookie被禁用怎么办?

    • cookie一般情况下,是不会被禁用,因为普通人根本不知道是什么是cookie,一般不用管,为了友好,我们可以给用户一个提示:你的cookie已经被禁用了,请启用cookie。
    • 把jwt作为响应头返回,浏览器中JS把token写到本地存储(sessionStorage),要求前端每次发ajax,都必须自己携带token。而且有被xss攻击的风险

4.权限问题

  • 如何完成权限校验的?

    • 首先我们有权限管理的服务,管理用户的各种权限,及可访问路径等
    • 在网关中利用过滤器,拦截一切请求,在过滤器中,解析和验证jwt,获取用户身份,查询用户权限,判断用户身份可以访问当前路径

5.跨域登录问题

单点登录,顾名思义:在分布式服务中,用户只需要在一处登录,即可在各个受信任的服务器之间,共享登录状态,称为单点登录。

任何登录都离不开cookie,如果cookie无法使用或共享,就会导致登录凭证无法共享,导致登录状态无法共享。例如因为跨域名的多个服务,其cookie不可共享,导致登录失效。

因此实现单点登录有多种方式,其区别就在于是否能解决跨域登录

  • 同域名单点登录
    • 分布式服务共享二级域名,二级以上域名不同,此时cookie可以共享。解决思路:
      • JWT无状态登录
      • 共享Session
  • 跨域单点登录
    • 服务二级域名就不同,导致cookie无法共享,解决办法:

CAS原理图:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值