讲述JSON Web Token(概念)

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 讲述JSON Web Token(概念)

JSON Web Tokens是目前最流行的跨域认证解决方案,在集群环境下使得用户的认证变得简单,解放了实现服务器间session共享的复杂逻辑。



工作原理:

JWT在服务器认证后生成包含用户信息,时间时间,安全信息等内容组成的JSON对象来唯一表示当前用户状态,在其后的数据交互中持续携带来表明请求的有效性。


数据结构:

JWT是有header,payload和signature三部分通过“.”连接起来的字符串,在JWT字符

串中没有换行


Header(头部):

header是一个JSON对象,用来描述一些元数据,示例如下:

{
  "alg": "HS256",
  "typ": "JWT"
}
复制代码
上述示例中指明了使用的验签加密算法为“HmacSHA256”,“HS256”为简写内容,令牌类型固定使用“JWT”即可,在进行生成验签的时候需要使用Base64Url进行编码处理,相对于Base64编码的好处是对“=”,“+”,“/”进行了相对应的处理(=被省略、+替换成-,/替换成_),可以放心的在Url上进行拼接,你是否在Url上挂Base64编码后的参数导致解析失败的时候呢?你是不是也是自己“replace”搞定的,下次就用Base64Url吧。
复制代码

Payload(负载):

payload的格式要求同header,内容主要官方定义字段+自定义的字段来满足业务场景的需要,示例如下:

{
  "nbf": 1636438632, // 生效时间
  "exp": 1637438632, // 过期时间
  "jti": "", // 编号
  "aud": "", // 受众
  "sub": "", // 主题
  "iat": "", // 签发时间
  "iss": "", // 签发人
  "name": "",
  "userid": "",
  "companyid": "",
}
复制代码
上述示例中有备注的为官方定义的字段,未进行备注的未自定义的扩展字段,在生成验签时与header的处理方式相同。
复制代码

Signature(签名):

上述的“Header”和“Payload”都没有提到加密一说,只是进行的字符的编码,所以在“Header”和“Payload”中我们不应该放置一些用户相关的涉及安全的信息,未防止上述两块的内容被中间商拦截篡改,我们需要用到这一段落要提到的“Signature”,具体的加密格式如下:

signature = HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
secret)
复制代码


在这提供在nodejs环境中的实现函数:


  1. 将“Header”和“Payload”分别转为字符串后通过“base64url”进行编码处理并通过“.”进行连接。
  2. 通过“crypto-js”提供的加密函数“HmacSHA256”进行加密并转为16进制(按需处理即可)表示。
  3. 生成验签后我们通过“.”拼接原有的“text”部分组成最终的JWT字符串。
// https://www.npmjs.com/package/crypto-js
// https://cryptojs.gitbook.io/docs/
const CryptoJS = require('crypto-js');
const base64url = require('base64url');
function createJWTString(secret = "", header = {}, payload = {}) {
    const text = base64url(JSON.stringify(header)) + "." + base64url(JSON.stringify(payload));
    const words = CryptoJS.HmacSHA256(text, secret);
    let signature = CryptoJS.enc.Hex.stringify(words);
    return `${text}.${signature}`;
}
复制代码


使用方式:

标准的使用方式为在HTTP的头部增加key为“Authorization”,value为:“ Bearer ”的一组信息,token的具体存储按实际业务处理。


注意事项:

  1. JWT默认不加密,但可以自行加密处理。
  2. 采用默认不加密的情况,请勿将涉密数据放入JWT中。
  3. 建议采用HTTPS来防止中间人攻击。



相关文章
|
28天前
|
存储 JSON 安全
如何使用 JSON Web Tokens 进行身份验证?
总的来说,JWT 是一种强大而灵活的身份验证方式,通过正确使用和管理,可以为应用提供可靠的身份验证机制,同时提高系统的可扩展性和安全性。在实际应用中,需要根据具体的需求和场景,合理设计和实施 JWT 身份验证方案。
111 63
|
4月前
|
XML JSON 前端开发
【Web前端揭秘】XML与JSON:数据界的双雄对决,你的选择将如何改写Web世界的未来?
【8月更文挑战第26天】本文深入探讨了XML和JSON这两种广泛使用的数据交换格式在Web前端开发中的应用。XML采用自定义标签描述数据结构,适用于复杂层次数据的表示,而JSON则以键值对形式呈现数据,更为轻量且易解析。通过对两种格式的示例代码、结构特点及应用场景的分析,本文旨在帮助读者更好地理解它们的差异,并根据实际需求选择最合适的数据交换格式。
70 1
|
4月前
|
JSON 前端开发 JavaScript
|
2月前
|
存储 JSON 前端开发
JSON与现代Web开发:数据交互的最佳选择
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也便于机器解析和生成。它以文本格式存储数据,常用于Web应用中的数据传输,尤其是在客户端和服务器之间。
79 0
|
4月前
|
前端开发 JavaScript 数据可视化
Python+Dash快速web应用开发——基础概念篇
Python+Dash快速web应用开发——基础概念篇
|
4月前
|
存储 安全 搜索推荐
深入探讨Session和Cookie的概念、用途以及如何在Java Web开发中有效地使用它们进行用户状态管理。
在Java Web开发中,Session和Cookie是管理用户状态的核心技术。Session存储于服务器端,通过唯一的Session ID识别用户,确保数据安全与隐私;Cookie则存储于客户端,用于记录用户偏好等信息。两者各有优势:Session适合存储敏感数据,但需合理管理避免资源浪费;Cookie便于持久化存储,但在安全性上需谨慎设置。开发者可通过Servlet API轻松操作二者,实现个性化用户体验与应用性能优化。
72 2
|
4月前
|
Java Docker 微服务
微服务架构的概念、特点以及如何在Java Web开发中实现微服务。
微服务架构的概念、特点以及如何在Java Web开发中实现微服务。
105 1
|
4月前
|
存储 JSON JavaScript
震撼!Cookie、Session、Token、JWT 终极对决:揭开 Web 认证的神秘面纱!
【8月更文挑战第13天】Web 开发中,Cookie、Session、Token 和 JWT 常混淆。Cookie 是服务器给客户端的小信息片,如登录状态,每次请求都会返回。Session 则是服务器存储的用户数据,通过 Session ID 追踪。Token 类似通行证,证明客户端身份且可加密。JWT 是结构化的 Token,含头部、载荷及签名,确保数据完整性和安全性。
75 4
|
4月前
|
JSON JavaScript 前端开发
Unexpected token u in JSON at position 0
这篇文章解释了JavaScript中"Unexpected token u in JSON at position 0"错误的常见原因,通常是由于尝试解析undefined变量导致的,并建议检查是否有变量在JSON.parse()执行时未赋值或值为undefined。
Unexpected token u in JSON at position 0
|
4月前
|
Java Spring 容器
彻底改变你的编程人生!揭秘 Spring 框架依赖注入的神奇魔力,让你的代码瞬间焕然一新!
【8月更文挑战第31天】本文介绍 Spring 框架中的依赖注入(DI),一种降低代码耦合度的设计模式。通过 Spring 的 DI 容器,开发者可专注业务逻辑而非依赖管理。文中详细解释了 DI 的基本概念及其实现方式,如构造器注入、字段注入与 setter 方法注入,并提供示例说明如何在实际项目中应用这些技术。通过 Spring 的 @Configuration 和 @Bean 注解,可轻松定义与管理应用中的组件及其依赖关系,实现更简洁、易维护的代码结构。
61 0

热门文章

最新文章

下一篇
DataWorks