什么是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
目录
相关文章
|
XML JSON 前端开发
【Web前端揭秘】XML与JSON:数据界的双雄对决,你的选择将如何改写Web世界的未来?
【8月更文挑战第26天】本文深入探讨了XML和JSON这两种广泛使用的数据交换格式在Web前端开发中的应用。XML采用自定义标签描述数据结构,适用于复杂层次数据的表示,而JSON则以键值对形式呈现数据,更为轻量且易解析。通过对两种格式的示例代码、结构特点及应用场景的分析,本文旨在帮助读者更好地理解它们的差异,并根据实际需求选择最合适的数据交换格式。
267 1
|
存储 JSON 安全
如何使用 JSON Web Tokens 进行身份验证?
总的来说,JWT 是一种强大而灵活的身份验证方式,通过正确使用和管理,可以为应用提供可靠的身份验证机制,同时提高系统的可扩展性和安全性。在实际应用中,需要根据具体的需求和场景,合理设计和实施 JWT 身份验证方案。
379 63
|
存储 JSON 前端开发
JSON与现代Web开发:数据交互的最佳选择
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也便于机器解析和生成。它以文本格式存储数据,常用于Web应用中的数据传输,尤其是在客户端和服务器之间。
816 1
|
Java Spring 容器
彻底改变你的编程人生!揭秘 Spring 框架依赖注入的神奇魔力,让你的代码瞬间焕然一新!
【8月更文挑战第31天】本文介绍 Spring 框架中的依赖注入(DI),一种降低代码耦合度的设计模式。通过 Spring 的 DI 容器,开发者可专注业务逻辑而非依赖管理。文中详细解释了 DI 的基本概念及其实现方式,如构造器注入、字段注入与 setter 方法注入,并提供示例说明如何在实际项目中应用这些技术。通过 Spring 的 @Configuration 和 @Bean 注解,可轻松定义与管理应用中的组件及其依赖关系,实现更简洁、易维护的代码结构。
332 0
|
JSON Java API
解码Spring Boot与JSON的完美融合:提升你的Web开发效率,实战技巧大公开!
【8月更文挑战第29天】Spring Boot作为Java开发的轻量级框架,通过`jackson`库提供了强大的JSON处理功能,简化了Web服务和数据交互的实现。本文通过代码示例介绍如何在Spring Boot中进行JSON序列化和反序列化操作,并展示了处理复杂JSON数据及创建RESTful API的方法,帮助开发者提高效率和应用性能。
729 0
|
JSON Java API
【Azure Developer】如何验证 Azure AD的JWT Token (JSON Web 令牌)?
【Azure Developer】如何验证 Azure AD的JWT Token (JSON Web 令牌)?
429 0
|
3月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
291 4
|
7月前
|
缓存 JavaScript 前端开发
鸿蒙5开发宝藏案例分享---Web开发优化案例分享
本文深入解读鸿蒙官方文档中的 `ArkWeb` 性能优化技巧,从预启动进程到预渲染,涵盖预下载、预连接、预取POST等八大优化策略。通过代码示例详解如何提升Web页面加载速度,助你打造流畅的HarmonyOS应用体验。内容实用,按需选用,让H5页面快到飞起!
|
7月前
|
JavaScript 前端开发 API
鸿蒙5开发宝藏案例分享---Web加载时延优化解析
本文深入解析了鸿蒙开发中Web加载完成时延的优化技巧,结合官方案例与实际代码,助你提升性能。核心内容包括:使用DevEco Profiler和DevTools定位瓶颈、四大优化方向(资源合并、接口预取、图片懒加载、任务拆解)及高频手段总结。同时提供性能优化黄金准则,如首屏资源控制在300KB内、关键接口响应≤200ms等,帮助开发者实现丝般流畅体验。
|
前端开发 JavaScript Shell
鸿蒙5开发宝藏案例分享---Web页面内点击响应时延分析
本文为鸿蒙开发者整理了Web性能优化的实战案例解析,结合官方文档深度扩展。内容涵盖点击响应时延核心指标(≤100ms)、性能分析工具链(如DevTools时间线、ArkUI Trace抓取)以及高频优化场景,包括递归函数优化、网络请求阻塞解决方案和setTimeout滥用问题等。同时提供进阶技巧,如首帧加速、透明动画陷阱规避及Web组件初始化加速,并通过优化前后Trace对比展示成果。最后总结了快速定位问题的方法与开发建议,助力开发者提升Web应用性能。