Cookie

  • 定义: Cookie是服务器发送到客户端并存储在客户端上的一小段数据,客户端会在后续请求中将这些数据发送回服务器。
  • 结构:

    • 名称(Name)
    • 值(Value)
    • 域(Domain):cookie适用的域名
    • 路径(Path):cookie适用的路径
    • 过期时间(Expires/Max-Age):cookie的生命周期
    • 安全标志(Secure):仅通过HTTPS传输

    HttpOnly标志:防止JavaScript访问cookie

  • 存储位置: 客户端(通常是浏览器)。
  • 使用场景: 用于存储用户偏好、会话标识符等信息。常见于会话管理、用户跟踪和个性化内容展示。
  • 安全性: 可以设置HttpOnly标志防止客户端脚本访问,可以设置Secure标志仅通过HTTPS传输。
  • 持久性: 可以设置过期时间,持久性cookie在浏览器关闭后依然存在,会话cookie在浏览器关闭后消失。
  • 优点:

    • 易于实现和使用
    • 支持跨请求和跨页面的数据存储
  • 缺点:

    • 安全性较低,容易受到XSS攻击(若未设置HttpOnly)
    • 容量有限,每个cookie大小通常不能超过4KB
  • 例子

    Set-Cookie: username=name; Expires=Wed, 09 Jun 2024 10:18:14 GMT; Path=/; Secure; HttpOnly

    Session

  • 定义: Session是一种在服务器上存储用户会话数据的机制,通常使用会话ID(存储在客户端的cookie中)来识别用户。
  • 存储位置: 服务器。
  • 使用场景: 用于在多个请求间保持用户状态,例如购物车信息、登录状态等。
  • 实现:

    • 用户首次访问时,服务器生成一个唯一的会话ID,并在服务器端创建一个会话数据存储空间。
    • 服务器通过Set-Cookie响应头将会话ID发送到客户端,客户端将其存储为一个cookie。
    • 客户端在后续请求中携带该cookie,服务器通过会话ID检索相应的会话数据。
  • 安全性: 相对安全,因为数据存储在服务器端,客户端只持有一个会话ID。
  • 持久性: 通常在会话结束或特定时间段后失效(例如,用户注销或会话超时)。
  • 优点:

    • 数据存储在服务器端,安全性较高
    • 可以存储复杂和大量的数据
  • 缺点:

    • 需要服务器资源来存储和管理会话数据
    • 适用于有状态的应用,不适合于无状态的服务(如RESTful服务)
  • 例子

    Set-Cookie: sessionid=abcd1234; Path=/; HttpOnly

    Token

  • 定义: Token是一种在身份验证过程中使用的字符串,用于代表用户的身份。Token可以包含用户信息和访问权限。
  • 存储位置: 客户端(通常在本地存储或sessionStorage)。
  • 使用场景: 用于无状态的身份验证系统,例如OAuth。
  • 类型:

    • Bearer Token: 最常见的一种,客户端在请求头中包含Authorization: Bearer <token>来访问受保护的资源。
    • OAuth Token: 用于OAuth2.0授权框架,包括访问令牌(access token)和刷新令牌(refresh token)。
  • 安全性: 取决于token的生成和存储方式,应通过HTTPS传输并妥善存储在客户端。
  • 持久性: 通常具有有效期,需要定期刷新或重新获取。
  • 优点:

    • 适用于无状态的身份验证系统
    • 易于跨域和跨平台使用
  • 缺点:

    • 需要妥善存储和管理token,防止被窃取或滥用
    • 若token有效期较短,需要频繁刷新token

