Json Web Token在前后端实践思考分析

Json Web Token在前后端实践思考分析

什么是Json Web Token(JWT)

JSON Web Token(JWT)是一种用于在两个实体之间安全传输消息的开放标准(RFC 7519)。JWT以JSON格式编码数据,可以安全地存储在URL参数、POST参数、HTTP标头或Cookie中。JWT包括三个部分:头部,载荷和签名,最终生成的JWT字符串通常具有三段式的形式 xxx.yyy.zzz。其中XXX表示这个头部,YYY表示这个载荷,而ZZZ则表示签名。

JWT的使用场景

JWT通常用于Web应用程序和API接口的设计中,用于身份验证和授权。 在用户成功登录后,JWT会生成并发送到客户端,客户端可以将JWT存储在Cookie或localStorage中,并在每次向服务器发送请求时将JWT包含在请求头或其他需要的地方。 服务器在接收到请求时,会验证JWT是否合法并取出其中的信息,以确定用户是否可以访问被请求的资源。

JWT的优缺点

优点

  1. 减轻服务器压力:JWT自包含,自描述,可以包含用户身份信息,减少服务器查询DB的次数。
  2. 跨域传输:JWT 在预设的几个重要参数中没有存储服务端的IP和端口,可随意在各个服务间流通传递。
  3. 安全性好:JWT 中包含了签名信息,保证了传输过程中信息的不被篡改和窃听。

缺点

  1. 可以被窃取:如果JWT被不法分子拦截,那么该分子拥有的就是这个用户的全部身份信息了。
  2. JWT中的算法可能会引起安全性问题: 目前 JWT 中使用最多的几个算法就是 HMAC SHA256 和 RS256,使用不当,轻则会导致 JWT 被轻易破解,严重的话还会影响服务端的安全性。

JWT的实现思路

在实际应用中,JWT的应用通常会按照以下流程进行:

  1. 用户使用用户名密码登录
  2. 服务器验证用户名密码,生成JWT并返回到客户端
  3. 客户端将JWT存储在Cookie或localStorage中
  4. 在每次向服务器发送请求时,客户端将JWT包含在请求头或其他需要身份验证的地方
  5. 服务器通过验证JWT的签名和有效期,取出其中的信息并判断用户是否有权限访问被请求的资源

下面,我们详细介绍如何在前后端中使用JWT。

在前端中使用JWT

生成JWT

前端生成JWT一般使用 JS库 jsonwebtoken 。示例代码如下所示:

const jwt = require('jsonwebtoken');
const secret = 'my_secret_key'; // 这个 key 不能被泄露出去
const payload = { username: 'admin' }; // 载荷,通常存储用户信息

const token = jwt.sign(payload, secret, { expiresIn: '1h' }); // 签发 JWT,设置过期时间为 1 小时
console.log(token); // 输出 JWT 字符串

存储JWT

前端可以将JWT【存储在Cookie中】或【存储在LocalStorage中】。这里以LocalStorage为例:

localStorage.setItem('my_token', token);

在每次请求中发送JWT

前端可以通过请求头的方式将JWT发送到服务器上。示例代码如下所示:

const xhr = new XMLHttpRequest();
xhr.open('GET', '/api/user');
xhr.setRequestHeader('Authorization', `Bearer ${localStorage.getItem('my_token')}`);
xhr.onreadystatechange = () => {
  if (xhr.readyState === 4 && xhr.status === 200) {
    console.log(JSON.parse(xhr.responseText));
  }
};
xhr.send();

在后端中使用JWT

验证JWT

服务器端通常会使用 Node.js】中间件库 express-jwt 验证JWT的有效性,示例代码如下所示:

const express = require('express');
const jwt = require('express-jwt');

const app = express();
const secret = 'my_secret_key';

app.use(
  jwt({
    secret,
    algorithms: ['HS256'],
  }).unless({
    path: ['/login'],
  })
);

app.get('/api/user', (req, res) => {
  console.log(req.user.username); // 输出用户名信息
  res.send(req.user);
});

app.listen(3000, () => {
  console.log('Server start at http://localhost:3000');
});

在上述代码中, jwt() 从请求中解析出JWT,然后验证签名的有效性,如果JWT验证通过,解码后的用户信息就被附加到请求的 req.user 属性中,下面路由中就可以使用 req.user 来访问用户的信息了。

生成JWT

服务器端生成JWT也可以使用上述 jsonwebtoken 库的 sign() 调用,示例代码如下所示:

