JWT 认证方案学习

定义

JWT (JSON WEB TOKEN) 是一种安全通讯标准,它定义了一种紧凑自包含的方式,用于在各方之间安全的传输 JSON 对象。常见应用场景是API之间的认证通讯。

一般的用户认证流程

1、请求方发送账户密码到服务器,验证账户可用性。
2、验证成功,生成 session,保存在服务端。
3、服务端返回一个 session ID, 保存在客户端 cookie 中。
4、客户端请求时携带 cookie。
5、服务器解析 cookie 中携带的 session ID,验证通过后返回响应数据。

以上流程核心是基于 session 进行状态管理,这样的认证方案有以下问题:

1、客户端如果禁用 cookie,将无法维持请求的身份验证状态。
2、分布式部署的环境中,需要考虑多机 session 的一致性。
3、请求会产生跨域问题。

JWT 原理

服务器和客户端之间的通讯信息完全采用 json 传递,不需要使用 session 进行状态维持。

  • JWT 的格式包含三个部分
    1、头部(Header),描述 JWT 的元数据,通常由令牌类型和加密用到签名算法组成,例如
1{ 2 "alg": "HS256", #加密方式 3 "typ": "JWT" #令牌类型 4}

2、载荷(Payload),信息传输的主要内容,包含

  • 注册信息,包含 iss(发出者),exp(到期时间),sub(主题),aud(受众)
  • 公共信息,官方定义的其它的字段,因为 JWT 默认不是加密的,任何人都可以读取到公共信息,所以不要把敏感数据放到这里
  • 私有信息,平台间协定的私有字段
1{ 2 "sub": "1234567890", 3 "name": "John Doe", 4 "admin": true 5}

3、签名(Signature),根据头部和载荷,加盐后根据头部指定算法生成

1HMACSHA256( 2 base64UrlEncode(header) + "." + 3 base64UrlEncode(payload), 4 secret)

头部和载荷根据算法 Base64URL 进行转换,结合签名按顺序以”.“拼接形成 JWT 。

jwt.png

JWT 的用法

当客户端根据凭证成功登陆时,服务器将返回 JWT,客户端每次访问都应该携带 JWT,可以将放入cookie,但存在跨域问题,好的解决方式是加入 HTTP 请求头 Authorization 中

Authorization: Bearer <token> 
JWT 的特点

1、JWT 脱离了 session 的束缚,服务端不需要再维持 session 状态,但也无法控制 token 的状态了,JWT 一旦签发,在到期之前始终有效,除非服务器有额外的验证逻辑。
2、JWT 可以很方便的支持跨域。
3、JWT 本身包含了验证信息,如果发生泄漏,任何人都可以使用令牌的权限进行请求。
4、JWT 本身不加密,需要通过更安全的 HTTPS 协议传输。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )