自学内容网 自学内容网

JWT(JSON Web Token)

        

目录

一、跨域认证的问题

二、JWT 的原理

三、JWT的结构

四、JWT的使用场景

五、JWT的优缺点


JWT是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于将信息作为JSON对象在各方之间安全地传输。JWT通常用于在Web应用和API安全中,作为访问令牌(access tokens)和信息交换的载体。

一、跨域认证的问题

互联网服务离不开用户认证。一般流程是下面这样。

1、用户向服务器发送用户名和密码。

2、服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色、登录时间等等。

3、服务器向用户返回一个 session_id,写入用户的 Cookie。

4、用户随后的每一次请求,都会通过 Cookie,将 session_id 传回服务器。

5、服务器收到 session_id,找到前期保存的数据,由此得知用户的身份。

        这种模式的问题在于,扩展性(scaling)不好。单机当然没有问题,如果是服务器集群,或者是跨域的服务导向架构,就要求 session 数据共享,每台服务器都能够读取 session。

        举例来说,A 网站和 B 网站是同一家公司的关联服务。现在要求,用户只要在其中一个网站登录,再访问另一个网站就会自动登录,请问怎么实现?

        一种解决方案是 session 数据持久化,写入数据库或别的持久层。各种服务收到请求后,都向持久层请求数据。这种方案的优点是架构清晰,缺点是工程量比较大。另外,持久层万一挂了,就会单点失败。

        另一种方案是服务器索性不保存 session 数据了,所有数据都保存在客户端,每次请求都发回服务器。JWT 就是这种方案的一个代表。

二、JWT 的原理

JWT 的原理是,服务器认证以后,生成一个 JSON 对象,发回给用户,就像下面这样。


{
  "姓名": "张三",
  "角色": "管理员",
  "到期时间": "2018年7月1日0点0分"
}

        以后,用户与服务端通信的时候,都要发回这个 JSON 对象。服务器完全只靠这个对象认定用户身份。为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名(详见后文)。

服务器就不保存任何 session 数据了,也就是说,服务器变成无状态了,从而比较容易实现扩展。

三、JWT的结构

JWT由三部分组成,使用点(.)分隔:

  1. Header(头部):包含令牌的类型(默认为JWT)和JWT加密所使用的算法(如HMAC、SHA256、RSA等)。这部分使用Base64编码。

  2. Payload(有效载荷):存放用户数据的声明。这部分也使用Base64编码。通常包含的标准声明有:

    • iss(Issuer):JWT签发者(生产者)。
    • sub(Subject):JWT面向的用户(消费者)。
    • aud(Audience):接受JWT的一方。
    • iat(Issued At):JWT的签发时间。
    • exp(Expires At):JWT的过期时间,这个时间必须大于签发时间。
    • nbf(Not Before):定义在什么时间之前,该JWT都是不可用的。
    • jti(JWT Id):JWT的唯一身份标识,主要用作一次性token,从而回避重放攻击。

    自定义声明可以添加任何需要的信息,但通常不会包含敏感信息,因为Base64编码是可以解码的。

  3. Signature(签名):签名是使用前面两个JSON信息的Base64编码,再加一个盐值(secret),最后再使用Header中指定的算法进行加密得到的。签名用于验证信息的完整性和真实性,防止信息被篡改。

四、JWT的使用场景

  1. 用户认证:在用户登录成功后,服务器生成一个JWT并返回给客户端。客户端在后续请求中携带这个JWT,服务器验证JWT的有效性来确定用户的身份和权限。
  2. 信息交换:当系统A与系统B需要安全地交换信息时,可以使用JWT作为信息的载体。由于JWT是自包含的,并且经过签名验证,因此可以确保信息的完整性和真实性。

五、JWT的优缺点

优点

  1. 紧凑:JWT以JSON格式紧凑地表示信息,易于传输和存储。
  2. 自包含:JWT包含所有必要的信息,无需额外的查询或存储。
  3. 安全性:通过签名验证,可以确保JWT的完整性和真实性。

缺点

  1. 载荷大小:由于JWT是Base64编码的,因此载荷越大,JWT的长度就越长,可能影响传输效率。
  2. 敏感信息:虽然JWT可以包含自定义声明,但通常不建议包含敏感信息,因为Base64编码是可以解码的。如果需要包含敏感信息,应该使用加密技术进行处理。
  3. 过期时间:JWT具有过期时间,过期后需要重新生成。这增加了系统的复杂性,并可能导致令牌失效的问题。

编码实现


原文地址:https://blog.csdn.net/a13641376265/article/details/145270591

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!