jwt具体是什么

jwt具体是什么

JWT(JSON Web Token)认证方式是一种基于令牌的认证机制,广泛应用于前后端分离的系统中。它通过生成、传递和验证一个加密的令牌(Token),来实现用户身份认证和授权。

JWT 的基本结构

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

  1. Header(头部)
    • 包含令牌的类型(通常是 JWT)和签名算法(如 HMAC SHA256)。
json 复制代码
{
  "alg": "HS256",
  "typ": "JWT"
}
  1. Payload(载荷)
    • 包含声明信息(claims),用于存储用户信息或其他元数据。
    • Claims 可以分为三类:
      • Registered claims (已注册声明):如 iss(签发者)、exp(过期时间)、iat(签发时间)。
      • Public claims(公共声明):由开发者定义的公开信息,如用户 ID、角色。
      • Private claims(私有声明):应用内自定义的非公开信息。
json 复制代码
{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true,
  "iat": 1516239022
}
  1. Signature(签名)
    • 用于验证数据完整性,防止数据被篡改。
    • 生成方式:将 Header 和 Payload 使用 Base64URL 编码后拼接起来,并用密钥和算法进行签名。
scss 复制代码
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret
)

最终生成的 JWT 类似于以下格式:

复制代码
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImlhdCI6MTUxNjIzOTAyMn0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

JWT 认证的工作流程

  1. 用户登录
    • 用户使用用户名和密码登录,服务器验证通过后生成 JWT,并将其返回给客户端。
  1. 客户端存储 JWT
    • 客户端通常将 JWT 存储在本地存储(localStorage)或浏览器的 Cookie 中。
  1. 请求时携带 JWT
    • 客户端在每次请求时,将 JWT 添加到 HTTP 请求头中:
makefile 复制代码
Authorization: Bearer <JWT>
  1. 服务器验证 JWT
    • 服务器接收到请求后,解析 JWT,验证签名和有效期。
    • 如果验证通过,则允许访问资源;否则返回 401(未授权)。

JWT 认证的优点

  1. 跨平台:JWT 是 JSON 格式,可以被多种语言解析和使用。
  1. 无状态:JWT 是无状态的,服务器无需存储会话信息,减少了服务器压力。
  1. 灵活性:Payload 中可以存储多种类型的信息。

JWT 的缺点

  1. 安全性问题
    • 如果密钥泄露,攻击者可以伪造 JWT。
    • 如果令牌被截获,可能会被重用(可以通过 HTTPS 和短期有效期减轻此问题)。
  1. 无法主动注销
    • 由于 JWT 无需存储在服务器端,服务器无法主动使某个令牌失效,除非使用黑名单机制。
  1. 令牌大小较大
    • 包含了 Header、Payload 和 Signature,在每次请求中都会传输,可能增加网络负担。

JWT 的使用场景

  • 用户认证:前后端分离的登录认证。
  • 微服务通信:服务之间基于 JWT 进行身份验证。
  • 移动应用:使用 JWT 在移动端管理用户身份。

如需实现,推荐配合 Node.js 的 jsonwebtoken 库,方便快速生成和验证 JWT。

相关推荐
xiyueyezibile1 分钟前
“自迭代” Skill 的 team-pitfalls 的演进
前端·后端·ai编程
林恒smileZAZ12 分钟前
`Array(100).map(() => 1)` 为什么全为空?
前端·javascript
小巧的砖头34 分钟前
C#会重蹈覆辙吗?系列之2:反射及元数据的性能问题
开发语言·前端·c#
KaMeidebaby40 分钟前
卡梅德生物技术快报|蛋白的叠氮基修饰:实操解析:核酸模板耦合蛋白的叠氮基修饰实现靶蛋白定点共价标记
前端·人工智能·物联网·算法·百度
濮水大叔1 小时前
在大型 Vue 项目中,如何有效管理复杂的状态?“散装版” vs “套装版”
前端·vue.js·typescript
玄星啊1 小时前
可修改:代码的生存底线
前端·ai编程
没落英雄2 小时前
3. DeepAgents 实战 - Memory Skills 与上下文工程
前端·人工智能·架构
Bigger2 小时前
对不起!我错怪你了,UnoCSS:一次和 AI 一起排查 DevTools 卡顿的经历
前端·css·人工智能
laowang3572 小时前
依赖故障时,日志体系需要埋哪些关键节点才能快速定位是安装失败、解析失败还是运行时缺失?
前端·javascript·vue.js·webpack·node.js
倾颜3 小时前
AI Mind 的单线程短期记忆设计:如何压缩、整理并控制当前会话上下文
前端·langchain·llm