JWT(JSON web token)的三个组成部分
JWT(JSON Web Token)是一种用于在网络应用间安全传输信息的开放标准(RFC 7519)。它由三个部分组成,分别是头部(Header)、载荷(Payload)和签名(Signature)。
-
头部(Header): JWT的头部通常由两部分组成:令牌的类型(即JWT)和使用的签名算法。例如,一个简单的头部可以是: { "alg": "HS256", "typ": "JWT" } 该头部的意思是使用HS256算法进行签名,并且类型是JWT。
-
载荷(Payload): 载荷是JWT的第二个部分,也被称为声明(Claims)。它包含了一些被称为声明的实体(例如用户、用户角色等)的信息。载荷可以包含一组标准声明,例如: { "sub": "1234567890", "name": "John Doe", "iat": 1516239022 } 还可以包含自定义的声明,例如: { "role": "admin" }
-
签名(Signature): 要创建JWT的签名部分,需要使用头部和载荷以及密钥进行签名。签名用于验证消息的完整性和验证发件人的身份。例如,用于创建签名的算法可以是HMAC SHA256(使用字符串和密钥并加密生成签名),或者是RSA或ECDSA(使用公钥加密和私钥解密)等。服务端需要保存加密用的密钥,以便后续的签名验证
总结起来,JWT由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。头部用于描述签名的算法和类型,载荷用于存储信息的声明,签名用于验证消息的完整性和验证发件人的身份。
JWT和cookie都可以用于身份验证和会话管理,但它们在安全性方面有一些不同。
1. 盗用风险:JWT的盗用风险相对较高。由于JWT是无状态的,服务器不存储任何会话信息,而是将所有必要的信息存储在令牌中,因此一旦JWT被盗用,攻击者可以使用该令牌来访问被授权的资源。而cookie的盗用风险相对较低,特别是当它与HTTP-only标志一起使用时,可以防止JavaScript访问cookie,从而降低了盗用风险。
2. 防止盗用的方法:
- 对于JWT:使用HTTPS协议进行传输以保证通信的安全性,确保令牌不被拦截和篡改;设置JWT的过期时间,及时使其失效;在服务器端对JWT进行验证,确保它是有效且未被修改的。 - 对于cookie:使用HTTP-only标志将cookie设置为仅通过HTTP协议传输,防止JavaScript访问cookie;设置cookie的Secure标志,只在使用加密连接时发送cookie;对cookie进行签名或加密,以保证其完整性和安全性。无论是使用JWT还是cookie,都需要合理设置过期时间,并定期更换密钥或令牌,以降低盗用风险。另外,用户在使用网站或应用时也应保持警惕,避免在不可信任的环境下使用敏感信息。
优点
- json 格式传递数据,跨语言
- 字节占用小,组成简单
- 状态无关,服务端无需保存会话信息
- 可以在分布式系统中,解决单点登录的问题
- 可以防护 csrf 攻击
- payload 可以扩展信息
缺点
- payload 不能存放敏感信息
- 安全性依赖签名算法,签名的密钥需要保存好
- 为了避免 token 被劫持,使用https协议
- 不支持在令牌生命周期内动态改变权限
- 无法撤销,在有效期内无法取消或删除
- 荷载payload大小限制
- 每次请求都要携带,会增加网络负担
还没有评论,来说两句吧...