什么是 JWT -- JSON WEB TOKEN

Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。

起源

说起JWT,我们应该来谈一谈基于token的认证和传统的session认证的区别。

基于token的鉴权机制

基于token的鉴权机制类似于http协议也是无状态的,它不需要在服务端去保留用户的认证信息或者会话信息。这就意味着基于token认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利。

流程上是这样的:

  • 用户使用用户名密码来请求服务器

  • 服务器进行验证用户的信息

  • 服务器通过验证发送给用户一个token

  • 客户端存储token,并在每次请求时附送上这个token值

  • 服务端验证token值,并返回数据

这个token必须要在每次请求时传递给服务端,它应该保存在请求头里, 另外,服务端要支持CORS(跨来源资源共享)策略,一般我们在服务端这么做就可以了Access-Control-Allow-Origin: *

那么我们现在回到JWT的主题上。

JWT长什么样?

JWT是由三段信息构成的,将这三段信息文本用.链接一起就构成了Jwt字符串。就像这样:

fetch('api/user/1', {  headers: {    'Authorization': 'Bearer ' + token  }})

服务端会验证token,如果验证通过就会返回相应的资源。整个流程就是这样的:

 
jwt-diagram

总结

优点

  • 因为json的通用性,所以JWT是可以进行跨语言支持的,像JAVA,JavaScript,NodeJS,PHP等很多语言都可以使用。

  • 因为有了payload部分,所以JWT可以在自身存储一些其他业务逻辑所必要的非敏感信息。

  • 便于传输,jwt的构成非常简单,字节占用很小,所以它是非常便于传输的。

  • 它不需要在服务端保存会话信息, 所以它易于应用的扩展

缺点:也是自解析,服务器端无法对token管理、注销、刷新、有效期延长。举个例子,我发现账号可能被盗了,于是去修改密码,但是修改了密码后原jwt还是能够畅通无阻。为了解决这个问题,服务器端依然会持久化token,一旦持久化token,那么就没必要用jwt了,jwt第三段和他的加密证书那套就显得多余。

安全相关

  • 不应该在jwt的payload部分存放敏感信息,因为该部分是客户端可解密的部分。

  • 保护好secret私钥,该私钥非常重要。

  • 如果可以,请使用https协议

(0)

相关推荐

  • 第 82 天:Python Web 开发之 JWT 简介

    在之前的课程中,介绍过 Flask-Login 框架,它是基于 Session 和 Cookie 技术来实现用户授权和验证的,不过 Session 有很多的局限性,这一节介绍一种基于 token 的验 ...

  • Cookie、Session、Token 的区别

    首先我们来说一下认证(Authentication): 通俗的来说认证就是 验证当前用户的身份.例如,你上班打卡,为了防止你作弊,就需要你用到你的指纹来打卡,如果打卡系统里面的指纹和你的指纹匹配,那就 ...

  • 单体应用到分布式再到微服务,用户认证和授权机制的演进史

    Web应用和用户的身份验证息息相关,从单一服务器架构到分布式服务架构再到微服务架构,用户安全认证和授权的机制也一直在演进,下文对各个架构下的认证机制做个总结. 单一服务器架构 该架构下后端只有一台服务 ...

  • 认证授权基础

    认证授权基础

  • JSON Web Token 入门教程

    JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案,本文介绍它的原理和用法. 一.跨域认证的问题 互联网服务离不开用户认证.一般流程是下面这样. 1.用户向服务器发送用户名和密 ...

  • JWT(Json Wen Token)原理剖析

    JWT(即json web token),大家先看下面这张图 大家可以观察到,jwt String就是生成后的jwt字符集,其中有两个 "."(注意:jwt校验会对".& ...

  • python jwt-用于生成和验证JSON Web令牌的python模块

    JSON Web令牌(JWT)是一种紧凑的,URL安全的方法,用于表示要在两方之间转移的声明.JWT中的声明被编码为JSON对象,用作JSON Web签名(JWS)结构的有效负载或JSON Web加密 ...

  • pyjwt-用于实现JSON Web令牌的python库

    pyjwt是用于实现JSON Web令牌的python库. FAQ 1.如何从x509证书中提取公钥/私钥? load_pem_x509_certificate()from的功能cryptograph ...

  • Web 开发必须掌握的三个技术:Token、Cookie、Session

    WEB前端开发社区 1周前 在Web应用中,HTTP请求是无状态的.即:用户第一次发起请求,与服务器建立连接并登录成功后,为了避免每次打开一个页面都需要登录一下,就出现了cookie,Session. ...

  • jmeter压测学习3-提取json数据里面的token参数关联

    前言 现在很多接口的登录是返回一个json数据,token值在返回的json里面,在jmeter里面也可以直接提取json里面的值. 上一个接口返回的token作为下个接口的入参. 案例场景 我现在有 ...

  • Cypress web自动化18-cypress.json文件配置baseUrl

    前言 当我们测试一个web网站的时候,一般最好设置一个baseUrl地址,这样方便维护. 一旦部署环境发生了改变,就不需要去基本里面去查找,秩序更改cypress.json文件即可 cypress.j ...

  • Web开发应该学习的Token登录认证知识

    chrisghb Web开发 3天前 来自:简书,作者:chrisghb 链接:https://www.jianshu.com/p/a32634a5170c 基于 Cookie/Session 的认证 ...

  • 现代Web中的JSON劫持

    WEB前端开发社区 1周前 Benjamin Dumke-von der Ehe发现了一个有趣的跨域窃取数据的方法.他使用JS proxies(JS代理)创建了一个可以窃取未定义的JavaScript ...