文章目录

  • 一、JWT是什么
  • 二、跨域认证问题
  • 三、JWT原理
  • 四、JWT数据结构
    • 1、header(头部)
    • 2、Payload(负载)
    • 3、Signature
  • 五、JWT是如何工作的

一、JWT是什么

JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。

二、跨域认证问题

互联网服务离不开用户认证,一般流程如下:

  1. 用户向服务器发送用户名和密码。
  2. 服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色、登录时间等等。
  3. 服务器向用户返回一个 session_id,写入用户的 Cookie。
  4. 用户随后的每一次请求,都会通过 Cookie,将 session_id 传回服务器。
  5. 服务器收到 session_id,找到前期保存的数据,由此得知用户的身份。

这种模式的问题在于,扩展性(scaling)不好。单机当然没有问题,如果是服务器集群,或者是跨域的服务导向架构,就要求 session 数据共享,每台服务器都能够读取 session。

一种解决方案是 session 数据持久化,写入数据库或别的持久层。各种服务收到请求后,都向持久层请求数据。这种方案的优点是架构清晰,缺点是工程量比较大。另外,持久层万一挂了,就会单点失败。

另一种方案是服务器索性不保存 session 数据了,所有数据都保存在客户端,每次请求都发回服务器。JWT 就是这种方案的一个代表。

三、JWT原理

JWT原理,服务器认证以后,生成一个 JSON 对象,发回给用户,就像下面这样

{"姓名": "张三","角色": "管理员","到期时间": "2018年7月1日0点0分"
}

以后,用户与服务端通信的时候,都要发回这个 JSON 对象。服务器完全只靠这个对象认定用户身份。为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名(详见后文)。

服务器就不保存任何 session 数据了,也就是说,服务器变成无状态了,从而比较容易实现扩展。

四、JWT数据结构

实际返回给前端JWT数据结构是这样

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6I kpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7Hg Q

是一个很长的字符串,中间以(.)分割。注意JWT没有换行的

JWT三部分如下:

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

1、header(头部)

header典型的由两部分组成:token的类型(“JWT”)和算法名称(比如:HMAC SHA256或者RSA等等)。


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

然后,用Base64对这个JSON编码就得到JWT的第一部分

2、Payload(负载)

JWT的第二部分是payload,它包含声明(要求)。声明是关于实体(通常是用户)和其他数据的声明。声明有三种类型: registered, public 和private

  • Registered claims : 这里有一组预定义的声明,它们不是强制的,但是推荐。比如:iss (issuer), exp (expiration time), sub (subject), aud (audience)等。
  • Public claims : 可以随意定义。
  • Private claims : 用于在同意使用它们的各方之间共享信息,并且不是注册的或公开的声明。
    官方给了7个字段供选用
iss (issuer):签发人
exp (expiration time):过期时间
sub (subject):主题
aud (audience):受众
nbf (Not Before):生效时间
iat (Issued At):签发时间
jti (JWT ID):编号

除了官方字段,你还可以在这个部分定义私有字段,下面就是一个例子。

{"sub": "1234567890","name": "John Doe","admin": true
}

注意,不要在JWT的payload或header中放置敏感信息,除非它们是加密的。

3、Signature

Signature 部分是对前两部分的签名,防止数据篡改。

首先,需要指定一个密钥(secret)。这个密钥只有服务器才知道,不能泄露给用户。然后,使用 Header 里面指定的签名算法(默认是 HMAC SHA256),按照下面的公式产生签名。
看一张官网的图就明白了:

五、JWT是如何工作的

在认证的时候,当用户用他们的凭证成功登录以后,一个JSON Web Token将会被返回。此后,token就是用户凭证了,你必须非常小心以防止出现安全问题。一般而言,你保存令牌的时候不应该超过你所需要它的时间。

无论何时用户想要访问受保护的路由或者资源的时候,用户代理(通常是浏览器)都应该带上JWT,典型的,通常放在Authorization header中,用Bearer schema。

header应该看起来是这样的:

Authorization: Bearer

服务器上的受保护的路由将会检查Authorization header中的JWT是否有效,如果有效,则用户可以访问受保护的资源。如果JWT包含足够多的必需的数据,那么就可以减少对某些操作的数据库查询的需要,尽管可能并不总是如此。

