url编码有什么用
简介
JSON Web Token(JWT)是一种基于JSON格式的开放标准(RFC 7519),用于在双方之间安全地传输信息。虽然JWT并非OAuth 2.0强制使用的token格式,但由于其便利性和可扩展性,现在越来越多的应用程序使用JWT来进行身份验证和授权。基于OpenID Connect的OAuth 2.0明确指定JWT为其唯一的token格式。
使用令牌(Token)的目的
Token的主要目的是提供一种具有保护属性的数据结构,用于在HTTP无状态协议中安全地传输信息。通过使用Token,用户登录信息可以保存在客户端,从而减轻服务器端的压力,同时也有助于服务器端的水平扩展。
为了实现这些功能,Token包含一些标识用户或相关信息的数据,如发行者(issuer)、主题(subject)等。Token会被签名以保证数据的真实性和完整性。Token通常具有时效性,过期后自动失效,以增加安全性。
JWT的结构
JWT是一种明文格式,任何人都可以读取,但也因此可以被签名认证以防止篡改。其结构分为三部分:头部(Header)、负载(Payload)和签名(Signature)。
以jwt.io上的示例为例:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE6MjM9MDIyfQ.he0ErCNloe4J7Id0Ry2SEDg09lKkZkfsRiGsdX_vgEg
这个例子中,三部分通过点号分隔。头部包含元数据信息和使用的签名算法;负载包含实际的数据和元数据;签名则是对头部和负载进行签名认证的结果。
数据详解
头部(Header):定义JWT的元数据信息,如使用什么算法进行签名。例如上述例子中的头部信息包括使用的算法(alg)和JWT的类型(typ)。
负载(Payload/Claims):包含真正的数据,分为标准字段、公共字段和私有字段。标准字段包括iss(发行者)、sub(主题)、aud(观众或接收者)、exp(过期时间)、nbf(生效时间)、iat(生成时间)和jti(JWT ID)。公共字段类似于网络中的通用端口,用于特定的通用目的。私有字段则可以自定义,用于传输私有信息。
签名(Signature):对头部和负载进行签名认证的结果,以保证Token的真实性和完整性。签名算法和密钥在头部中定义。
生产及消费JWT
为了帮助理解JWT的产生过程,大部分编程语言都提供了封装好的JWT库。以下以C为例:
生产JWT:
使用Microsoft.IdentityModel.Tokens.JWT库,创建一个JWTSecurityToken对象,设置相关参数如发行者、观众、声明、签名凭据、有效期等,然后通过JWTSecurityTokenHandler序列化生成Token字符串。
消费JWT:
通过JWTSecurityTokenHandler对Token进行验证,设置验证参数如预期的发行者、允许的观众、签名密钥等,验证Token的签名和有效性,提取负载中的数据进行使用。
参考文档为RFC 7519。