加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
    • Part 01●  JWT是什么? ●
    • Part 02●  JWT由哪些部分组成? ●
    • Part 03●  JWT如何进行用户认证? ●
    • Part 04● JWT如何防止被篡改? ●
    • Part 05●  JWT如何加强安全性? ●
    • Part 06●  JWT有哪些优缺点? ●
    • Part 07●  JWT使用总结 ●
  • 推荐器件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

五分钟技术趣谈 | 一文读懂JWT

2023/12/25
2349
阅读需 11 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

作者:杨强,单位:中国移动智慧家庭运营中心成都业务支持中心

我们在做应用系统时避免不了用户的认证授权,说简单点就是:认证你是谁,授权你有什么权限。在这里先来谈谈用户的认证,目前常用的认证方式有两种:基于session认证、基于token认证。而JWT(JSON Web Token)是目前最流行的跨域认证解决方案,是一种基于Token的认证授权机制。此外JWT还被广发应用于单点登陆及信息交换。

Part 01●  JWT是什么? 

JWT(JSON Web Token)是一个开放的行业标准(RFC 7519),自身包含了身份验证所需要的所有信息,因此我们的服务器不需要存储用户Session信息。这显然增加了系统的可用性和伸缩性,大大减轻了服务端的压力。可以看出JWT更符合设计RESTful API时的Stateless(无状态)原则。并且使用JWT认证可以有效避免CSRF攻击,因为JWT一般是存在在localStorage中,使用JWT进行身份验证的过程中是不会涉及到Cookie的。

Part 02●  JWT由哪些部分组成? 

JWT本质上是一组字串,通常是这样的:xxxxx.yyyyy.zzzzz,通过(.)切分成三个为Base64编码的部分:

Header:描述JWT的元数据,定义了生成签名的算法以及Token的类型。

Payload:用来存放实际需要传递的数据。

Signature:服务器通过Payload、Header和一个密钥(Secret)

使用Header里面指定的签名算法(默认是 HMAC SHA256)生成。

示例:

可以通过https://jwt.io对上述JWT进行解码,解码之后便可得到Header、Payload、Signature这三部分。Header和Payload都是JSON格式的数据,Signature由Payload、Header和Secret(密钥)通过特定的计算公式和加密算法得到。

Header

通常由两部分组成。

typ(Type):令牌类型,也就是JWT

alg(Algorithm):签名算法,比如HS256

示例:

JSON形式的Header被转换成Base64编码,成为JWT的第一部。

Payload

包含了三种类型的声明。

Registered Claims(注册声明):预定义的一些声明,建议使用,但不强制。

Public Claims(公有声明):JWT签发方可以自定义的声明。

Private Claims(私有声明):JWT签发方因为项目需要而自定义的声明。

下面是一些常见的注册声明:

iss(issuer):JWT 签发方。

iat(issued at time):JWT签发时间。

sub(subject):JWT主题。

aud(audience):JWT接收方。

exp(expiration time):JWT的过期时间。

nbf(not before time):JWT生效时间,早于该定义的时间的JWT不能被接受处理。

jti(JWT ID):JWT唯一标识。

示例:

Payload部分默认是不加密的,一定不要将隐私信息存放在 Payload 当中!!!

JSON 形式的Payload被转换成Base64编码,成为JWT的第二部分。

Signature

对前两部分的签名,作用是防止JWT(主要是payload)被篡改。签名的生成需要用到:Header+Payload、存放在服务端的密钥(一定不要泄露出去)、签名算法。签名的计算公式如下:

算出签名以后,把 Header、Payload、Signature三个部分拼成一个字符串,每个部分之间用"点"(.)分隔,这个字符串就是JWT。

Part 03●  JWT如何进行用户认证? 

在基于JWT进行身份验证的的应用程序中,服务器通过 Payload、Header和Secret(密钥)创建JWT并将JWT发送给客户端。客户端接收到JWT之后,会将其保存在Cookie或者localStorage里面,以后客户端发出的所有请求都会携带这个令牌。

简化后的步骤如下:

1.用户向服务器发送用户名、密码以及验证码用于登陆系统。

2.如果用户用户名、密码以及验证码校验正确的话,服务端会返回已签名的Token,也就是JWT。

3.用户以后每次向后端发请求都在Header中带上这个JWT。

4.服务端检查JWT并从中获取用户相关信息。

两点建议:

1.建议将JWT存放在localStorage中,放在Cookie中会有CSRF风险。

