Cookie、Session、Token和JWT

image

Cookie

定义:Cookie是服务器发送到用户浏览器并保存在本地的一小段文本数据。

每次浏览器向同一服务器发送请求时,都会携带这些数据。

1- 示意图:

1. 用户访问网站,服务器发送Cookie到浏览器。
2. 浏览器保存Cookie。
3. 用户再次访问该网站时,浏览器会自动携带Cookie发送请求。

2- 用途:

  • 记住登录状态:例如,用户登录后,服务器可以在Cookie中存储用户的身份信息,下次访问时无需重新登录。
  • 保存用户偏好:例如,保存用户的语言设置或主题选择。

3- 优缺点:

  • 优点:实现简单,适用于保存一些不太敏感的信息。
  • 缺点:存储在客户端,容易被篡改和盗取,安全性较低。

Session

定义:Session是服务器端的一种机制,用于在一段时间内保存用户的状态信息。

每个Session都有一个唯一的Session ID,通常通过Cookie传递给客户端。

1- 示意图:

1. 用户登录,服务器创建一个Session并生成一个Session ID。
2. 服务器将Session ID通过Cookie发送给浏览器。
3. 用户再次访问时,浏览器携带Session ID,服务器根据Session ID找到对应的Session信息。

2- 用途:

  • 用户身份验证:例如,用户登录后,服务器创建一个Session对象,保存用户信息。
  • 会话管理:例如,保存购物车中的商品信息。

3- 优缺点:

  • 优点:存储在服务器端,安全性较高,不易被篡改。
  • 缺点:需要占用服务器资源,随着用户数量增加,服务器负担加重。

Token

定义:Token是服务器生成的一串字符串,用于客户端进行请求时的身份验证。Token通常在用户登录后生成,并返回给客户端。

1- 示意图:

1. 用户登录,服务器生成一个Token并返回给客户端。
2. 客户端保存Token(通常保存在localStorage或sessionStorage中)。
3. 用户再次请求时,客户端携带Token,服务器验证Token的有效性。

2- 用途:

  • 跨域身份验证:Token可以在不同的域之间传递,适用于分布式系统。
  • API安全:Token常用于API请求的身份验证,确保只有授权用户才能访问API。

3- 优缺点:

  • 优点:灵活性高,适用于分布式系统和跨域请求。
  • 缺点:需要妥善管理Token的生成和验证,防止Token泄露。

JWT(JSON Web Token)

定义:JWT是一种基于JSON的开放标准(RFC 7519),用于在各方之间以JSON对象的形式安全传输信息。JWT通常由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。

1- 示意图:

JWT = Header + Payload + Signature

Header: {
  "alg": "HS256",
  "typ": "JWT"
}

Payload: {
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

Signature: HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

2- 用途:

  • 身份验证:JWT可以在用户登录后生成,并在后续请求中携带,用于验证用户身份。
  • 信息传递:JWT可以携带用户的角色、权限等信息,便于服务器进行权限控制。

3- 优缺点:

  • 优点:自包含(包含所有必要的信息),不需要在服务器端存储会话信息,适用于分布式系统。
  • 缺点:如果不加密,信息容易被窃取;签名部分虽然可以防篡改,但不能防止信息泄露。

总结

技术 存储位置 安全性 适用场景
Cookie 客户端 较低 简单状态管理、个性化设置
Session 服务器端 较高 复杂会话管理、用户身份验证
Token 客户端 较高 跨域请求、API安全
JWT 客户端 较高 分布式系统、身份验证