const jwt = require('jsonwebtoken');
const secret = 'my_secret_key';
const payload = { username: 'admin' };
const token = jwt.sign(payload, secret, { expiresIn: '1h' });
res.send({ token });

总结

以上是JWT在前后端分别的实践思考分析。使用JWT可以有效地解决跨域通信问题,并提升数据安全性。当然,针对JWT本身的安全威胁,我们需要在使用前详尽地评估其是否合适自己的应用场景,严格按照规范调用API。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Json Web Token在前后端实践思考分析 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • 深入理解javascript的执行顺序

    深入理解JavaScript的执行顺序是编写优秀JavaScript代码的基础。JavaScript的执行顺序遵循一定的规则,理解这些规则可以帮助我们理解代码的执行顺序,避免出现错误。 1. 执行栈 在深入了解JavaScript的执行顺序之前,我们需要了解执行栈的概念。执行栈是一个存储函数调用的栈结构,当JavaScript代码执行的时候,函数调用会被依次…

    JavaScript 2023年5月18日
    00
  • JavaScript数组操作函数汇总

    让我来为您详细介绍 JavaScript 数组操作函数的常用方法。 JavaScript数组操作函数汇总 1. push() 作用:向数组末尾添加一个或多个元素,并返回新的长度。 语法:arr.push(element1, …, elementN) 示例: let arr = [1, 2, 3]; arr.push(4, 5); console.log(…

    JavaScript 2023年5月27日
    00
  • JavaScript实现cookie的操作

    下面是详细讲解 JavaScript 实现 Cookie 操作的攻略。 什么是 Cookie Cookie(中文翻译为“网页 Cookie”或者“浏览器 Cookie”)是网站为了辨别用户身份的一种标识,是存在用户本地终端上的数据。Cookie 是小型文本文件,由网站服务器发送给用户浏览器,浏览器会将其存储在本地,之后每次请求该网站时都会携带该 Cookie…

    JavaScript 2023年6月11日
    00
  • JavaScript使用Math.Min返回两个数中较小数的方法

    当需要比较两个数的大小时,可以使用JavaScript中的Math.Min()方法来获取两个数中的最小值。使用该方法非常简单,只需要向该方法传入两个数即可返回这两个数中的最小值。下面详细讲解使用Math.Min返回两个数中较小数的方法。 1. Math.Min方法的基本语法 Math.min(a, b); 其中a、b为需要比较的两个数,返回值为这两个数中的最…

    JavaScript 2023年6月10日
    00
  • js获取网页高度(详细整理)

    让我来详细讲解一下”js获取网页高度(详细整理)”的攻略。 什么是网页高度? 网页高度指的是整个网站页面的高度,包括html、body、以及网页中的所有内容和元素。在一些网站应用中,需要获取网页高度,以便于调整页面布局等操作。下面来介绍一些常用的获取网页高度的方法。 方法一:使用document.body.scrollHeight 使用javascript中…

    JavaScript 2023年6月11日
    00
  • CSS3+JavaScript实现翻页幻灯片效果

    下面是详细讲解“CSS3+JavaScript实现翻页幻灯片效果”的完整攻略。 简介 翻页幻灯片是一种常见的网页轮播图效果,可以用于网站的首页展示、图片展览等场景。这种效果通过CSS3的transition属性+JavaScript的事件绑定来实现。 前置条件 在实现这种效果之前,需要掌握以下知识:- HTML5和CSS3基础知识- JavaScript基础…

    JavaScript 2023年6月11日
    00
  • 基于Cesium实现拖拽3D模型的示例代码

    下面是关于基于Cesium实现拖拽3D模型的示例代码的攻略。 1. 引入相关依赖 为了使用Cesium,我们需要先将Cesium的JavaScript和CSS文件导入到页面当中。在这个示例中,我们使用的是Cesium 1.75版本,您可以在官方网站上下载相应版本的文件并引入到HTML文件中: <!–引入Cesium的CSS和JavaScript文件-…

    JavaScript 2023年6月11日
    00
  • ES6新语法之解构实践指南

    ES6新语法之解构实践指南 什么是解构 解构是一种从数组或对象中提取数据的方式,它允许我们将属性或元素提取到不同的变量中。ES6中,我们可以通过解构来轻松地获取对象或数组中的属性或元素。 解构对象 解构一个对象意味着将对象的属性值复制到一个变量中。这是通过使用花括号和变量名称来完成的。 const person = { firstName: ‘John’, …

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部