跳转至

认证授权

cookie、JWT、session 的原理和区别

  • 原理
    • cookie:是服务器发送到用户浏览器并保存在本地的一小段数据。服务器在响应中设置Set - Cookie头部,浏览器会将其存储。之后,浏览器在每次请求同一域名下的资源时,会自动在请求头中带上相应的Cookie字段,服务器通过解析Cookie来识别用户身份等信息。
    • JWT:由服务器对用户信息进行加密签名后生成一个包含用户相关信息的 JSON 对象。客户端在登录成功后收到 JWT,之后每次请求时,将 JWT 放在请求头的Authorization字段中发送给服务器,服务器通过验证 JWT 的签名和有效性来识别用户身份和权限。
    • session:服务器在用户登录时为其创建一个唯一的会话(session),并将用户信息存储在服务器端的内存或数据库中。同时,服务器会向客户端发送一个session ID,通常通过Cookie来传递。客户端后续请求时,会携带这个session ID,服务器根据session ID来查找对应的用户信息,以实现用户身份的识别和状态的保持。
  • 区别
    • 存储位置:cookie 存储在客户端浏览器中;JWT 通常也存储在客户端(如本地存储或Cookie中);session 存储在服务器端。
    • 数据传输:cookie 会在每次请求和响应中自动携带,可能会增加不必要的传输数据量;JWT 需要客户端在请求头中手动携带,且其大小相对固定,不会随请求次数增加而增大;session 只在客户端发送session ID,服务器根据session ID查询相关信息,数据传输量较小。
    • 安全性:cookie 容易被篡改,若不设置HttpOnly属性,还可能受到 XSS 攻击;JWT 由于有签名验证,相对安全,但如果密钥泄露则存在风险;session 的安全性主要依赖于服务器对session ID的管理和保护,一般较为安全。
    • 跨域支持:cookie 在跨域场景下存在限制,需要进行复杂的配置和处理;JWT 可以方便地在不同域之间传递,只要各方都能验证 JWT 的有效性;session 在跨域时也需要额外的处理,如通过设置CORS等。

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 的签发时间,用于验证令牌的新鲜度。