传统的鉴权如cookie和session的认证往往在一台服务器上
jwt认证和ak/sk跳出这个范畴,让授权和鉴权的服务器不在一台上
JWT(JSON Web Token)
是一种用于客户端与服务器之间传递信息的安全机制,通常用于认证和授权。JWT 是一种基于 JSON 格式的令牌,能够自包含地传递认证信息和其他数据
组成部分
Header(头部)
Header通常由两部分组成:令牌的类型(即JWT)和所使用的签名算法(例如HMAC SHA256或RSA)
{
"alg": "HS256",
"typ": "JWT"
}
Payload
承载了信息,包含了用户相关的声明
- 存储声明(Claims):
- 注册声明(Registered Claims):这些是建议但不是强制性的预定义声明,通常包括:
iss(Issuer):JWT 的签发者。sub(Subject):JWT 的主题或用户的标识。aud(Audience):JWT 的受众,即 JWT 所面向的用户或系统。exp(Expiration Time):JWT 的过期时间。iat(Issued At):JWT 的签发时间。nbf(Not Before):在此时间之前,JWT 无法使用。- 公共声明(Public Claims):这些是可供使用的自定义声明,但需要避免与注册声明或其他公共声明冲突。
- 私有声明(Private Claims):这些声明是应用程序特定的,不同的应用或系统间可能有不同的定义,通常用于在不同服务之间共享用户信息。举个栗子
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
以上会被Base64编码为JWT的第二部分,会被解码回明文信息,所以不建议存放敏感信息
- 自包含数据:
- Payload 包含了验证用户身份所需的所有信息,使 JWT 可以是自包含的。这意味着服务器可以通过解码 JWT 来获取用户信息,而无需额外查询数据库,这提高了效率和性能。
- 灵活性:
- Payload 可以根据需求自定义,既可以包含简单的用户身份信息,也可以包含复杂的权限和角色信息。它可以适应各种不同的应用场景
- 无状态性支持:
- 因为 Payload 包含了所有必要的声明信息,服务器不需要存储用户的会话数据,这支持了 JWT 的无状态性特点,非常适合分布式系统和微服务架构
Signature(签名)
jwt的header跟payload都是在客户端可以解析出明⽂的。所以他们⾥⾯⼀般不会存储 敏感信息。
header中描述了签名算法(HS256)
其安全性的最终保障来⾃于密钥的机密性(包括1.不能是弱密钥被爆破出来了2.如果 是产品通⽤密钥,那么代码审计的作⽤就出来了)
当然也取决于程序员是不是傻⼦,不检出签名是否正确

Comments NOTHING