JWT (JSON Web Token)

  • 定义: JWT是一种基于JSON的开放标准(RFC 7519)实现的令牌,用于在各方之间传递信息。JWT由三部分组成:Header、Payload和Signature。
  • 存储位置: 客户端(通常在本地存储或sessionStorage)。
  • 结构:

    • Header: 包含令牌类型(typ)和签名算法(alg),例如:{"alg": "HS256", "typ": "JWT"}
    • Payload: 包含声明(claims),即用户信息和其他数据,例如:{"sub": "1234567890", "name": "John Doe", "admin": true}
    • Signature: 用于验证令牌的真实性,通常使用Header和Payload加上一个密钥通过指定的算法生成
  • 使用场景: 广泛用于身份验证和信息交换,尤其是在分布式系统中。
  • 工作流程:

    • 用户登录时,服务器生成JWT并返回给客户端
    • 客户端将JWT存储在本地存储或sessionStorage
    • 客户端在后续请求中将JWT包含在请求头中发送给服务器
    • 服务器通过验证JWT的签名来确认请求的合法性
  • 安全性: 信息是以base64编码的,可以被解码,但不能被篡改,因为包含签名部分。建议通过HTTPS传输,并且尽量不存储敏感信息在payload中。
  • 持久性: JWT通常带有有效期,需要在到期后刷新。
  • 优点:

    • 自包含(self-contained),可以携带用户信息和权限数据
    • 无需在服务器端存储会话数据,适合分布式系统
  • 缺点:

    • 信息是base64编码的,容易被解码,因此不应存储敏感信息
    • 若JWT泄露,容易被滥用,需要设置合理的有效期和刷新机制

主要区别总结

Cookie和Session:

Cookie是存储在客户端的数据,Session是存储在服务器端的数据,两者可以配合使用,通过cookie存储会话ID来实现会话管理。

项目CookieSession
定义Cookie是由服务器生成并发送到客户端的一个小数据包,客户端会在后续请求中将这个数据包发送回服务器。它用于在客户端存储少量数据。Session是由服务器端维护的用户会话数据存储机制,用于保持用户的会话状态。每个会话通常由一个唯一的会话ID标识。
存储位置存储在客户端的浏览器中。存储在服务器端
安全性由于存储在客户端,容易被用户查看和修改,因此安全性较低。可以通过设置HttpOnly标志来防止JavaScript访问,通过Secure标志确保只能通过HTTPS传输。数据存储在服务器端,客户端只能看到一个会话ID,因此相对更安全。但是,如果会话ID被截获,攻击者也能劫持会话。
数据量和结构通常大小限制在4KB左右,适合存储少量简单数据。没有严格的数据量限制,可以存储更大和更复杂的数据结构。
生命周期可以设置过期时间。如果是持久性cookie,浏览器关闭后仍然存在;如果是会话cookie,浏览器关闭后即失效。通常在用户关闭浏览器或会话超时(由服务器设置的会话过期时间)后失效。
使用场景常用于保持用户偏好(如语言设置)、跟踪用户行为(如广告跟踪)、存储会话ID。常用于存储用户登录状态、购物车信息等需要跨请求保持的服务器端数据。
性能每次请求都会携带cookie数据,可能影响性能,特别是当cookie数量较多或数据较大时。由于数据存储在服务器端,客户端只需要传递会话ID,通常性能更好。但需要服务器端资源来存储会话数据。
实现原理由服务器生成,通过HTTP响应头Set-Cookie发送到客户端,客户端在后续请求中通过Cookie请求头发送回服务器。由服务器生成会话ID,通过cookie或URL参数发送到客户端。服务器通过会话ID在服务器端存储和检索会话数据。
  • Token和JWT: Token是一种泛指的令牌机制,而JWT是具体的Token格式,JWT不仅用于身份验证,还可以携带用户信息和权限数据。
  • 存储位置: Cookie存储在客户端浏览器,Session存储在服务器,Token和JWT通常存储在客户端。
  • 状态管理: Cookie和Session用于有状态的会话管理,Token和JWT用于无状态的身份验证。

总结

  • Cookie: 用于在客户端存储少量数据,通常用于会话管理和用户偏好设置。
  • Session: 在服务器端存储用户会话数据,适合有状态的会话管理。
  • Token: 用于无状态的身份验证和授权,常见于API和微服务架构。
  • JWT: 一种具体的Token格式,基于JSON的开放标准,适合分布式系统中的身份验证和信息传递。

转载自开思通智网:https://www.opensnn.com/os/article/10000788


失望的双杠_eJN3LI
1 声望0 粉丝