业界内的Token和Jwt的区别

技术主题

在做C端的产品中,用户在登录并且在访问业务的时候,经常用到token,来保证都是用户的合法请求。

技术原理

技术原理-细讲一token和jwt(JSON Web Token)存在的区别

token需要查库验证token是否有效,而JWT不用查库或者少查库,直接在服务端进行校验,不用查库。因为用户的信息以及加密信息在第二部分payload和第三部分签证中已经生成,需要服务端进行校验就行,校验也是JWT自己实现的。TOKEN概念:令牌
Token的认证过程
1)用户输入用户名和密码,发送给服务器
2)服务器验证用户名和密码,正确的话就返回一个签名过的token,客户端拿上这个token
3)后续的每次请求中,浏览器会把token作为http header发送给服务器,服务器验证签名是否有效

JWT概念:
JWT是json web token缩写,将用户信息加密到token里,服务器不保存任何用户信息,服务器通过使用保存的密钥验证token的正确性,只要正确就可通过验证
组成:
WT包含三个部分:Header头部,Payload负载和Signature签名。由三部分生成token,三部分之间用.号做分割
Header
{
“alg”: “HS256”, // 标记签名的算法
“typ”: “JWT”
}
Payload
{
“sub”: “1234567890”, // payload 这里是存我们的方存放的用户信息
“name”: “John Doe”,
“admin”: false,
exp: number // 过期时间

}

技术原理-java实现JWT

在Java中实现JWT,可以使用现有的Java JWT库或者手动实现。这里以使用开源库JJwt(https://github.com/jwtk/jjwt)为例,简单介绍一下JWT的实现流程:

  1. 引入JJwt库,例如在Maven项目中使用如下依赖:
<dependency>
    <groupId>io.jsonwebtokengroupId>
    <artifactId>jjwtartifactId>
    <version>0.9.1version>
dependency>
  1. 创建一个JWT Builder,构建需要传输的用户信息(Payload),并设置秘钥和签名算法等信息:
String secret = "mySecret"; // 秘钥
long ttlMillis = 3600000; // 过期时间,这里设置为1小时
Date now = new Date();
    // 构建JWT
    String jwt = Jwts.builder()
        .setId("id")
        .setSubject(username)
        .setIssuedAt(now)
        .setExpiration(new Date(now.getTime() + ttlMillis))
        .signWith(SignatureAlgorithm.HS512, secret)
        .compact();
  1. 在服务端对JWT进行解析和验证,并从中提取出Payload中的信息:
Claims claims = Jwts.parser()
    .setSigningKey(secret)
    .parseClaimsJws(jwt)
    .getBody();

String username = claims.getSubject();
Date expirationDate = claims.getExpiration();
Date issuedAt = claims.getIssuedAt();

在这里,我们使用Jwts.parser()构建一个JWT解析器,并设置秘钥,然后使用parseClaimsJws(jwt)方法解析JWT。解析后,我们从Claims实例中获取各种Payload中的信息,包括用户ID、过期时间等。

你可能感兴趣的:(token相关,java,开发语言)