跳到主要内容

谈谈登录机制

彻底搞懂cookie、session、token

Cookie可以记录客户端的用户信息,在用户下一次访问该页面时,可以在 cookie中读取用户访问记录

  • 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
  • 个性化设置(如用户自定义设置、主题等)
  • 浏览器行为跟踪(如跟踪分析用户行为等)

cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息), 来预防XSS攻击

Session​

  • Session 代表着服务器和客户端一次会话的过程

Token​

  • token是一种用于身份验证和授权的令牌。

  • 通常是通过用户使用用户名和密码进行登录后返回的。一旦用户被验证,服务器会生成一个token并将其发送回前端应用程序。

    • token通常是一个长字符串,包含有关用户和权限的相关信息
    • 可通过jwt解码token,可看到用户的相关信息
  • token可以预防CSRF攻击 (跨站请求伪造)

    • CSRF 攻击是一种利用用户已经登录的身份来发送恶意请求的

    • 通过token来验证用户的身份

    • 如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求

谈谈Token存储在Cookie还是LocalStorage?​

  • 由于LocalStorage 和 SessionStorage 都可以被 javascript 访问,所以容易受到XSS攻击
  • 将Token存储于Cookie!!!!

1、设置HttpOnly标志,Cookie将无法通过JavaScript访问,这可以防止XSS(跨站脚本攻击)攻击,因为攻击者无法通过脚本获取Cookie中的敏感信息。

2、设置Secure标志,Cookie只在通过HTTPS协议进行加密的安全连接时传输,保护了数据在传输过程中的安全性。 【https的secure设置为true】

谈谈无感刷新token​

假设一个页面用户比如编辑页/写文章需要停留很久 (停留时长 > token有效时长)

  • 当登录成功之后,会返回2个token (access_token、refresh_token)
  • 当access_token过期时,通过refresh_token来刷新
  • 刷新接口,会返回access_token和refesh_token 两个接口

access_token一般过期时间设置的比较短 (比如30分钟、一天)

refresh_token的设置的过期时间比较长 (比如7天)

  • 如果设置了7天,只需要在7天内访问一次,就能刷新token,再续7天
  • 如果超过了7天没访问,那么refresh_token也会过期,这时候就需要重新登录了

不希望用户重新登录,需要如何解决?

  • 1、可以在响应进行拦截,判断token是否过期,调用刷新token的接口
    • 需要判断当前请求 不是刷新token的请求,才去调用刷新token 【否在会出现死循环】
      • 因为当刷新token (refresh_token)也过期了,那么会一直进入401判断,会不断请求刷新token,造成死循环
      • 需要在判断401请求刷新token的同时,还需要判断 当前接口是否为刷新token的接口
        • 1、可以通过接口地址判断
        • 2、可以在刷新token加一个额外的配置,来判断是否为刷新token
  • 2、后端可以返回过期的时间,前端判断token是否过期, 然后再去调用刷新token的接口
  • 3、定时刷新token接口

使用刷新Token(Refresh Token)​

在响应进行拦截,判断 Token 是否过期,调用刷新 Token 的接口

  • 可以在每次请求中拦截响应,检查 Token 是否过期,然后调用刷新 Token 的接口。这可以确保用户在页面停留期间不会意外地登出

后端判断token登录失效之后,不返回401,而是返回新token,会有什么问题?​

  • 前端不知道 Token 失效
  • 无法识别 Token 被盗用
    • 如果攻击者获取了用户的 Token,后端返回新 Token 而不返回 401 错误,攻击者可能会持续使用被盗取的 Token,从而获得不受限的访问权限

什么情况会去到登录页?​

  • 如果设置的refresh_token过期了,这时候就需要重新登录了

刷新token之后,如何让401的接口重新请求​

  • 需要把401的接口请求放到数组队列中,刷新token之后,就把这个401队列的请求重新去请求

谈谈第三方登录(扫码登录)​

场景:

  • 便捷登录(快速登录)
  • 提高接口安全,降低登录接口的压力与风险

前端:

  • 向后端请求二维码,后端返回图片
  • 前端需要轮询消息,后端返回是否登录成功/失败
  • 轮询判断是否有登录、拿到登录状态信息