什么是jwt?json web token

简介: 什么是jwt?json web token

那这个 Token 是个什么样的呢?

RFC 并没有明确规定;

不过业内比较常见的方案是使用 JWT ;

JWT 是 JSON Web Token 的缩写;

要学习 JWT 我们可以拿 session 作为参照物;

在传统开发中我们在用户登录后会创建一个 session 文件 xxx ;

用户的 id 等信息就存储在 xxx 文件中;

接着会在 Set-Cookie 中返回 xxx 作为 session_id ;

以后前端请求的时候就会在 cookie 中携带 xxx ;

服务器端根据 xxx 从文件中读取用户信息;

从上面的流程我们可以看出要验证一个用户需要有两步;

  1. 传递 session 文件名
  2. 根据文件名从文件中获取用户信息

那我们可不可以不传文件名;

服务器端直接返回用户信息组成的认证字符串;

以后前端就把认证字符串发送给服务器端;

服务器端从认证字符串中获取用户信息;

这样只需要一步就可以验证用户;

不需要 session 文件的参与了;

但是这里面有两个问题需要解决;

  1. 怎么用字符串保存用户信息
  2. 如何防止篡改即服务器端如何信任前端发送的用户信息字符串是真实有效的;

既然本文的标题是 JWT ;

那是时候开始 JWT 的表演了;

下面就有请 JWT 来解决上面的问题;

JWT 定义这个认证字符串为三段;

Header(头部) . Payload(负载) . Signature(签名) ;

Header

头部是一个 JSON ;

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

JSON

Copy

字段 全称 描述
alg algorithm 是签名的算法;一般是 HS256
typ type 固定值为 JWT

Payload

负载同样是一个 JSON ;

{
    "iss": "d8b832c0c8caf0d99e9406ed",
    "sub": "1",
    "aud": "baijunyao",
    "iat": "1557066830",
    "nbf": "1557066840",
    "exp": "1557066850",
    "jti": "9e9668d8b8306ed8caf0d94"
}

JSON

Copy

字段 全称 描述
iss issuer 发布者
sub subject 面向的用户; 一般是用户的 id
aud audience 受众;比如说之前 OAuth 系列中的 client id
iat issued at 签发时间的时间戳
nbf not before 生效时间的时间戳
exp expiration time 过期时间的时间戳
jti jwt id 每个 JWT 自己的唯一 id

上面这些是 JWT 协议定义的信息;

负载中还可以存放自定义的信息;

Signature

签名的作用是保证头部和负载的信息不能被篡改;

默认使用 HS256 算法进行签名;

如果对 HS256 不了解的话可以先简单的把它约等于 MD5 加盐;

HS256 需要一个 Secret ;

这个 Secret 是保存在服务器端的不可以泄露;

否则别人就可以伪造 JWT 了;

签名的方式是把 头部和负载分别 base64UrlEncode 后用 . 拼接起来使用 Secret 进行 HS256 ;

Signature = HS256(base64UrlEncode(Header) . base64UrlEncode(Payload), Secret)

PHP

Copy

我从 jwt.io 上粘贴个例子;

image.png

至此头部、负载、签名我们已经凑齐了;

我们把 base64UrlEncode 的头部和负载以及签名用 . 拼接起来就是一个 JWT 了;

JWT = base64UrlEncode(Header) . base64UrlEncode(Payload) . HS256(base64UrlEncode(Header) . base64UrlEncode(Payload), Secret)

PHP

Copy

认真观察上面这个生成 JWT 的过程;

此处一个送命题;

敲黑板画重点了;

Secret 只是用于签名;

并没有用于加密;

JWT 中的 Header 和 Payload 是使用 base64UrlEncode 进行加密的;

任何人都可以非常轻松的就使用 base64UrlDecode 进行解密;

所以虽然 Payload 中可以存储自定义的信息;

但千万不能存储敏感信息;

JWT 是由服务器端生成返回给前端的;

前端在发送请求的时候一般把 JWT 放在 HTTP Headers 中的 Authorization 字段中;

