0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是JWT?JWT由哪些部分组成?JWT如何进行用户认证?

jf_uPRfTJDa 来源:移动Labs 2024-02-25 09:44 次阅读

Part 01

JWT是什么?

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

Part 02

JWT由哪些部分组成?

e8d79734-d300-11ee-a297-92fbcf53809c.png

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

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

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

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

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

示例:

e8eba49a-d300-11ee-a297-92fbcf53809c.png

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

e8ff6f7a-d300-11ee-a297-92fbcf53809c.png

Header

通常由两部分组成。

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

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

示例:

e93eb630-d300-11ee-a297-92fbcf53809c.png

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唯一标识。

示例:

e955c4ce-d300-11ee-a297-92fbcf53809c.png

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

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

Signature

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

e966ddae-d300-11ee-a297-92fbcf53809c.png

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

Part 03

JWT如何进行用户认证?

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

e995c51a-d300-11ee-a297-92fbcf53809c.png

简化后的步骤如下:

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配置中心程序员不需要每次更改线上配置都要重新发布服务,成功实现了将配置与编码解耦,为线上服务变更配置提供了解决方案。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • HTTP
    +关注

    关注

    0

    文章

    505

    浏览量

    31218
  • 密钥
    +关注

    关注

    1

    文章

    138

    浏览量

    19757
  • JSON
    +关注

    关注

    0

    文章

    117

    浏览量

    6964

原文标题:技术 | 什么是JWT?一文读懂

文章出处:【微信号:5G通信,微信公众号:5G通信】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    jw和e^jwt的一些理解

    转昨晚看到《电磁场与电磁波》时变电磁场一章,书中又一次出现了jw和e^jwt,之前一直无法理解诸如为什么电感的阻抗可以表示成jwL之类的问题,jw是从哪里推导出来的呢?为什么可以直接与L相乘呢?
    发表于 05-23 07:39

    开发人员和嵌入式系统设计人员如何使用JWT关闭物联网设备的安全漏洞?

    本文将介绍物联网设备安全威胁,并介绍目前用于应对该威胁的设备。它将确定安全漏洞以及开发人员和嵌入式系统设计人员如何使用JWT关闭它们。
    发表于 06-16 06:17

    SpringBoot 学习笔记

    SpringBoot 学习笔记 【整合JWT】添加依赖创建工具类登录获取jwt使用jwtDemo源码参考资料添加依赖pom.xml...com.auth0java-jwt3.12.0
    发表于 07-01 07:27

    CT107开发板是哪些部分组成的?

    CT107开发板是哪些部分组成的?74HC138和74HC573是如何使用的?DS1302和DS18B20是如何进行接线的?
    发表于 07-26 07:43

    Json Web Token是什么?有哪些应用呢

    和payload编码和拼接后经过加密算法加密,加密时还要一个密码,这个密码保存在服务器端。大致示意图如下:Header:head部分组成,一个是token类型,一个是使用的算法,如下类型为jwt
    发表于 10-18 14:34

    JWT-II智能测量系统使用说明书

    JWT-II智能测量系统使用说明书
    发表于 07-31 17:07 3次下载

    如何才能保证JWT安全

    jwt是什么? JWTs是JSON对象的编码表示。JSON对象零或多个名称/值对组成,其中名称为字符串,值为任意JSON值。JWT有助于在clear(例如在URL中)发送这样的信息,
    的头像 发表于 09-29 15:09 3316次阅读

    MicroProfile JWT Auth MicroProfile的JWT RBAC规范

    microprofile-jwt-auth.zip
    发表于 05-07 10:04 0次下载
    MicroProfile <b class='flag-5'>JWT</b> Auth MicroProfile的<b class='flag-5'>JWT</b> RBAC规范

    jwt-auth基于ThinkPHP的jwt框架

    ./oschina_soft/gitee-jwt-auth.zip
    发表于 06-30 09:10 1次下载
    <b class='flag-5'>jwt</b>-auth基于ThinkPHP的<b class='flag-5'>jwt</b>框架

    为何JWT不适合存储Session

    很多人错误地尝试比较 Cookies 和 JWT。这种对比毫无意义,就像对比内存和硬盘一样。Cookies 是一种存储机制,然而 JWT Tokens 是被加密并签名后的令牌。
    的头像 发表于 11-28 10:23 599次阅读

    JJWT是什么?如何保证 JWT 安全

    JJWT是一个提供端到端的JWT创建和验证的Java库。永远免费和开源(Apache License,版本2.0),JJWT很容易使用和理解。它被设计成一个以建筑为中心的流畅界面,隐藏了它的大部分复杂性。
    发表于 03-03 15:12 1059次阅读

    jwt冒泡排序的原理

    jwt简介 冒泡排序: (Bubble Sort)是一种简单的交换排序。之所以叫做冒泡排序,因为我们可以把每个元素当成一个小气泡,根据气泡大小,一步一步移动到队伍的一端,最后形成一定对的顺序。 冒泡
    的头像 发表于 09-25 16:33 545次阅读
    <b class='flag-5'>jwt</b>冒泡排序的原理

    JWT认证流程

    间传递被认证用户身份信息,以便于从资源服务器获取资源。 基于token的鉴权机制 基于token的鉴权机制类似于http协议也是无状态的,它不需要在服务端去保留用户认证信息或者会话
    的头像 发表于 10-08 15:01 1267次阅读
    <b class='flag-5'>JWT</b>的<b class='flag-5'>认证</b>流程

    后端JWT接口认证的操作流程

    流程 2. JWT 介绍 JWT 全称为 JSON Web Token,是目前主流的跨域认证解决方案 数据结构 3 部分组成,中间
    的头像 发表于 10-31 11:20 720次阅读

    JWT渗透姿势一篇通

    Signature是使用指定算法对Header和Payload进行签名生成的,用于验证JWT的完整性和真实性,Signature的生成方式通常是将Header和Payload连接起来然后使用指定算法对其进行签名
    的头像 发表于 11-13 16:04 1047次阅读
    <b class='flag-5'>JWT</b>渗透姿势一篇通