JWT(JSON Web Token)是一种用于在不同系统或组件之间传输信息的紧凑且安全的标准。它的作用主要有两个方面:
- **身份验证(Authentication)**:
JWT通常用于验证用户的身份。当用户登录时,服务器会生成一个JWT,并将其发送给客户端。客户端随后在每个请求中包含JWT,服务器使用它来验证用户的身份,以便允许或拒绝对受保护资源的访问。
- **授权(Authorization)**:
JWT还可以包含有关用户的授权信息,例如用户在系统中的角色或权限。这使得服务器可以根据JWT中的信息来控制用户对资源的访问权限。
JWT由三个部分组成,这三个部分由点号`.`分隔开来,它们是:
- **标头(Header)**:
标头部分通常包含有关JWT的元数据,如令牌的类型(通常为"JWT")和使用的签名算法(例如HMAC SHA256或RSA)。标头是一个JSON对象,经过Base64编码后放在JWT的第一个部分。
- **载荷(Payload)**:
载荷部分包含一组声明(claims),声明是关于实体(通常是用户)和其他数据的陈述。有三种类型的声明:
- **注册声明(Registered Claims)**:这些是一些预定义的声明,如令牌的主题("sub")发行者("iss")、受众("aud")和过期时间("exp")等。
- **公共声明(Public Claims)**:这些是用户自定义的声明,用于在特定应用程序中传递有关实体的信息。
- **私有声明(Private Claims)**:这些是用户自定义的声明,通常用于在双方之间共享信息。
- **签名(Signature)**:
签名部分用于确保JWT的完整性和验证其来源。它由标头、载荷和一个密钥组合生成,具体取决于所选的签名算法。签名可确保JWT在传输过程中没有被篡改。
三者之间的关系是:标头和载荷是明文的JSON数据,它们通过Base64编码后连接在一起,用`.`分隔,形成JWT的第一部分。然后,签名被附加在JWT的第二部分,形成最终的JWT。因此,JWT的结构是“Header.Payload.Signature”。
JWT的运行流程通常涉及以下步骤:
- **身份验证**:
1. 用户通过提供用户名和密码等凭据进行身份验证。
2. 服务器验证凭据的有效性。
3. 如果验证成功,服务器生成一个JWT,其中包含有关用户的信息和必要的授权信息。
4. 服务器将JWT发送给客户端。
- **请求授权资源**:
1. 客户端在请求中包含JWT,通常在请求的头部(Authorization header)中。
2. 服务器接收请求并解析JWT。
3. 服务器验证JWT的签名以确保其完整性和来源。
4. 如果JWT有效,服务器检查其中的声明以确定用户是否被授权访问请求的资源。
5. 如果用户被授权,服务器提供请求的资源。
JWT在Java中的使用详解_java jwt payload_newCodeWorker的博客-CSDN博客
总之,JWT在身份验证和授权过程中充当了令牌,用于传递用户身份和授权信息,使得服务器可以在无需维护会话状态的情况下验证用户并授予访问权限。这使得JWT在分布式系统和API身份验证中特别有用。