Java中JWT技术解析与实践:安全高效的身份认证

jwt常见问题回复&简介

  1. 什么是JWT(JSON Web Token)?
    JWT是一种用于身份验证和授权的开放标准(RFC 7519),它是基于JSON格式的轻量级安全令牌。JWT由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。通常,JWT被用于在不同的系统之间传递安全性的声明信息,以便用户在跨域应用中进行身份验证。

  2. JWT有什么好处,能干啥?
    JWT的主要优点包括:

  • 轻量级:JWT是基于JSON格式的,相比于传统的XML格式,它更加轻巧且易于解析。
  • 自包含:JWT中包含了用户的一些声明信息,因此无需查询数据库来验证用户身份,有效降低了服务器的负担。
  • 无状态性:JWT本身是无状态的,所有的信息都被包含在令牌中,服务器端无需保存任何状态信息,使得系统易于扩展和维护。
  • 安全性:JWT中使用签名进行验证,防止数据被篡改,确保了数据的完整性和安全性。

JWT能够实现的功能包括:

  • 用户认证:JWT可以用于用户身份验证,客户端通过携带有效的JWT令牌来请求受限资源。
  • 单点登录(SSO):用户在一个应用登录后,可以获取JWT令牌,然后在其他相互信任的应用中使用该令牌来免登录。
  • 授权信息传递:JWT中的载荷可以包含用户的角色、权限等信息,服务器可以根据这些信息做出授权决策(私密信息不要使用JWT 可以被人解析)。
  1. JWT的组成:
    JWT由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。
  • 头部(Header):通常由两部分组成,令牌类型(typ)和使用的签名算法(alg)。示例:{"alg": "HS256", "typ": "JWT"}
  • 载荷(Payload):包含用户的声明信息,例如过期时间用户ID、角色、权限等。可以自定义其他声明信息。示例:{"sub": "1234567890", "name": "John Doe", "admin": true}
  • 签名(Signature):通过对头部和载荷进行签名,保证数据的完整性和安全性。签名的生成通常使用密钥进行加密,只有持有密钥的服务器才能验证签名的有效性。
  1. 如何使用JWT?
    使用JWT通常包括以下步骤:
  • 用户登录:用户提供用户名和密码进行登录验证。
  • 服务器验证:服务器验证用户提供的信息是否正确,并生成JWT令牌。
  • 令牌传递:服务器将JWT令牌发送回客户端。
  • 客户端使用:客户端在后续请求中携带JWT令牌,发送给服务器进行身份验证和授权。
  1. 系统中的JWT是如何使用的,在什么时候使用的?
    在一个系统中,JWT通常用于实现用户身份验证和授权。当用户登录成功后,服务器会生成一个JWT令牌并发送给客户端,客户端保存该令牌,并在后续的请求中将令牌添加到请求头或请求参数中。服务器在收到请求时,会解析JWT令牌并验证其合法性和有效性,从而判断用户是否已经登录以及是否有权限访问请求的资源。

    JWT的使用可以简化系统的身份验证和授权流程,提高系统的安全性和性能。同时,由于JWT本身是无状态的,不需要在服务器端保存会话信息,使得系统更易于扩展和维护。引入jwt,并使用生成token

使用步骤

当使用JWT进行用户身份验证和授权时,通常包含以下步骤:

  1. 用户登录认证:

    • 用户提供用户名和密码进行登录。
    • 服务器接收用户提交的用户名和密码,通过UserService类中的authenticateUser方法验证用户名和密码是否正确。
    • 如果用户名和密码验证通过,认为用户登录成功,可以继续下一步生成JWT令牌。
  2. 生成JWT令牌:

    • 在登录成功后,服务器使用JwtUtils工具类中的generateJwtToken方法生成JWT令牌。
    • generateJwtToken方法接收三个参数:
      • subject:即载荷(Payload)中的"sub"字段,通常用于标识用户的唯一标识,例如用户ID、用户名等。
      • expirationMillis:令牌的有效期,以毫秒为单位。令牌过期后将无效,需要重新登录获取新的令牌。
      • SECRET_KEY:用于签名的密钥,确保密钥保密,不要泄露给他人。
    • generateJwtToken方法会使用Jwts类的builder方法构建JWT令牌,并设置令牌的头部(Header)、载荷(Payload)、过期时间(Expiration)等信息。
    • 最后,使用指定的签名算法(此处使用HS256)对令牌进行签名,生成签名(Signature)部分,得到最终的JWT令牌。
  3. 返回JWT令牌:

    • 服务器将生成的JWT令牌返回给客户端,通常通过将令牌添加到响应的Header或Body中。
  4. 客户端携带JWT令牌:

    • 在后续的请求中,客户端需要在请求头或请求参数中携带JWT令牌,通常使用"Authorization"字段来传递令牌。
    • 例如,可以将JWT令牌添加到请求头的"Authorization"字段中,格式为"Bearer <JWT_Token>“,其中”<JWT_Token>"为生成的JWT令牌。
  5. 解析和验证JWT令牌:

    • 服务器接收到带有JWT令牌的请求后,需要对令牌进行解析和验证,以验证用户身份和授权信息。
    • 使用JwtUtils工具类中的parseJwtToken方法对JWT令牌进行解析和验证。
    • parseJwtToken方法接收一个JWT令牌作为参数,并使用之前设置的密钥SECRET_KEY对令牌进行解析。
    • 如果解析和验证成功,parseJwtToken方法将返回载荷(Payload)中的"sub"字段的值,即之前设置的用户唯一标识。
    • 如果解析和验证失败,可能是令牌过期、签名验证不通过等,服务器将拒绝请求,要求客户端重新登录获取新的令牌。
  6. 用户访问控制:

    • 在服务器端验证JWT令牌成功后,可以根据令牌中携带的用户信息(例如用户角色、权限等)进行访问控制和授权决策。
    • 服务器可以根据令牌中的信息判断用户是否有权限访问请求的资源,并执行相应的业务逻辑。

精简版案例:

客户端生成令牌:
public void generateJWT() {
   
    JwtBuilder builder = Jwts.builder();
    String token = builder
        // 头部
        .setHeaderParam("typ", "JWT")
        .setHeaderParam("alg", "HS256")
        // 载荷数据/过期时间
        .claim("id", 10001)
        .claim("nickName", "老王")
        // 设置过期时间,这里设置为当前时间加上一小时
        .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60))
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值