MST
星途 面试题库

面试题:安全认证之JWT在复杂前后端架构中的应用

假设你正在开发一个大型的前后端分离电商系统,存在多个微服务。请阐述如何在这样的系统中有效地使用JWT进行安全认证,包括如何处理JWT的跨微服务传递、刷新机制以及防止JWT被破解的策略。
37.8万 热度难度
后端开发安全认证

知识考点

AI 面试

面试题答案

一键面试

JWT在大型前后端分离电商系统中的使用

  1. JWT的基本使用
    • 用户登录:用户在前端输入登录信息,发送到认证微服务。认证微服务验证用户信息,若正确,生成包含用户身份信息(如用户ID、用户名、权限等)的JWT。例如,使用JSON Web Token库(如jsonwebtoken for Node.js)生成JWT:
    const jwt = require('jsonwebtoken');
    const user = { userId: 1, username: 'testuser', role: 'customer' };
    const token = jwt.sign(user, 'your-secret-key', { expiresIn: '1h' });
    
    • 前端存储:前端接收到JWT后,通常将其存储在localStoragesessionStoragecookie中(注意cookie的安全性设置)。后续的每个请求,前端会将JWT放在请求头(如Authorization: Bearer <token>)中发送到后端微服务。
  2. 跨微服务传递
    • 网关转发:在前后端分离架构中,通常有一个API网关。网关接收前端请求,验证JWT的有效性(通过公共密钥验证签名等)。若JWT有效,网关将请求转发到相应的微服务,并将JWT传递下去。例如,在使用Zuul作为网关的Spring Cloud项目中,可以通过配置拦截器验证JWT,然后将请求及JWT头信息转发到微服务。
    • 微服务信任:各个微服务可以信任网关传递过来的JWT,不再重复验证。但为了安全性,也可以再次验证JWT的签名等信息。不同微服务之间传递数据时,如果需要传递JWT,确保在安全的通信通道(如HTTPS)中进行传递。
  3. 刷新机制
    • 使用Refresh Token:当用户登录成功,除了返回JWT,还返回一个刷新令牌(Refresh Token)。JWT有较短的过期时间(如1小时),而Refresh Token有较长的过期时间(如7天)。
    • 刷新流程:当JWT过期时,前端使用Refresh Token向认证微服务请求新的JWT。认证微服务验证Refresh Token的有效性,如果有效,生成新的JWT返回给前端。例如:
    // 验证Refresh Token并生成新JWT
    const refreshToken = req.body.refreshToken;
    jwt.verify(refreshToken,'refresh - secret - key', (err, decoded) => {
        if (!err) {
            const newUser = { userId: decoded.userId, username: decoded.username, role: decoded.role };
            const newToken = jwt.sign(newUser, 'your - secret - key', { expiresIn: '1h' });
            res.json({ newToken });
        } else {
            res.status(401).send('Invalid refresh token');
        }
    });
    
  4. 防止JWT被破解的策略
    • 强密钥管理:使用足够长度和复杂度的密钥来签名JWT。例如,使用至少256位的随机字符串作为密钥,并且定期更换密钥。密钥应妥善保管,避免泄露,例如存储在安全的密钥管理系统(KMS)中。
    • HTTPS通信:确保所有涉及JWT传递的通信都使用HTTPS协议。HTTPS加密了传输中的数据,防止中间人窃取JWT。
    • 限制JWT权限:JWT中只包含必要的用户信息和权限,避免放入敏感或过多的信息。这样即使JWT被窃取,攻击者能获取的有用信息也有限。
    • JWT过期设置:设置合理的JWT过期时间,减少JWT在有效时间内被破解的风险。结合Refresh Token机制,既保证用户体验,又提高安全性。
    • 黑名单机制:可以实现一个JWT黑名单,当用户登出或者怀疑JWT被窃取时,将JWT加入黑名单。每次验证JWT时,除了验证签名和过期时间,还检查JWT是否在黑名单中。例如,可以使用Redis存储黑名单JWT,验证时查询Redis。