Accept: */*
Host: baijunyao.com
Authorization: Bearer JWT_xxxx
...

Bash

Copy

终于讲的差不多了;

接着来总结下 JWT 的优缺点吧;

优点

  1. 相比于 session 少了读取文件的步骤,效率更高,方便扩展
  2. 因为不使用 cookie 天生免疫 CSRF 攻击
  3. 因为不使用 cookie 不用担心用户禁用 cookie ;不用悬挂本站需要使用 cookie 的提示信息;
  4. 适合 APP 前后端分离的场景

缺点

  1. 一旦签发不能撤销 没有类似清空 session 的操作
  2. 不能自动续签

针对上面缺点的解决方案;

  1. 使用黑名单机制; 把作废的 JWT 放入黑名单; 但是这样就引入了状态; 相比 session 就没有那么大的优势了;
  2. 使用 OAuth 中的 refresh_token
目录
相关文章
|
3月前
|
XML JSON 前端开发
【Web前端揭秘】XML与JSON:数据界的双雄对决,你的选择将如何改写Web世界的未来?
【8月更文挑战第26天】本文深入探讨了XML和JSON这两种广泛使用的数据交换格式在Web前端开发中的应用。XML采用自定义标签描述数据结构,适用于复杂层次数据的表示,而JSON则以键值对形式呈现数据,更为轻量且易解析。通过对两种格式的示例代码、结构特点及应用场景的分析,本文旨在帮助读者更好地理解它们的差异,并根据实际需求选择最合适的数据交换格式。
61 1
|
4天前
|
存储 JSON 安全
如何使用 JSON Web Tokens 进行身份验证?
总的来说,JWT 是一种强大而灵活的身份验证方式,通过正确使用和管理,可以为应用提供可靠的身份验证机制,同时提高系统的可扩展性和安全性。在实际应用中,需要根据具体的需求和场景,合理设计和实施 JWT 身份验证方案。
23 8
|
8天前
|
JSON 安全 Go
Go语言中使用JWT鉴权、Token刷新完整示例,拿去直接用!
本文介绍了如何在 Go 语言中使用 Gin 框架实现 JWT 用户认证和安全保护。JWT(JSON Web Token)是一种轻量、高效的认证与授权解决方案,特别适合微服务架构。文章详细讲解了 JWT 的基本概念、结构以及如何在 Gin 中生成、解析和刷新 JWT。通过示例代码,展示了如何在实际项目中应用 JWT,确保用户身份验证和数据安全。完整代码可在 GitHub 仓库中查看。
40 1
|
2月前
|
存储 中间件 API
ThinkPHP 集成 jwt 技术 token 验证
本文介绍了在ThinkPHP框架中集成JWT技术进行token验证的流程,包括安装JWT扩展、创建Token服务类、编写中间件进行Token校验、配置路由中间件以及测试Token验证的步骤和代码示例。
ThinkPHP 集成 jwt 技术 token 验证
|
1月前
|
存储 JSON 前端开发
JSON与现代Web开发:数据交互的最佳选择
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也便于机器解析和生成。它以文本格式存储数据,常用于Web应用中的数据传输,尤其是在客户端和服务器之间。
49 0
|
2月前
|
JSON 算法 安全
Web安全-JWT认证机制安全性浅析
Web安全-JWT认证机制安全性浅析
30 2
|
2月前
|
JSON 安全 数据安全/隐私保护
从0到1搭建权限管理系统系列三 .net8 JWT创建Token并使用
【9月更文挑战第22天】在.NET 8中,从零开始搭建权限管理系统并使用JWT(JSON Web Tokens)创建Token是关键步骤。JWT是一种开放标准(RFC 7519),用于安全传输信息,由头部、载荷和签名三部分组成。首先需安装`Microsoft.AspNetCore.Authentication.JwtBearer`包,并在`Program.cs`中配置JWT服务。接着,创建一个静态方法`GenerateToken`生成包含用户名和角色的Token。最后,在控制器中使用`[Authorize]`属性验证和解析Token,从而实现身份验证和授权功能。
145 3
|
3月前
|
Java Spring 容器
彻底改变你的编程人生!揭秘 Spring 框架依赖注入的神奇魔力,让你的代码瞬间焕然一新!
【8月更文挑战第31天】本文介绍 Spring 框架中的依赖注入(DI),一种降低代码耦合度的设计模式。通过 Spring 的 DI 容器,开发者可专注业务逻辑而非依赖管理。文中详细解释了 DI 的基本概念及其实现方式,如构造器注入、字段注入与 setter 方法注入,并提供示例说明如何在实际项目中应用这些技术。通过 Spring 的 @Configuration 和 @Bean 注解,可轻松定义与管理应用中的组件及其依赖关系,实现更简洁、易维护的代码结构。
52 0
|
3月前
|
JSON Java API
解码Spring Boot与JSON的完美融合:提升你的Web开发效率,实战技巧大公开!
【8月更文挑战第29天】Spring Boot作为Java开发的轻量级框架,通过`jackson`库提供了强大的JSON处理功能,简化了Web服务和数据交互的实现。本文通过代码示例介绍如何在Spring Boot中进行JSON序列化和反序列化操作,并展示了处理复杂JSON数据及创建RESTful API的方法,帮助开发者提高效率和应用性能。
160 0
|
3月前
|
API
【Azure Developer】记录一段验证AAD JWT Token时需要设置代理获取openid-configuration内容
【Azure Developer】记录一段验证AAD JWT Token时需要设置代理获取openid-configuration内容
下一篇
无影云桌面