如果token是在授权头(Authorization header)中发送的,那么跨源资源共享(CORS)将不会成为问题,因为它不使用cookie。

鸣谢:
http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html https://www.cnblogs.com/cjsblog/p/9277677.html

JWT(JSON Web Token)简介相关推荐

  1. JWT(JSON Web Token)简介及实现

    JWT(JSON Web Token):是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间作为Json对象安全地传输信息.由于此信息是经过数字签名的,因此可以被验证和信 ...

  2. JWT (Json Web Token)教程

    JWT(Json Web Token)是实现token技术的一种解决方案,JWT由三部分组成: header(头).payload(载体).signature(签名). 头 JWT第一部分是heade ...

  3. JWT(JSON web token)

    1.什么是JWT JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact and self-contain ...

  4. 关于JWT(Json Web Token)的思考及使用心得

    什么是JWT? JWT(Json Web Token)是一个开放的数据交换验证标准rfc7519(php 后端实现JWT认证方法一般用来做轻量级的API鉴权.由于许多API接口设计是遵循无状态的(比如 ...

  5. jwt token 过期刷新_如何在SpringBoot中集成JWT(JSON Web Token)鉴权

    这篇博客主要是简单介绍了一下什么是JWT,以及如何在Spring Boot项目中使用JWT(JSON Web Token). 1.关于JWT 1.1 什么是JWT 老生常谈的开头,我们要用这样一种工具 ...

  6. 关于JWT(Json Web Token)的思考及使用心得 1

    什么是JWT? JWT(Json Web Token)是一个开放的数据交换验证标准rfc7519(https://tools.ietf.org/html/r...,一般用来做轻量级的API鉴权.由于许 ...

  7. sau交流学习社区-songEagle开发系列:Vue + Vuex + Koa 中使用JWT(JSON Web Token)认证

    一.前言 JWT(JSON Web Token),是为了在网络环境间传递声明而执行的一种基于JSON的开放标准(RFC 7519). JWT不是一个新鲜的东西,网上相关的介绍已经非常多了.不是很了解的 ...

  8. 什么是 JWT -- JSON WEB TOKEN

    什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点 ...

  9. 登录令牌JWT — JSON WEB TOKEN

    登录令牌JWT - JSON WEB TOKEN 关于作者 作者介绍

最新文章

  1. python爬虫学习第一章
  2. linux网络方面命令大全,Linux下必须知道的11个网络命令
  3. 安卓获取手机路径方法
  4. 第九章 OGRE中的整个流程
  5. Java的IO操作中关闭流的注意点
  6. windows 远程桌面mstsc的问题
  7. 如何用3D Max进行三维建模
  8. AVOD阅读笔记(一):摘要+特征提取----Aggregate View Obeject Detection network
  9. 小学语文思维导图免费模板合集!家长必收藏
  10. python电化学cv曲线怎么画_cv曲线(电化学cv曲线分析)
  11. zabbix清除历史数据
  12. 加密勒索病毒:诞生、忽视以及爆炸式增长
  13. python123 第四次作业_第四次作业
  14. linux下安装python3报错_Linux中安装python3
  15. 16进制格式的字符串怎样转换为整数
  16. Java字符串格式化详解
  17. 汉画轩深度结合区块链技术 让国学真正活起来
  18. 【打卡】21天学习挑战赛—RK3399平台开发入门到精通-day9
  19. 嫁给程序员原来还有这福利,难怪有些女孩子找对象专门找程序员
  20. 2020-04-22

热门文章

  1. wxWidgets随笔(5)-utf8中文(1)
  2. 【NLP】bert4vec:一个基于预训练的句向量生成工具
  3. 【Python】图解Pandas数据合并:concat、join、append
  4. 【NLP】国内实力雄厚的自然语言处理(NLP)研究组
  5. 【深度学习】引用次数在15000次以上的都是什么神仙论文?
  6. 【学术相关】2020年AI领域有哪些让人惊艳的研究?
  7. 励志:读书七年,为了挣钱,我竭尽全力
  8. AI基础:Pandas简易入门
  9. 视频智能去水印:从数学建模到工程实现
  10. 产品经理和UX设计师,变革已可期