认证授权
cookie、JWT、session 的原理和区别¶
- 原理
- cookie:是服务器发送到用户浏览器并保存在本地的一小段数据。服务器在响应中设置
Set - Cookie
头部,浏览器会将其存储。之后,浏览器在每次请求同一域名下的资源时,会自动在请求头中带上相应的Cookie
字段,服务器通过解析Cookie
来识别用户身份等信息。 - JWT:由服务器对用户信息进行加密签名后生成一个包含用户相关信息的 JSON 对象。客户端在登录成功后收到 JWT,之后每次请求时,将 JWT 放在请求头的
Authorization
字段中发送给服务器,服务器通过验证 JWT 的签名和有效性来识别用户身份和权限。 - session:服务器在用户登录时为其创建一个唯一的会话(session),并将用户信息存储在服务器端的内存或数据库中。同时,服务器会向客户端发送一个
session ID
,通常通过Cookie
来传递。客户端后续请求时,会携带这个session ID
,服务器根据session ID
来查找对应的用户信息,以实现用户身份的识别和状态的保持。
- cookie:是服务器发送到用户浏览器并保存在本地的一小段数据。服务器在响应中设置
- 区别
- 存储位置:cookie 存储在客户端浏览器中;JWT 通常也存储在客户端(如本地存储或
Cookie
中);session 存储在服务器端。 - 数据传输:cookie 会在每次请求和响应中自动携带,可能会增加不必要的传输数据量;JWT 需要客户端在请求头中手动携带,且其大小相对固定,不会随请求次数增加而增大;session 只在客户端发送
session ID
,服务器根据session ID
查询相关信息,数据传输量较小。 - 安全性:cookie 容易被篡改,若不设置
HttpOnly
属性,还可能受到 XSS 攻击;JWT 由于有签名验证,相对安全,但如果密钥泄露则存在风险;session 的安全性主要依赖于服务器对session ID
的管理和保护,一般较为安全。 - 跨域支持:cookie 在跨域场景下存在限制,需要进行复杂的配置和处理;JWT 可以方便地在不同域之间传递,只要各方都能验证 JWT 的有效性;session 在跨域时也需要额外的处理,如通过设置
CORS
等。
- 存储位置:cookie 存储在客户端浏览器中;JWT 通常也存储在客户端(如本地存储或
JWT 的组成¶
JWT 本质上就是一组字串,通过(.)切分成三个为 Base64 编码的部分:
- Header(头部) : 描述 JWT 的元数据,定义了生成签名的算法以及
Token
的类型。Header 被 Base64Url 编码后成为 JWT 的第一部分。 - Payload(载荷) : 用来存放实际需要传递的数据,包含声明(Claims),如
sub
(subject,主题)、jti
(JWT ID)。Payload 被 Base64Url 编码后成为 JWT 的第二部分。 - Signature(签名):服务器通过 Payload、Header 和一个密钥(Secret)使用 Header 里面指定的签名算法(默认是 HMAC SHA256)生成。生成的签名会成为 JWT 的第三部分。
JWT 通常是这样的:xxxxx.yyyyy.zzzzz
。
JWT 的 payload 里存了什么信息¶
JWT(JSON Web Token)的 payload 部分是 JWT 的核心内容,主要存放以下几类信息:
- 声明(Claims):这是 payload 的主要部分,包含了各种关于用户或实体的信息。例如,
sub
(subject)用于标识用户身份,name
表示用户名,email
代表用户邮箱等。还可以包含一些自定义的声明,用于传递特定业务相关的信息,如用户角色、权限等。 - 过期时间(Expiration Time):通过
exp
字段来指定 JWT 的过期时间,以 Unix 时间戳表示。这可以确保令牌在一定时间后失效,增强安全性。 - 签发时间(Issued At):由
iat
字段表示,记录 JWT 的签发时间,用于验证令牌的新鲜度。