当前位置: 首页 > 后端技术 > Node.js

JWT

时间:2023-04-04 00:06:40 Node.js

什么是JWTJSONWebToken(简称JWT)是目前最流行的跨域认证方案。它是一种身份验证和授权机制。JWT是一种基于JSON的开放标准(RFC7519),用于在Web应用程序环境之间传递声明。JWT声明一般用于在身份提供者和服务提供者之间传递经过认证的用户身份信息,从而从资源服务器获取资源。例如,它用于用户登录。JWT可以使用HMAC算法或RSA公钥/私钥进行签名。由于数字签名的存在,这些传输的信息是可信的。阮一峰老师关于JSONWebToken的入门教程非常通俗易懂,这里不再赘述。生成JWT的原理jwt.io/www.jsonwebtoken.io/JWT认证成功后,会返回一个JWT给客户端。客户端会将令牌保存在本地(通常使用localstorage,或cookies)。当用户想要访问受保护的路由或资源时,需要在请求头的Authorization字段中使用。以Bearer方式添加JWT,其内容类似如下Authorization:Bearercopycode服务器的保护路由会检查请求头Authorization中的JWT信息,如果合法则允许用户的行为,因为JWT是self-contained(里面包含了一些session信息),从而减少了查询数据库的需要,因为JWT不使用cookies,所以你可以使用任何域名来提供你的API服务,而不用担心跨源资源共享(CORS),因为用户的状态不再保存在服务器的内存中,所以这是一种使用JWT的无状态认证机制。客户端收到服务端返回的JWT,可以保存在Cookie或者localStorage中。方法1当用户想要访问受保护的路由或资源时,可以放在cookie中自动发送,但是这样不能跨域,所以最好放在HTTP请求头信息的Authorization字段中,使用Bearer模式添加JWT。GET/calendar/v1/eventsHost:api.example.comAuthorization:Bearer用户的状态不会保存在服务器的内存中,这是一种无状态的认证机制服务器的保护路由会检查请求头JWT信息在Authorization中,如果合法,则允许用户的行为。由于JWT是独立的,因此减少了查询数据库的需要。JWT的这些特性让我们可以完全依靠其无状态的特性来提供数据API服务,甚至可以创建下载流服务。因为JWT不使用cookie,所以你可以使用任何域名来提供你的API服务,而不用担心跨域资源共享(CORS)。方法二跨域时,可以将JWT放在POST请求的数据体中。方法三通过URL转账http://www.example.com/user?token=xxx在项目中使用JWT**项目地址:https://github.com/yjdjiayou/...**Token和JWT有相同的区别:两者都是访问资源的令牌,都可以记录用户信息,都使服务端无状态,只有验证成功,客户端才能访问服务端受保护的资源区别:令牌:服务端验证客户端发送时收到Token,需要查询数据库获取用户信息,然后验证Token是否有效。JWT:Token和Payload加密保存在客户端。服务端只需要使用密钥解密验证即可(验证也是JWT自己实现的)。无需查询或缩减查询数据库,因为JWT自带用户信息和加密数据。3、使用JWT需要考虑的问题因为JWT不依赖cookies,所以你可以使用任何域名来提供你的API服务,而不用担心跨域资源共享(CORS)。JWT默认不加密,但也可以加密。原始Token生成后,可以用密钥再次加密。如果JWT未加密,则无法将机密数据写入JWT。JWT不仅可以用于身份验证,还可以用于交换信息。有效使用JWT可以减少服务器查询数据库的次数。JWT最大的优势就是服务端不再需要存储Session,可以方便的扩展服务端的鉴权认证业务。但这也是JWT最大的缺点:由于服务器端不需要保存Session状态,所以无法在使用过程中丢弃某个Token或者改变Token的权限。也就是说,JWT一旦发出,就会一直有效,直到过期,除非服务端部署了额外的逻辑。JWT本身包含认证信息,一旦泄露,任何人都可以获得token的所有权限。为了减少盗用,JWT的有效期应该设置的比较短。对于一些比较重要的权限,用户在使用时需要重新认证。JWT适用于一次性命令认证。签发一个有效期很短的JWT,即使暴露了,风险也很小。由于每次操作都会生成一个新的JWT,所以不需要保存JWT,真正做到了无状态。为了减少盗用,JWT不应使用HTTP协议以明文传输,而应使用HTTPS协议传输。