https://www.qikegu.com/easy-understanding/892

JWT

基于token的用户认证原理:让用户输入账号和密码,认证通过后获得一个token(令牌),在token有效期里用户可以带着token访问特定资源。

开始token并没有一个统一标准,大家都各自使用自己的方案。后来出现了JWT(Json Web Token)这个标准。

JWT本质上是一个对JSON对象加密后的字符串。当服务器认证用户通过后,一个包含用户信息的json对象被加密后返回给用户,json对象:

{
"UserName": "老王",
"Role": "admin",
"Expire": "2019-01-10 20:10:00"
}

之后,用户访问服务器时,都要返回这个json对象。服务器只靠这个对象就可以识别用户身份,不需要再去查数据库。为了防止用户篡改数据,服务器在生成对象时将添加一个签名。

服务器不保存任何会话数据,也就是说,服务器变得无状态,从而更容易扩展。

JWT的结构

典型的JWT由三个部分组成,每个部分由一个点(.)分隔。

  • Header
  • Payload
  • Signature
header.payload.signature

Header

头部包含所使用的签名算法和令牌的类型(即JWT),这部分会被编码为Base64URL格式。

{
"alg": "HS256",
"typ": "JWT"
}

Base64URL的格式:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

Base64URL

Base64编码后可能出现字符+和/,在URL中不能直接作为参数,Base64URL就是把字符+和/分别变成-和_。JWT有可能放在url中,所以要用Base64URL编码。

Payload

Playload包含实际要传输的信息,附带一些其他信息如过期时间、发行时间等。JWT指定了一些官方字段(claims)备用:

  • iss: 签发人
  • exp: 过期时间
  • iat: 签发时间
  • nbf: 生效时间
  • jti: 编号
  • sub: 主题
  • aud: 受众

除了官方字段,在这个部分还可以添加私有字段,例如:

{
"sub": "1234567890",
"name": "隔壁老王",
"iat": 1516239022
}

这部分也是Base64URL编码的:

eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IumalOWjgeiAgeeOiyIsImlhdCI6MTUxNjIzOTAyMn0

Signature

Signature部分是对前两部分的防篡改签名。将Header和Payload用Base64URL编码后,再用点(.)连接起来。然后使用签名算法和密钥对这个字符串进行签名:

signature = hmac_sha256(base64encode(header) + '.' + base64encode(payload), 'MY_SUPER_SECRET_KEY')

这个密钥(MY_SUPER_SECRET_KEY)只有服务器才知道,不能泄露给用户。

签名信息:

huj1R4oYsSxbIpecRwGcDBzqFkL9dXA88P2ouM5xhT8

组合在一起

3部分组合在一起,构成了完整的jwt:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IumalOWjgeiAgeeOiyIsImlhdCI6MTUxNjIzOTAyMn0.huj1R4oYsSxbIpecRwGcDBzqFkL9dXA88P2ouM5xhT8

JWT怎么用

浏览器接收到服务器发过来的jwt后,可以存储在Cookie或localStorage中。

之后,浏览器每次与服务器通信时都会带上JWT。可以将JWT放在Cookie中,会自动发送(不跨域),或将JWT放在HTTP请求头的授权字段中。

Authorization: Bearer <token>

也可放在url中,或POST请求的数据体中。

注意

  • JWT默认是不加密的,但也可以加密,不加密时不宜在jwt中存放敏感信息
  • 不要泄露签名密钥(MY_SUPER_SECRET_KEY)
  • jwt签发后无法撤回,有效期不宜太长
  • JWT泄露会被人冒用身份,为防止盗用,JWT应尽量使用https协议传输

