当前位置: 首页 > news >正文

JS—Token与JWT

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

一. 目录

  • 一–目录
  • 二–token登录流程
  • 三–JWT
  • 四–session与JWT对比

二. 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/移动端

相关文章:

  • [测试] Google Test | 主流的 C 测试框架
  • 2024最新鸿蒙开发面试题合集(二)-HarmonyOS NEXT Release(API 12 Release)
  • 网络命名空间验证网络重叠现象
  • SpringBoot3.x 集成 shardingsphere-jdbc 实现读写分离
  • 26考研|数学分析:反常积分
  • JSON for Modern C++ 解析 JSON(五)
  • 【Git】5 个分区的切换方式及示例
  • idea报错:程序包不存在
  • 【android bluetooth 协议分析 13】【RFCOMM详解 1】【通俗易懂 什么是rfcomm】
  • 数理天地杂志数理天地杂志社数理天地编辑部2025年第6期目录
  • Java的比较器 Comparable 和 Comparator
  • 如何批量拆分Excel工作表或按行拆分Excel表格 - Excel拆分器使用方法
  • 通信协议与网络知识:从硬件到互联网的全面指南
  • 什么是 MCP(模型上下文协议)
  • 10乱码问题的解释(1)
  • GLPI 在企业 IT 资产全生命周期管理中的价值
  • thinkcmf搭建
  • Thinkpad t14的startup 没有 UEFI/Legacy Boot 选项,如何设为U盘启动
  • 【Easylive】MySQL中LEFT JOIN与INNER JOIN的使用场景对比
  • c# 虚函数、接口、抽象区别和应用场景
  • 茅台总经理到访五粮液:面对白酒行业周期性调整,需要团结一心的合力
  • 首届中国人文学科年度发展大会启幕,共话AI时代人文使命
  • 特朗普政府涉税改法案遭众议院预算委员会否决
  • 张国清将赴俄罗斯举行中俄“长江—伏尔加河”地方合作理事会第五次会议和“东北—远东”政府间合作委员会双方主席会晤
  • 新城悦服务:独董许新民辞任,新任独董与另两人组成调查委员会将调查与关联方资金往来
  • “多规合一”改革7年成效如何?自然资源部总规划师亮成绩单