服务器: 这个 token 是我的吗? 我不信

人生有两个悲剧:第一是想得到的得不到,第二是想得到的得到了

其实token的出现是为了解决sessionId存放的问题

sessionId 在分布式系统, 如果你存放在一台机器, 让一台机器服务负责session相关的存放, 存放单点故障的风险, 这是有状态的, 那么如果用token进行改进的话, 就可以做到无状态了, 但是呢?

给了一个token, 可是服务器怎么认这个token是我颁发给服务器的呢?

在安全认证领域, 登录之后通常会给一个token, 方便浏览器记住用户, 数字签名 token, 服务器是怎么认出是他授予的签名, 我介绍一下服务器是如何认出token和jwt是他授予的签名的

在安全认证领域,Token(令牌)是一种常用的认证机制。通常,在用户登录成功后,服务器会生成一个Token并返回给浏览器。浏览器将此Token存储在本地,并在后续请求中将其附加到请求头中。服务器收到请求后,会验证Token的有效性并据此确定用户身份。JSON Web Token(JWT)是一种常用的Token格式。

服务器如何认出Token和JWT是其授予的签名:

  1. 生成Token时,服务器会使用密钥(例如:对称密钥或非对称密钥对)对Token进行加密或签名。在JWT中,这一过程通常使用HS256、RS256等加密算法完成。

  2. 服务器将生成的Token发送给浏览器。浏览器在后续请求中将Token附加到请求头中。通常,这是通过"Authorization"请求头实现的,格式为 “Bearer ”。

  3. 当服务器收到带有Token的请求时,它会对Token进行验证。这一过程包括解密(对称密钥)或验证签名(非对称密钥对),并检查Token中的有效期、颁发者等信息。

  4. 如果验证成功,服务器会根据Token中的载荷(Payload)识别出用户身份,并处理相应的请求。否则,服务器将拒绝该请求,可能返回401未授权或403禁止访问等状态码。

在Java中,我们可以使用诸如"java-jwt"、"jjwt"等库来处理JWT。以下是一个简单的示例,展示了如何使用"java-jwt"库生成和验证JWT:

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.DecodedJWT;

public class JwtDemo {
    
    
    private static final String SECRET_KEY = "my-secret-key";

    public static void main(String[] args) {
    
    
        // 生成JWT
        String token = generateJwt("user-id-123");

        // 验证JWT
        try {
    
    
            DecodedJWT decodedJwt = verifyJwt(token);
            System.out.println("User ID: " + decodedJwt.getClaim("userId").asString());
        } catch (JWTVerificationException e) {
    
    
            System.out.println("Invalid JWT!");
        }
    }

    private static String generateJwt(String userId) {
    
    
        Algorithm algorithm = Algorithm.HMAC256(SECRET_KEY);
        return JWT.create()
            .withIssuer("auth0")
            .withClaim("userId", userId)
            .sign(algorithm);
    }

    private static DecodedJWT verifyJwt(String token) throws JWTVerificationException {
    
    
        Algorithm algorithm = Algorithm.HMAC256(SECRET_KEY);
        return JWT.require(algorithm)
            .withIssuer("auth0")
            .build()
            .verify(token);
    }
}

在这个例子中,我们使用HMAC256算法和一个对称密钥生成和验证JWT。当然,实际应用中可以根据需求选择其他算法和密钥类型。总之,服务器通过对Token进行解密或验证签名来识别出Token

猜你喜欢

转载自blog.csdn.net/HongZeng_CSDN/article/details/129992192