谈谈登录机制
彻底搞懂cookie、session、token
Cookie
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
- 需要判断当前请求 不是刷新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队列的请求重新去请求
谈谈第三方登录(扫码登录)
场景:
- 便捷登录(快速登录)
- 提高接口安全,降低登录接口的压力与风险
前端:
- 向后端请求二维码,后端返回图片
- 前端需要轮询消息,后端返回是否登录成功/失败
- 轮询判断是否有登录、拿到登录状态信息