JSON Web Token 简介
1. 跨域认证的问题
一般流程
- 用户向服务器发送用户名和密码。
- 服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色、登录时间等等。
- 服务器向用户返回一个 session_id,写入用户的 Cookie。
- 用户随后的每一次请求,都会通过 Cookie,将 session_id 传回服务器。
- 服务器收到 session_id,找到前期保存的数据,由此得知用户的身份。
问题:扩展性(scaling)不好。单机没有问题,如果是服务器集群,或者是跨域的服务导向架构,就要求 session 数据共享,每台服务器都能够读取 session(例如,A 网站和 B 网站是同一家公司的关联服务。现在要求,用户只要在其中一个网站登录,再访问另一个网站就会自动登录,请问怎么实现?)
解决方案1:session 数据持久化,写入数据库或别的持久层。各种服务收到请求后,都向持久层请求数据。这种方案的优点是架构清晰,缺点是工程量比较大。另外,持久层万一挂了,就会单点失败
解决方案2:服务器不保存 session 数据,所有数据都保存在客户端,每次请求都发回服务器,也就是 Token
2. Token 工作流程
- 登陆时,客户端发送用户名密码
- 服务端验证用户名密码是否正确,校验通过就会生成一个有时效的 token,发送给客户端
- 客户端储存 token,一般都会存储在
localStorage
或者cookie
里面 - 客户端每次请求时都带有 token,可以将其放在请求头里,每次请求都携带 token
- 服务端验证 token,所有需要校验身份的接口都会被校验 token,若 token 解析后的数据包含用户身份信息,则身份验证通过,返回数据
客户端获取到 token 后,可以存储在 Cookie
,也可以存储在 localStorage
此后,客户端每次与服务器通信,都要带上这个 JWT。你可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP 请求的头信息 Authorization
字段里面。
Authorization: Bearer <token>
另一种做法是,跨域的时候,JWT 就放在 POST 请求的数据体里面。
3. JsonWebToken(JWT)
官方手册
3.1 JWT 生成的 Token 格式
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.
eyJkYXRhIjoiNWM5Yzk2NGUyMjE3YzIzM2I1ZjQ0YWVmIiwiZXhwIjoxNTU1MTM1OTc3LCJpYXQiOjE1NTQ4NzY3Nzd9.
osPAb7eywjEAs4qfRobC5fstM5eHAxgTYGV7Q0W8YOt8dxv2VP2S8Y7q3eW66AViDHRrFgFIlRunighlrmC9XtUTnotXCTuWEg288Bx_RjP_pAuj0eQiiWEeFvYeUZX8OR51x2JB1AUGXbLv5853HFYdiluoJIe8ADGneYRaLIfCegTSoq7RtDumfn8U11e8WBIhDjYobGFaFqNBzYaW0fA52oQglJjq5vr8RoVcVgA9LufE4CEA5yB24b0xln9Wf6ul7ZKSQDciNKDJr_QKKj5isFGZU3NMM7u3DEG7EeAtIhUzLbQJ1hSUNymc7WwqF7L1QjaiDkOlGlbVg
生成的 Token 是一个很长的字符串,由 .
分割为三段(此处为了方便展示分段展示,实际是一行的)
这三段字符串其实原本都是 JSON
对象,然后通过 Base64URL
算法生成的,接下来来简单介绍这三段的含义
3.1.1 Header(头部)
存储 JWT 的元数据,与生成 Token API jwt.sign(payload, secretOrPrivateKey, [options, callback])
中的 options
对应
3.1.2 Payload(负载数据)
存放需要实际传递的数据,官方定义了7个官方字段
- iss (issuer):签发人
- exp (expiration time):过期时间
- sub (subject):主题
- aud (audience):受众
- nbf (Not Before):生效时间
- iat (Issued At):签发时间
- jti (JWT ID):编号
此外,可以定义一些自定义的字段,方便存储数据
3.1.3 Signature(签名)
是对前两部分的签名,防止数据篡改
首先,需要指定一个密钥(secret)。这个密钥只有服务器才知道,不能泄露给用户。然后,使用 Header 里面指定的签名算法(默认是 HMAC SHA256),按照下面的公式产生签名。
同 HTTP 中的公钥密钥知识
参考文章:JSON Web Token 入门教程
基于jsonwebtoken(JWT) 的web认证 (Node版实现)
nodejs 基于token的身份验证
JSON Web Token 简介相关推荐
- JWT(JSON Web Token)简介及实现
JWT(JSON Web Token):是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间作为Json对象安全地传输信息.由于此信息是经过数字签名的,因此可以被验证和信 ...
- JWT(JSON Web Token)简介
文章目录 一.JWT是什么 二.跨域认证问题 三.JWT原理 四.JWT数据结构 1.header(头部) 2.Payload(负载) 3.Signature 五.JWT是如何工作的 一.JWT是什么 ...
- 用户鉴权、JWT(JSON Web Token)是什么?
什么是用户鉴权 用户鉴权,一种用于在通信网络中对试图访问来自服务提供商的服务的用户进行鉴权的方法.用于用户登陆到DSMP或使用数据业务时,业务网关或Portal发送此消息到DSMP,对该用户使用数据业 ...
- SpringBoot 2.x 使用 JWT(JSON Web Token)
一.跨域认证遇到的问题 由于多终端的出现,很多的站点通过 web api restful 的形式对外提供服务,采用了前后端分离模式进行开发,因而在身份验证的方式上可能与传统的基于 cookie 的 S ...
- 在吗?认识一下JWT(JSON Web Token) ?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:是虎子呀 地址:my.oschina.net/u/4062 ...
- JWT(JSON Web Token)自动延长到期时间
本文翻译自:JWT (JSON Web Token) automatic prolongation of expiration I would like to implement JWT-based ...
- JSON Web Token - 在Web应用间安全地传递信息
JSON Web Token(JWT)是一个非常轻巧的规范.这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息. 让我们来假想一下一个场景.在A用户关注了B用户的时候,系统发邮件给B用户, ...
- Python 生成 JWT(json web token) 及 解析方式
一.关于 jwt 的原理及概念可以自行在网络上搜索了解一下,这里推荐一篇写的比较好的博客 深入了解Json Web Token之概念篇 另附 JWT 的官方文档: https://jwt.io/int ...
- JSON WEB TOKEN(JWT)的分析
JSON WEB TOKEN(JWT)的分析 一般情况下,客户的会话数据会存在文件中,或者引入redis来存储,实现session的管理,但是这样操作会存在一些问题,使用文件来存储的时候,在多台机器上 ...
最新文章
- 你见过的最全面的python重点
- SQL反模式笔记17——用一条sql解决复杂问题
- golang 文件(文件打开,文件写入,文件读取,文件删除)的基本操作
- 1005 Spell It Right (20 分)——13行代码Ac
- linux线程(互斥锁、条件)
- IDEA插件之 CodeGlance
- SpringBoot2使用WebFlux函数式编程
- SAP License:SAP学习笔记-集成与核算
- Join a New Company
- ssh架构之hibernate(二)进阶学习
- 在我看来,代码审查就是在排大便...
- 【DL小结5】Transformer模型与self attention
- Rockchip Android12 Codec2 插件 多线程实现代码
- mcgs组态连接oracle数据库,昆仑通态专题(九):MCGS组态软件的实时数据库
- python任务栏都隐藏了_请问如何始终隐藏WINDOWS任务栏?
- 我的世界光影mod怎么用_国际版minecraft mod和光影教程
- 推荐一款低代码报表开发工具,操作类似Excel
- 【A Unified Model for Multi-class Anomaly Detection, NeurIPS 2022】
- win2003 64位 企业版 (win 2003_r2_enterprise_x64.iso)下载地址
- Markdown的使用之一:表格和公式