JWT(JSON Web Token)
目录
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由三部分组成,使用点(.)分隔:
-
Header(头部):包含令牌的类型(默认为JWT)和JWT加密所使用的算法(如HMAC、SHA256、RSA等)。这部分使用Base64编码。
-
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编码是可以解码的。
-
Signature(签名):签名是使用前面两个JSON信息的Base64编码,再加一个盐值(secret),最后再使用Header中指定的算法进行加密得到的。签名用于验证信息的完整性和真实性,防止信息被篡改。
四、JWT的使用场景
- 用户认证:在用户登录成功后,服务器生成一个JWT并返回给客户端。客户端在后续请求中携带这个JWT,服务器验证JWT的有效性来确定用户的身份和权限。
- 信息交换:当系统A与系统B需要安全地交换信息时,可以使用JWT作为信息的载体。由于JWT是自包含的,并且经过签名验证,因此可以确保信息的完整性和真实性。
五、JWT的优缺点
优点:
- 紧凑:JWT以JSON格式紧凑地表示信息,易于传输和存储。
- 自包含:JWT包含所有必要的信息,无需额外的查询或存储。
- 安全性:通过签名验证,可以确保JWT的完整性和真实性。
缺点:
- 载荷大小:由于JWT是Base64编码的,因此载荷越大,JWT的长度就越长,可能影响传输效率。
- 敏感信息:虽然JWT可以包含自定义声明,但通常不建议包含敏感信息,因为Base64编码是可以解码的。如果需要包含敏感信息,应该使用加密技术进行处理。
- 过期时间:JWT具有过期时间,过期后需要重新生成。这增加了系统的复杂性,并可能导致令牌失效的问题。
编码实现
原文地址:https://blog.csdn.net/a13641376265/article/details/145270591
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!