golang,go,博客,开源,编程

认识jwt

Published on with 0 views and 0 comments

JWT(JSON Web Token)是一种轻量级的、安全的传输和验证信息的标准。JWT通常用于身份验证和信息交换,它可以安全地在各方之间传输信息,因为它是经过数字签名的。这使得接收方可以验证信息的来源并确认它没有被篡改。JWT广泛应用于Web应用程序中的认证和授权场景。

JWT的结构

JWT由三部分组成,每一部分都经过Base64Url编码,用.分隔:

header.payload.signature
  • Header(头部)
  • Payload(负载)
  • Signature(签名)

1. Header(头部)

JWT的头部通常包含两部分信息:

  • typ: 表示JWT的类型,通常是JWT
  • alg: 用来签名JWT的算法,例如HS256(HMAC-SHA256)、RS256(RSA SHA256)等。

示例

{
  "alg": "HS256",
  "typ": "JWT"
}

2. Payload(负载)

负载部分包含了JWT的声明信息(claims)。声明是指要传输的具体信息。JWT的声明分为三种类型:

  • 注册声明(Registered Claims):这些是JWT标准中定义的预定义字段,使用时可以选择性地包含,如sub(主题)、iat(签发时间)、exp(过期时间)等。
  • 公共声明(Public Claims):这些是用户自定义的字段,可以用于传输特定的应用信息,如user_idrole等。
  • 私有声明(Private Claims):这些是双方约定使用的自定义声明,通常用于共享应用程序之间的特定数据。

JWT的负载是一个JSON对象,包含了各种声明。需要注意的是,JWT的负载部分不加密,任何人都可以解码并查看它,所以不要把敏感信息放在负载中。

示例

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

这里:

  • sub(Subject)通常表示用户ID。
  • name 是用户的名字。
  • iat(Issued At)是JWT的签发时间。

3. Signature(签名)

签名部分用于验证JWT在传输过程中是否被篡改。它通过以下方式生成:

  1. 你首先将Base64Url编码后的header和payload拼接起来,中间用.分隔。
  2. 然后,你使用header中指定的算法(如HS256)与一个密钥(对于对称加密是共享的密钥,对于非对称加密是私钥)对这个拼接字符串进行签名。

例如,签名的生成方式为:

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

secret是服务器和客户端共享的密钥(在对称加密的情况下)或者是签名的私钥(在非对称加密的情况下)。

签名确保JWT的完整性,防止它在传输过程中被篡改。

JWT的工作流程

JWT在认证和授权流程中的应用一般如下:

  1. 用户登录:用户向服务器提供用户名和密码进行身份验证。
  2. 服务器生成JWT:如果验证通过,服务器会生成一个JWT,里面包含用户的身份信息(例如用户ID、角色等),并用密钥签名。
  3. 客户端存储JWT:客户端(通常是浏览器或移动设备)存储JWT,通常将其保存在本地存储(localStorage)或会话存储(sessionStorage)中。
  4. 后续请求携带JWT:客户端在后续的每一个请求中,将JWT放在HTTP请求头中,通常是放在Authorization头部,如下所示:
    Authorization: Bearer <JWT>
    
  5. 服务器验证JWT:服务器收到请求后,解析JWT,验证其签名是否正确,检查JWT是否过期等。如果验证通过,服务器就知道该请求是合法的,可以进行相应的处理。

JWT的优势

  • 无状态:JWT是无状态的(stateless),即它将所有的信息(包括用户身份和权限)都包含在token本身,而不需要服务器保存会话数据。每次请求都可以独立验证,而不依赖于服务器的内存或数据库。
  • 跨域支持:由于JWT是自包含的,它可以在不同的系统和平台之间传递,常用于跨域认证。
  • 灵活性:JWT的负载部分是JSON格式的,因此可以包含多种自定义信息。
  • 提高性能:由于JWT的无状态特性,服务器不需要查询数据库或存储来验证用户身份,从而减少了访问数据库的频率,提高了性能。

JWT的缺点

  • 负载信息不加密:JWT的负载部分是可以被任何人解码的,虽然签名可以防止篡改,但它不能防止泄漏。如果负载中包含敏感信息,应加密该部分信息。
  • 过期时间问题:JWT的有效期通常是固定的,一旦过期,用户必须重新登录,这可能会影响用户体验。

安全性注意事项

  1. 使用HTTPS:因为JWT的负载部分没有加密,所有信息都可以被中间人读取,所以应始终通过HTTPS进行传输。
  2. 选择强密码和密钥:在生成签名时,应使用强大的密钥进行签名,避免使用简单或容易被猜测的密钥。
  3. 设置合理的过期时间:JWT的exp(过期时间)应该合理设置,避免JWT在过期后被继续使用。
  4. 避免泄露密钥:服务器端签名密钥必须妥善保管,任何泄露都可能导致安全漏洞。

常见用途

  • 认证:JWT最常用于实现基于令牌的认证。客户端通过JWT在后续请求中验证用户身份。
  • 授权:JWT也可以用于传递授权信息,服务器可以通过JWT的payload来判断用户是否有权限执行某个操作。
  • 单点登录(SSO):多个应用程序或服务之间可以共享JWT来实现单点登录。

总结

JWT是一种用于安全传输信息的标准,它通过将用户身份和授权信息自包含在令牌中,并通过签名进行验证,能够提供简单且高效的认证和授权机制。尽管它有许多优点,但也需要注意安全性问题,尤其是在敏感信息的保护和密钥的管理上。


标题:认识jwt
作者:mooncakeee
地址:http://blog.dd95828.com/articles/2025/01/15/1736923179622.html
联系:scotttu@163.com