面试题答案
一键面试确保一次性Token在各微服务间安全传输
- 使用安全通信协议:
- 在微服务间通信采用HTTPS协议。HTTPS通过SSL/TLS加密通信内容,防止Token在传输过程中被窃听、篡改。例如,在Spring Boot应用中配置HTTPS,可以通过在
application.properties
文件中配置SSL证书路径等相关参数来启用HTTPS。 - 示例:
server.ssl.key-store=classpath:keystore.jks server.ssl.key-store-password=password server.ssl.key-alias=alias
- 在微服务间通信采用HTTPS协议。HTTPS通过SSL/TLS加密通信内容,防止Token在传输过程中被窃听、篡改。例如,在Spring Boot应用中配置HTTPS,可以通过在
- Token加密:
- 在生成Token时,对Token内容进行加密。可以使用对称加密算法(如AES)或非对称加密算法(如RSA)。例如,使用Spring Security的加密工具对Token进行加密。
- 示例(使用AES加密):
SecretKeySpec secretKey = new SecretKeySpec("1234567890123456".getBytes(), "AES"); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, secretKey); byte[] encryptedToken = cipher.doFinal(token.getBytes());
- 安全的存储与传输:
- 在传输过程中,避免将Token直接暴露在URL中,应将其放在HTTP请求头(如
Authorization
头)中传输。这样可以防止Token在日志等地方泄露。 - 对于Token的存储,在发送方和接收方可以使用分布式缓存(如Redis)来临时存储相关信息,提高性能并确保安全。例如,发送方在生成Token后,将Token及其相关信息(如有效期等)存储到Redis中,接收方验证时从Redis中获取信息进行验证。
- 在传输过程中,避免将Token直接暴露在URL中,应将其放在HTTP请求头(如
接收方正确且高效地验证Token的有效性
- 基于签名验证:
- 在生成Token时,使用签名算法(如HMAC - SHA256)对Token内容和一个密钥进行签名。接收方使用相同的密钥和签名算法对接收到的Token进行签名计算,并与Token中的签名进行对比。
- 示例(使用Java计算HMAC - SHA256签名):
SecretKeySpec signingKey = new SecretKeySpec("secretKey".getBytes(), "HmacSHA256"); Mac mac = Mac.getInstance("HmacSHA256"); mac.init(signingKey); byte[] rawHmac = mac.doFinal(token.getBytes()); String hexString = DatatypeConverter.printHexBinary(rawHmac);
- 有效期验证:
- Token应包含有效期信息。接收方在验证Token时,首先检查当前时间是否在Token的有效期内。可以在生成Token时设置一个
exp
字段表示过期时间,接收方验证时获取该字段进行时间对比。 - 示例:
long currentTime = System.currentTimeMillis() / 1000; long expirationTime = tokenClaims.get("exp", Long.class); if (currentTime > expirationTime) { // Token已过期 }
- Token应包含有效期信息。接收方在验证Token时,首先检查当前时间是否在Token的有效期内。可以在生成Token时设置一个
- 分布式缓存辅助验证:
- 如前面提到,借助Redis等分布式缓存。发送方在生成Token后,将Token及其相关验证信息(如签名、有效期等)存储到Redis中。接收方验证Token时,先从Redis中获取这些信息进行快速验证,减少复杂的计算和数据库查询,提高验证效率。同时,设置合理的缓存过期时间,确保数据的一致性和安全性。
- 熔断与降级:
- 考虑到验证Token的服务可能出现故障,在接收方可以采用熔断(如Hystrix)和降级策略。当验证服务不可用时,根据业务需求进行相应的降级处理,例如返回特定的错误信息,而不是让整个微服务调用链崩溃。
- 示例(使用Hystrix实现熔断):
@HystrixCommand(fallbackMethod = "tokenVerificationFallback") public boolean verifyToken(String token) { // 实际的Token验证逻辑 } public boolean tokenVerificationFallback(String token) { // 降级处理逻辑 return false; }