1.什么是JWT?
JWT(JSON Web Token)是一种用于在网络应用之间安全传递信息的开放标准(RFC 7519)。它是一种轻量级、自包含的令牌(token),通常用于在客户端和服务器之间进行身份验证和授权。
WT由三部分组成:
-
Header(头部): 包含了令牌的元数据和描述信息,通常指定了使用的签名算法(例如,HMAC SHA256或RSA),以及令牌类型(JWT)。
-
Payload(负载): 负载部分包含了一组声明(claims),这些声明是关于用户或实体的信息,以及其他元数据。负载可以包含自定义数据,也可以包含一些标准声明,如过期时间、发行时间、主题等。
-
Signature(签名): 签名部分用于验证令牌的完整性和真实性。它通过使用头部中指定的签名算法和秘钥对头部和负载的内容进行签名,从而生成一个签名值。服务器可以使用秘钥验证签名以确保令牌未被篡改。
主要用途:
-
身份验证(Authentication): JWT常用于用户身份验证。用户在登录后,服务器会生成一个JWT,并在每次请求中将其包含在HTTP请求头或Cookie中。客户端在后续请求中将JWT发送到服务器,服务器使用秘钥验证JWT的签名以确保令牌的有效性,并识别用户。
-
授权(Authorization): JWT也可用于授权用户对特定资源的访问。负载部分可以包含用户的角色、权限等信息,服务器可以根据这些信息来决定用户是否有权访问某些资源。
-
信息交换(Information Exchange): 因为JWT是自包含的,它可以用于在不同系统之间安全地传递信息。系统可以相互信任,只要他们都能验证JWT的签名,就可以互相传递数据。
-
单点登录(Single Sign-On,SSO): JWT可以用于实现SSO,允许用户一次登录,然后访问多个关联应用而无需重新登录。
单点登录具体实现:
JWT实现单点登录的一般步骤:
-
用户登录:
- 用户访问应用程序的登录页面并提供用户名和密码。
- 应用程序验证用户的身份,通常是通过数据库或身份提供者(如OAuth 2.0或LDAP)进行验证。
- 一旦用户的身份验证成功,应用程序会创建一个JWT并使用私钥对其进行签名。
-
JWT的创建:
- JWT由三个部分组成:头部(Header)、载荷(Payload)和签名(Signature)。
- 头部包含JWT的类型和签名算法,通常是{"alg": "HS256", "typ": "JWT"},表示使用HMAC SHA-256算法进行签名。
- 载荷包含有关用户的信息,如用户ID、用户名等。还可以包含其他有关用户的相关信息。
- 签名是对头部和载荷的组合进行签名的结果,使用应用程序的私钥进行签名。
-
JWT的返回:
- 应用程序将JWT返回给用户的浏览器或移动应用程序。
- JWT通常以HTTP标头的形式发送,例如
Authorization: Bearer <JWT>
。
-
JWT的存储:
- 用户的浏览器或移动应用程序将JWT存储在本地,通常使用浏览器的LocalStorage或Cookie。
-
单点登录流程:
- 当用户尝试访问其他需要身份验证的应用程序时,应用程序将要求用户提供JWT。
- 用户将JWT发送给应用程序。
- 应用程序验证JWT的签名是否有效,以确保JWT未被篡改。
- 如果JWT有效且未过期,应用程序可以信任其中的用户信息,并允许用户访问该应用程序,无需再次登录。
-
JWT的过期和刷新:
- JWT可以设置过期时间,通常以秒为单位。一旦JWT过期,用户将需要重新登录。
- 为了避免用户频繁登录,可以使用刷新令牌(Refresh Token)来获取新的JWT。刷新令牌通常在JWT过期后发挥作用。