JS—Token与JWT

个人博客:haichenyi.com。感谢关注

一. 目录

二. token登录流程

  1. 用户登录: 客户端发送用户名,密码到服务器
  2. 服务端验证: 服务端校验用户名,密码的有效性。验证通过之后生成签名Token(如JWT),包含用户信息,过期时间等
  3. 返回Token: 把Token返回给客户端,通常通过响应体
  4. 客户端存储Token: 客户端拿到token之后,把token存起来localStorage或者sessionStorage
  5. 后续请求携带Token: 后续请求在请求头中添加token,cookie中或者其他位置,传递给服务端
  6. 服务端验证Token: 服务端根据自定义的规则校验token的有消息,返回对应的数据
  7. 过期处理: 客户端刷新token,或者其他逻辑处理过期

token的存储位置

对比项localStoragesessionStorage
​生命周期长期有效(除非手动删除)当前标签页有效
​​安全性低(持久化存储,可能被长期利用)稍高(会话级失效,减少XSS的长期风险)
​跨标签页共享同一域名下都有效当前标签有效
​适用场景需要长期登录的场景(社交媒体应用等等)需要高安全性场景(银行应用等等)

建议:

  1. 若需用户关闭浏览器后重新登录,选择sessionStorage。
  2. 若需持久化登录状态,选择localStorage,但需配合短过期时间和HTTPS。
  3. 关键安全措施: 防御XSS(输入过滤、避免eval)、设置Token过期时间、使用Refresh Token轮换。

  保存在哪里没有绝对的标准,都是需要根据实际场景来。
  后续请求怎么给服务端,也是没有绝对的标准,一般token都是放在网络请求的Cookie里面或者Header里面
注意: 无论选择哪种方式,XSS漏洞均可导致Token泄露,因此防范XSS是核心。对于极高安全场景,可考虑将Token存入内存,并在页面刷新时重新认证。

三. JWT

  JWT全称:**JSON Web Token,**是一种轻量级、自包含的开放标准。有特殊规则的token。用于在双方之间安全传输信息。以 JSON 格式存储数据,并通过数字签名(如 HMAC 或 RSA)或加密保证信息的完整性和可信性,常用于身份认证(如登录 Token)和跨系统数据交换。

3.1 JWT 的组成

JWT 由三部分组成,用 . 分隔:
Header.Payload.Signature

  1. Header(头部)
    作用: 描述 Token 的类型和签名算法。
    示例:
{
  "alg": "HS256",  // 签名算法(如 HS256、RSA)
  "typ": "JWT"     // Token 类型
}
  1. Payload(载荷)​
    作用: 携带实际传输的数据(称为 ​Claims)。
    数据类型:
    • 预定义声明​(建议但不强制):如 exp(过期时间)、sub(主题)、iss(签发者)。
    • 自定义声明:业务相关数据(如用户 ID、角色)。
      示例:
{
  "sub": "user123",
  "name": "Alice",
  "exp": 1620000000  // 过期时间戳
}
  1. Signature(签名)​
    作用: 防止数据篡改,验证发送方的可信性。
    生成方式: 对 Header 和 Payload 的 Base64 编码结果进行签名,使用 Header 中指定的算法。
    示例(HMAC-SHA256)​:
HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secretKey  // 密钥(仅服务端持有)
)

3.2 JWT 的工作原理

  • 生成 Token: 服务端验证用户身份后,生成 JWT(包含用户信息),返回给客户端。
  • 传递 Token: 客户端将 JWT 存储在 Cookie、LocalStorage 或内存中,后续请求通过header带给服务端
  • 验证 Token: 服务端收到请求后:1.校验签名(防止伪造)。2.检查有效期(exp 声明)。3.提取 Payload 中的用户信息,完成身份认证。

3.3 JWT 的优缺点

  • 优点:
    • 无状态:服务端无需存储会话信息(如 Session ID),适合分布式系统。
    • 跨域支持:可轻松跨域名、跨服务传递。
    • 数据透明:Payload 可包含业务数据,减少数据库查询。
  • 缺点:
    • 无法废止:一旦签发,在过期前始终有效(需额外机制实现“注销”)。
    • 安全性依赖密钥:密钥泄露会导致所有 Token 失效。
    • ​Payload 默认不加密:敏感数据需自行加密(建议配合 HTTPS 使用)。

3.4 JWT 使用场景

  1. ​用户认证:替代传统 Session-Cookie 模式,实现无状态登录。
  2. ​授权:携带用户角色信息,控制 API 或资源访问权限。
  3. 跨服务数据交换:微服务间安全传递用户上下文(如 OpenID Connect)。

3.5 安全建议

  1. 避免在 Payload 中存储敏感数据​(如密码)。
  2. 使用 HTTPS:防止 Token 被窃听。
  3. 设置短过期时间​(如 15 分钟),配合 Refresh Token 续签。
  4. 签名算法选择:优先使用 HMAC 或 RSA,而非弱算法(如 none)。

四. session与JWT对比

对比项Session-Cookie(有状态)JWT(无状态)
服务端存储必须存储 Session 数据无存储,验证签名即可
扩展性需共享 Session 存储,扩展复杂天然支持分布式系统
​跨域支持依赖 Cookie 同源策略通过 Header 轻松跨域
​性能开销每次请求查询 Session 存储仅验证签名,无存储查询
​安全性需防御 CSRF需防御 XSS 和 Token 泄露
适用场景同源传统 Web 应用跨域 API、微服务、SPA/移动端
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海晨忆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值