JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案。
传统的session认证http协议本身是一种无状态的协议,而这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证,那么下一次请求时,用户还要再一次进行用户认证才行,因为根据http协议,我们并不能知道是哪个用户发出的请求,所以为了让我们的应用能识别是哪个用户发出的请求,我们只能在服务器存储一份用户登录的信息,这份登录信息会在响应时传递给浏览器,告诉其保存为cookie,以便下次请求时发送给我们的应用,这样我们的应用就能识别请求来自哪个用户了,这就是传统的基于session认证。
(资料图)
这种基于session的认证使应用本身很难得到扩展,随着不同客户端用户的增加,独立的服务器已无法承载更多的用户,而这时候基于session认证应用的问题就会暴露出来.
基于session认证所显露的问题Session: 每个用户经过我们的应用认证之后,我们的应用都要在服务端做一次记录,以方便用户下次请求的鉴别,通常而言session都是保存在内存中,而随着认证用户的增多,服务端的开销会明显增大。
扩展性: 用户认证之后,服务端做认证记录,如果认证的记录被保存在内存中的话,这意味着用户下次请求还必须要请求在这台服务器上,这样才能拿到授权的资源,这样在分布式的应用上,相应的限制了负载均衡器的能力。这也意味着限制了应用的扩展能力。
CSRF: 因为是基于cookie来进行用户识别的, cookie如果被截获,用户就会很容易受到跨站请求伪造的攻击。
基于token的鉴权机制最全面的Java面试网站
基于token的鉴权机制类似于http协议也是无状态的,它不需要在服务端去保留用户的认证信息或者会话信息。这就意味着基于token认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利。
流程上是这样的:
用户使用用户名密码来请求服务器服务器进行验证用户的信息服务器通过验证发送给用户一个token客户端存储token,并在每次请求时附送上这个token值服务端验证token值,并返回数据这个token必须要在每次请求时传递给服务端,它应该保存在请求头里, 另外,服务端要支持CORS(跨来源资源共享)
策略,一般我们在服务端这么做就可以了Access-Control-Allow-Origin: *
。
JWT是由三段信息构成的,将这三段信息文本用.
链接一起就构成了Jwt字符串。就像这样:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW
JWT的构成第一部分我们称它为头部(header),第二部分我们称其为载荷(payload, 类似于飞机上承载的物品),第三部分是签证(signature).
headerjwt的头部承载两部分信息:
声明类型,这里是jwt声明加密的算法 通常直接使用 HMAC SHA256完整的头部就像下面这样的JSON:
{ "typ": "JWT", "alg": "HS256"}
然后将头部进行base64加密(该加密是可以对称解密的),构成了第一部分.
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
playload载荷就是存放有效信息的地方。这个名字像是特指飞机上承载的货品,这些有效信息包含三个部分
标准中注册的声明公共的声明私有的声明标准中注册的声明(建议但不强制使用) :
iss: jwt签发者sub: jwt所面向的用户aud: 接收jwt的一方exp: jwt的过期时间,这个过期时间必须要大于签发时间nbf: 定义在什么时间之前,该jwt都是不可用的.iat: jwt的签发时间jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。公共的声明:公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息.但不建议添加敏感信息,因为该部分在客户端可解密.
私有的声明:私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64是对称解密的,意味着该部分信息可以归类为明文信息。
定义一个payload:
{ "sub": "1234567890", "name": "John Doe", "admin": true}
然后将其进行base64加密,得到Jwt的第二部分。
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9
signature最全面的Java面试网站
jwt的第三部分是一个签证信息,这个签证信息由三部分组成:
header (base64后的)payload (base64后的)secret这个部分需要base64加密后的header和base64加密后的payload使用.
连接组成的字符串,然后通过header中声明的加密方式进行加盐secret
组合加密,然后就构成了jwt的第三部分。
// javascriptvar encodedString = base64UrlEncode(header) + "." + base64UrlEncode(payload);var signature = HMACSHA256(encodedString, "secret"); // TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
将这三部分用.
连接成一个完整的字符串,构成了最终的jwt:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
注意:secret是保存在服务器端的,jwt的签发生成也是在服务器端的,secret就是用来进行jwt的签发和jwt的验证,所以,它就是你服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了。
如何应用一般是在请求头里加入Authorization
,并加上Bearer
标注:
fetch("api/user/1", { headers: { "Authorization": "Bearer " + token }})
服务端会验证token,如果验证通过就会返回相应的资源。整个流程就是这样的:
总结优点因为json的通用性,所以JWT是可以进行跨语言支持的,像JAVA,JavaScript,NodeJS,PHP等很多语言都可以使用。因为有了payload部分,所以JWT可以在自身存储一些其他业务逻辑所必要的非敏感信息。便于传输,jwt的构成非常简单,字节占用很小,所以它是非常便于传输的。它不需要在服务端保存会话信息, 所以它易于应用的扩展安全相关不应该在jwt的payload部分存放敏感信息,因为该部分是客户端可解密的部分。保护好secret私钥,该私钥非常重要。如果可以,请使用https协议最后给大家分享一个Github仓库,上面有大彬整理的300多本经典的计算机书籍PDF,包括C语言、C++、Java、Python、前端、数据库、操作系统、计算机网络、数据结构和算法、机器学习、编程人生等,可以star一下,下次找书直接在上面搜索,仓库持续更新中~
Github地址
JSONWebToken(缩写JWT)是目前最流行的跨域认证解决方案。传统的se...
去年以来,在系列因素推动下,市场上“物美价廉”的贷款产品悄然增...
合作并购合同范本第1篇甲方:乙方:甲乙双方为公司并购一事,协议如...
古有“月下惊鸿影,疑是画中仙”、“俏丽若三春之桃,清素若九秋之...
观点网讯:3月29日,观点新媒体获悉,陕西西安高陵区2宗120 7亩住...
基于天猫开发的原创女装品牌,是一个极具网络影响力的独立设计品牌...
王珂迩,关于王珂迩介绍这个很多人还不知道,我们一起来看看!1、王...
IT之家3月29日消息,Mozilla员工MikeKaply在最新回帖中表示,火狐浏...
1、利税中的利是利润的意思税也是所交纳的税金了很好理解的!`一般利...
美媒:拜登承认无力在没有国会支持下应对枪支暴力“我已充分行使了...
今日知名美媒TheAthletic给出了最新一期的模拟选秀名单,文班亚马、...
在阜平,机动车注册登记这样办理:办理方式★窗口办理所需材料★机...
13类产品顾客满意度调查结果发布电热水器满意度得分最高
股票按照不同的分类标准可以分为很多种类型,比如有些股票被纳入风 ">
NBA常规赛奇才130-111大胜凯尔特人。本场比赛,奇才内线波尔津吉斯...
玉石的鉴别方法:1、观察玉石,真的玉石透明度很强;2、听玉石的声音...
28日晚,北京丰台公安分局@平安北京丰台发布情况通报称,针对网传...
课程蔚❤搜文若课堂、《了不起的大唐文明史》是中国历史学家于赓哲...
国泰君安03月28日发布研报标题为《2022年报点评:不良率降幅超预期...
在今晚的WeGame游戏之夜上,腾讯公布了《无畏契约》的新情报,预约...
格隆汇3月28日丨古鳌科技(300551)(300551 SZ)公布,截至2023年3月2...
碎石订购合同范本第1篇供方:需方:由于莞惠城际轨道工程施工的需要...
为深入推进生态文明建设,促进德州市建设国家文明城市和生态园林城...
三言科技3月28日消息,富途发布2022年第四季度及全年未经审计财报。...
免费坐高铁 登上微博热搜。用户登陆12306应用程序,注册会员可以...
《在美留学生自驾车事故频发,留学谨记安全第一!附驾车时要特别注...
【年内A股再融资规模超2400亿元】2023年以来,A股定增活跃,带动再...
1、忙忙碌碌,不乱脚步,周一做事要稳当,唠唠叨叨,不乱心情,周一...
【网信办:将会同相关部门对青少年沉迷短视频问题进行专项治理】国...
1、“卷死他们”是指当代大学生声称要...