5分钟搞懂:JWT(Json Web Token)的更多相关文章

  1. 如何在SpringBoot中集成JWT(JSON Web Token)鉴权

    这篇博客主要是简单介绍了一下什么是JWT,以及如何在Spring Boot项目中使用JWT(JSON Web Token). 1.关于JWT 1.1 什么是JWT 老生常谈的开头,我们要用这样一种工具 ...

  2. Java JWT: JSON Web Token

    Java JWT: JSON Web Token for Java and Android JJWT aims to be the easiest to use and understand libr ...

  3. JWT(JSON Web Token) 【转载】

    JWT(JSON Web Token) 什么叫JWTJSON Web Token(JWT)是目前最流行的跨域身份验证解决方案. 一般来说,互联网用户认证是这样子的. 1.用户向服务器发送用户名和密码. ...

  4. [更新]一份包含: 采用RSA JWT(Json Web Token, RSA加密)的OAUTH2.0,HTTP BASIC,本地数据库验证,Windows域验证,单点登录的Spring Security配置文件

    没有任何注释,表怪我(¬_¬) 更新: 2016.05.29: 将AuthorizationServer和ResourceServer分开配置 2016.05.29: Token获取采用Http Ba ...

  5. ( 转 ) 什么是 JWT -- JSON WEB TOKEN

    什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点 ...

  6. 关于JWT(Json Web Token)的思考及使用心得

    什么是JWT? JWT(Json Web Token)是一个开放的数据交换验证标准rfc7519(php 后端实现JWT认证方法一般用来做轻量级的API鉴权.由于许多API接口设计是遵循无状态的(比如 ...

  7. 什么是JWT(Json Web Token)

    什么是 JWT (Json Web Token) 用户认证是计算机安全领域一个永恒的热点话题. JWT 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519). 该to ...

  8. API安全验证之JWT(JSON WEB TOKEN) OLCMS

    假如www.olcms.com/getUserInfo获取用户信息,你怎么知道当前用户是谁?有人说登陆时候我把他UID写入session了,如果是API接口,没有session怎么办,那么就需要把UI ...

  9. JWT(Json Web Token)认证

    目录 JWT(Json Web Token) JWT的数据结构 JWT的用法 JWT验证流程

随机推荐

  1. Python学习第六课——基本数据类型一之tuple and dict

    元组 (tuple) tu=(11,22,(123,456),[22,55],) # 一般定义元组的时候最后面加一个, # 元组不能被修改或者删除 v = tu[0] # 也可以根据索引取值 prin ...

  2. 二、spring集成ibatis进行数据源事务管理拦截器环境配置

    1.dataSource-applicationContext.xml文件配置理解:(spring1.2.8+ibatis1.5.3)1.1)配置数据源 DriverManagerDataSource ...

  3. 全文索引-ElasticSearch

    ElasticSearch 官方文档 Elasticsearch是一个开源的搜索引擎,建立在一个全文搜索引擎库Apache Lucene™基础之上. Lucene可以说是当下最先进,高性能,全功能的搜 ...

  4. 图解jvm--(一)jvm内存结构

    jvm内存结构 1.程序计数器 1.1 定义 Program Counter Register 程序计数器(寄存器) 作用,记住下一条jvm指令的执行地址 特点 是线程私有的 (唯一)不会存在内存溢出 ...

  5. Java HotSpot(TM) Client VM 与 server VM 的配置

    在Linux 6.5 下安装Elasticsearch 出现错误: JVM is using the client VM [Java HotSpot(TM) Client VM] but should ...

  6. 如何使用Docker部署PHP开发环境

    本文主要介绍了如何使用Docker构建PHP的开发环境,文中作者也探讨了构建基于Docker的开发环境应该使用单容器还是多容器,各有什么利弊.推荐PHP开发者阅读.希望对大家有所帮助. 环境部署一直是 ...

  7. 093、Java中String类之字符串是匿名对象

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  8. Vue方法中修改数组某一项元素而不能响应式更新

    <template> <div> <ul> <li v-for="(item, i) in ms" :key="i"& ...

  9. 15 SQL中的安全问题

    SQL中的安全问题     1.SQL注入         demo1:             SELECT * FROM user WHERE username = ? AND password ...

  10. CC3200 飞行计划

    CC3200 飞行计划 2016-01-25 CC3200 资源 CC3200_JTAG调试 CC3200-Uniflash 烧写程序 Mosquitto搭建MQTT 服务器 [示例] CC3200_ ...