2.请求服务端并携带JWT的常见做法是将其放在HTTP Header的Authorization字段中(Authorization:Bearer Token)

Part 04● JWT如何防止被篡改? 

服务器返回签名之后,即使JWT被泄露或者截获,黑客也没办法同时篡改Signature、Header、Payload。

这是为什么呢?因为服务端拿到JWT之后,会解析出其中包含的Header、Payload 以及Signature。服务端会根据Header、Payload、密钥再次生成一个Signature。拿新生成的Signature和JWT中的Signature作对比,如果一样就说明Header和Payload没有被修改。

不过,如果服务端的秘钥也被泄露的话,黑客就可以同时篡改Signature、Header、Payload了。黑客直接修改了Header和Payload之后,再重新生成一个Signature就可以了。

❖注意:密钥一定保管好,一定不要泄露出去。JWT安全的核心在于签名,签名安全的核心在密钥。

Part 05●  JWT如何加强安全性? 

1.使用安全系数高的加密算法。

2.使用成熟的开源库,没必要造轮子。

3.JWT存放在localStorage中而不是Cookie中,避免CSRF风险。

4.一定不要将隐私信息存放在Payload当中。

5.密钥一定保管好,一定不要泄露出去。JWT安全的核心在于签名,签名安全的核心在密钥。

6.Payload要加入exp(JWT的过期时间),永久有效的JWT不合理。并且JWT的过期时间不易过长。

Part 06●  JWT有哪些优缺点? 

- 优点

1.无状态:自身携带用户信息,不需要在服务器上保存session信息。

2.可有效避免CSRF攻击:CSRF攻击需要依赖Cookie,然而JWT选择存放在localStorage中,因此非法链接无法获取JWT。

- 缺点

1.不可控:就比如说,我们想要在JWT有效期内废弃一个JWT或者更改它的权限的话,并不会立即生效,通常需要等到有效期过后才可以。再比如说,当用户Logout的话,JWT也还有效。

Part 07●  JWT使用总结 

在“约定优于配置,配置优于编码”的开发理念下,通过Apollo配置中心,程序员不需要每次更改线上配置都要重新发布服务,成功实现了将配置与编码解耦,为线上服务变更配置提供了解决方案。

参考文献

[1] https://jwt.io/,2023年09月12日.

[2]  https://www.iana.org/assignments/jwt/jwt.xhtml,2023年09月12日.

[3] https://zhuanlan.zhihu.com/p/598529592,2023年09月12日.

[4] https://zhuanlan.zhihu.com/p/86937325,2023年09月13日.

推荐器件

更多器件
器件型号 数量 器件厂商 器件描述 数据手册 ECAD模型 风险等级 参考价格 更多信息
KSZ8081MLXIA 1 Microchip Technology Inc DATACOM, ETHERNET TRANSCEIVER, PQFP48

ECAD模型

下载ECAD模型
$1.86 查看
CC430F5137IRGZ 1 Texas Instruments 16-Bit ultra-low-power CC430 Sub 1 GHz wireless MCU with 12-Bit ADC, 32kB Flash and 4kB RAM 48-VQFN -40 to 85

ECAD模型

下载ECAD模型
$7.53 查看
M82520-14 1 MACOM Telecom IC,
暂无数据 查看
中国移动

中国移动

中国移动有限公司(「本公司」,包括子公司合称为「本集团」)于1997年9月3日在香港成立,本集团在中国内地所有三十一个省、自治区、直辖市以及香港特别行政区提供通信和信息服务,业务主要涵盖个人、家庭、政企和新兴市场的语音、数据、宽带、专线、IDC、云计算、物联网等,是中国内地最大的通信和信息服务供应商,亦是全球网络和客户规模最大、盈利能力领先、市值排名位居前列的世界级通信和信息运营商。

中国移动有限公司(「本公司」,包括子公司合称为「本集团」)于1997年9月3日在香港成立,本集团在中国内地所有三十一个省、自治区、直辖市以及香港特别行政区提供通信和信息服务,业务主要涵盖个人、家庭、政企和新兴市场的语音、数据、宽带、专线、IDC、云计算、物联网等,是中国内地最大的通信和信息服务供应商,亦是全球网络和客户规模最大、盈利能力领先、市值排名位居前列的世界级通信和信息运营商。收起

查看更多

相关推荐

电子产业图谱

移动Labs是中国移动的社交化新媒体平台,是面向外部行业及产业链合作伙伴的信息发布、业务发展和产业推进门户。